diff --git a/.editorconfig b/.editorconfig
index a45bfa8c4b42..52065f8fe269 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,5 +11,5 @@ indent_style = space
indent_size = 4
trim_trailing_whitespace = true
-[{package.json,*.yml}]
+[{*.json,*.yml}]
indent_size = 2
diff --git a/.env.example b/.env.example
index be0753dc3ffb..0ed277fe8322 100644
--- a/.env.example
+++ b/.env.example
@@ -1,10 +1,13 @@
APP_ENV=production
APP_DEBUG=false
APP_URL=http://localhost
+APP_TIMEZONE=UTC
APP_KEY=
+DEBUGBAR_ENABLED=false
DB_DRIVER=mysql
DB_HOST=localhost
+DB_UNIX_SOCKET=null
DB_DATABASE=cachet
DB_USERNAME=homestead
DB_PASSWORD=secret
@@ -37,3 +40,5 @@ GITHUB_TOKEN=null
NEXMO_KEY=null
NEXMO_SECRET=null
NEXMO_SMS_FROM=Cachet
+
+TRUSTED_PROXIES=
diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000000..98caa82825ca
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at james@alt-three.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 000000000000..ccf9365d7aad
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,94 @@
+# Contribution Guidelines
+
+## Thank you
+
+Firstly, thank you for taking an interest in Cachet and for reading this guide.
+
+## Creating issues
+
+We track feature requests and bug reports on the [issue tracker](https://github.com/cachethq/Cachet/issues). Please send support requests to our support email; [support@alt-three.com](mailto:support@alt-three.com?subject=Cachet%20Support).
+
+**Always be respectful.** Organisation members reserve the right to lock topics if they feel necessary.
+
+## Languages
+
+This project accepts **English translations** only. Translations will be updated automatically through the [CrowdIn](https://translate.cachethq.io) integration.
+
+Please submit alternative translations to the [Cachet CrowdIn](https://translate.cachethq.io) project. CrowdIn will automatically send a Pull Request with your updates in.
+
+## Coding Standards
+
+Please try to follow existing coding standards. [StyleCI](https://styleci.io) will analyse and fix any discrepancies in coding standards.
+
+## Introduction into Git and GitHub
+
+If you are new to Git, GitHub and the whole open source software community, welcome! Here are some resources for getting started and understanding what it's all about.
+
+- [Try Git](https://try.github.io/levels/1/challenges/1) by Code School
+- [GitHub Help](https://help.github.com)
+
+If you're not fond of the command line, you can get one of GitHub's free GUI desktop apps:
+
+- [GitHub for Mac](https://github.com/blog/1510-installing-git-from-github-for-mac)
+- [GitHub for Windows](https://github.com/blog/1127-github-for-windows)
+
+If you're feeling adventurous, you can become a Git & GitHub master with the [Git Path on Code School](https://www.codeschool.com/paths/git).
+
+## .editorconfig
+
+You should also make use of the [.editorconfig](/.editorconfig) file found within the root of the repository. It'll make sure that your editor is setup with the same file settings.
+
+## Ways to help:
+
+Start by becoming familiar with Cachet. If you're already using Cachet, that's a great head start. If not, check out the latest [demo](https://dev.cachethq.io) and have a play. You can also download and install Cachet locally to familiarise yourself that way.
+
+You don't have to be a developer to help improve Cachet, infact there are lots of ways that you can help us.
+
+### Spread the word
+
+There are a lot of people who don't know about Cachet or what a status page is and how important it can be. [Tweet about Cachet](https://twitter.com/CachetHQ). Write blog posts about your success (or failures, we're not perfect) with Cachet and share what you took away from it.
+
+### Help with Documentation
+
+Cachet is in use around the world. Cachet speaks multiple languages. Our documentation doesn't and can be hard to understand for non-English speaking people. Documentation should be easy to understand and we need your help to make this possible. Check out [CachetHQ/Docs](https://github.com/CachetHQ/Docs) to contribute to our documentation.
+
+### As a non-developer/non-designer
+
+We're always looking for new [translations](#translations).
+
+Of course bug reports, feature requests and [documentation](https://docs.cachethq.io) are always appreciated.
+
+### As a designer
+
+As Cachet gains new features, the design and ideas that were once a perfect fit need updating and in some cases designing from scratch. This is where you come in! Fancy giving Cachet a lick of paint? Sweet!
+
+You'll need to install Node.js with NPM or Yarn.
+
+To get started you can do the following:
+
+1. Install Node.js and our dev dependencies.
+2. Run `npm run dev`
+3. Make your changes to the SCSS files in `./resources/assets/sass/`
+
+If you're making a lot of changes, you'll find that running `npm run watch` will make life easier for you!
+
+When you're happy with your changes, please run `npm run prod` to minify the assets.
+
+### As a developer
+
+Built using [Laravel](https://laravel.com).
+
+We use these extra dependencies to develop Cachet:
+
+- Node.js
+- NPM or Yarn
+- Composer
+- Git
+
+Once cloned to your local machine, you'll need some demo data! Run `php artisan cachet:seed` to get the demo installation ready for action.
+
+### #YOLO JUST SUBMIT A PR
+
+_A great idea taken from https://github.com/metabase/metabase/blob/master/docs/contributing.md#yolo-just-submit-a-pr._
+
+> If you come up with something really cool, and want to share it with us, just submit a PR. If it hasn't gone through the above process, we probably won't merge it as is, but if it's compelling, we're more than willing to help you via code review, design review and generally OCD nitpicking so that it fits into the rest of our codebase.
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000000..cb0cea613ced
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,5 @@
+# These are supported funding model platforms
+
+github:
+ - jbrooksuk
+ - cachethq
diff --git a/.gitignore b/.gitignore
index dd338bf405a9..96cbe1660fda 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,12 @@
/node_modules
+/public/hot
/public/storage
/storage/*.key
/vendor
+/.idea
+/.vagrant
+Homestead.json
+Homestead.yaml
+npm-debug.log
.env
-phpunit.xml
+package-lock.json
diff --git a/.travis.yml b/.travis.yml
index 93ff2125b067..8d0b77fd6958 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,19 +1,38 @@
language: php
-
-php:
- - 5.6
- - 7.0
- - 7.1
-
+dist: trusty
sudo: false
+branches:
+ except:
+ - l10n_2.3
+ - l10n_2.4
+
before_install:
- cp .env.example .env
- - if [[ $TRAVIS_PHP_VERSION != 7.1 ]] ; then phpenv config-rm xdebug.ini; fi
-
-install: travis_retry composer install --no-interaction --no-scripts --prefer-source --no-suggest
-notifications:
- email: false
+install:
+ - travis_retry composer install --no-interaction --no-suggest
-script: vendor/bin/phpunit
+jobs:
+ include:
+# - stage: Security check
+# script:
+# - phpenv config-rm xdebug.ini || true
+# - wget https://get.sensiolabs.org/security-checker.phar
+# - php security-checker.phar security:check ./composer.lock
+# php: 7.1
+ - stage: Unit tests
+ script:
+ - phpenv config-rm xdebug.ini || true
+ - vendor/bin/phpunit
+ php: 7.1
+ - stage: Unit tests
+ script:
+ - phpenv config-rm xdebug.ini || true
+ - vendor/bin/phpunit
+ php: 7.2
+ - stage: Unit tests
+ script:
+ - phpenv config-rm xdebug.ini || true
+ - vendor/bin/phpunit
+ php: 7.3
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 05530ec262df..000000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Contribution Guidelines
-
-## Creating issues
-
-We track feature requests and bug reports on the [issue tracker](https://github.com/cachethq/Cachet/issues). Please send support requests to our support email; [support@alt-three.com](mailto:support@alt-three.com?subject=Cachet Support).
-
-**Always be respectful.** Organisation members reserve the right to lock topics if they feel necessary.
-
-## Languages
-
-Please submit non-English translations to the [Cachet CrowdIn](https://translate.cachethq.io) project. This makes syncing translations much easier.
-
-## Coding Standards
-
-Please try to follow existing coding standards. [StyleCI](https://styleci.io) will analyse and fix any discrepancies in coding standards.
-
-## Introduction into Git and GitHub
-
-If you are new to Git, GitHub and the whole open source software community, welcome! Here are some resources for getting started and understanding what it's all about.
-
-- [Try Git](https://try.github.io/levels/1/challenges/1) by Code School
-- [GitHub Help](https://help.github.com)
-
-If you're not fond of the command line, you can get one of GitHub's free GUI desktop apps:
-
-- [GitHub for Mac](https://github.com/blog/1510-installing-git-from-github-for-mac)
-- [GitHub for Windows](https://github.com/blog/1127-github-for-windows)
-
-If you're feeling adventurous, you can become a Git & GitHub master with the [Git Path on Code School](https://www.codeschool.com/paths/git).
-
-## .editorconfig
-
-You should also make use of the [.editorconfig](/.editorconfig) file found within the root of the repository. It'll make sure that your editor is setup with the same file settings.
-
----
-
-## Contributing as a non-developer/non-designer
-
-We're always looking for new [translations](#translations).
-
-Of course bug reports, feature requests and [documentation](https://docs.cachethq.io) are always appreciated.
-
-## Contributing as a designer
-
-As Cachet gains new features, the design and ideas that were once a perfect fit need updating and in some cases designing from scratch. This is where you come in! Fancy giving Cachet a lick of paint? Sweet!
-
-You'll need to install Node.js, Bower and Gulp.
-
-To get started you can do the following:
-
-1. Install Node.js and our dev dependencies.
-2. Run `gulp`
-3. Make your changes to the SCSS files in `./resources/assets/sass/`
-
-If you're making a lot of changes, you'll find that running `gulp watch` will make life easier for you!
-
-When you're happy with your changes, please run `gulp --production` to minify the assets.
-
-## Contributing as a developer
-
-Built using [Laravel](https://laravel.com).
-
-We use these extra dependencies to develop Cachet:
-
-- Node.js
-- Gulp
-- Git
-
-Once cloned to your local machine, you'll need some demo data! Run `php artisan cachet:seed` to get the demo installation ready for action.
diff --git a/LICENSE b/LICENSE
index e791c2d7b7b7..43fbc47b55cb 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,12 +1,9 @@
-Copyright (c) 2015-2017 Alt Three Services Limited.
-All rights reserved.
+The MIT License (MIT)
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+Copyright (c) James Brooks
- 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
- 3. Neither the name of the Cachet nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index 6607b4946db2..3df32eda11ef 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,19 @@
-
-
-
-
-
-
-
+
+
+
+
-Cachet is a beautiful and powerful open source status page system.
+Cachet, the open-source status page system.
+
+## Cachet 3.x Announcement
-## Community
+We are shifting our attention and resources to Cachet 3.x and will no longer be supporting the 2.x version.
-You can now [join our Slack community!](http://cachethq-slack.herokuapp.com)
+For more information on the Cachet rebuild and our plans for 3.x, you can read the announcement [here](https://github.com/CachetHQ/Cachet/discussions/4342).
-## Overview
+## Features
- List your service components
- Report incidents
@@ -28,10 +27,10 @@ You can now [join our Slack community!](http://cachethq-slack.herokuapp.com)
## Requirements
-- PHP 5.5.9+ or newer
-- HTTP server with PHP support (eg: Apache, Nginx, Caddy)
+- PHP 7.1.3 – 7.3
+- HTTP server with PHP support (e.g.: Apache, Nginx, Caddy)
- [Composer](https://getcomposer.org)
-- A supported database: MySQL, PostgreSQL or SQLite
+- A supported database: MariaDB, MySQL, PostgreSQL or SQLite
## Installation, Upgrades and Documentation
@@ -39,26 +38,19 @@ You can find documentation at [https://docs.cachethq.io](https://docs.cachethq.i
Here are some useful quick links:
-- [Installing Cachet](https://docs.cachethq.io/docs/installing-cachet)
-- [Getting started with Docker](https://docs.cachethq.io/docs/get-started-with-docker)
+- [Installing Cachet](https://docs.cachethq.io/installation/)
+- [Getting started with Docker](https://docs.cachethq.io/installation/docker)
-### Demo Account
+### Demo
-To test out the demo, you may login to the [Dashboard](https://demo.cachethq.io/dashboard) with the following:
+To test out the demo, you can log in to the [Cachet dashboard](https://demo.cachethq.io/dashboard) with the following credentials:
-- **Username:** `test` or `test@test.com`
+- **Username:** `test` or `test@example.com`
- **Password:** `test123`
-> The demo resets every 30 minutes.
-
-## Translate Cachet
-
-If you'd like to contribute translations, please check out our [CrowdIn project](https://crowdin.com/project/cachet).
-
-## Professional Installation Service
-
-We offer a professional installation service. To find out more, email us at [support@alt-three.com](mailto:support@alt-three.com?Cachet%20Installation)
+> **Note**
+> The demo will automatically reset every 30 minutes.
## Security Vulnerabilities
-If you discover a security vulnerability within Cachet, please send an e-mail to us at support@alt-three.com. We handle all security vulnerabilities on a case-by-case basis.
+If you discover a security vulnerability within Cachet, please send an e-mail to [support@cachethq.io](mailto:support@cachethq.io?Cachet%20Security%20Vulnerability). All security vulnerabilities are reviewed on a case-by-case basis.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000000..5459a341d897
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,17 @@
+# Security Policy
+
+**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).**
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported |
+| ------- | ------------------ |
+| 2.4 | :white_check_mark: |
+| < 2.4 | :x: |
+
+## Reporting a Vulnerability
+
+If you discover a security vulnerability within Cachet, please email James Brooks at james@cachethq.io. All security vulnerabilities will be promptly addressed.
diff --git a/VERSION b/VERSION
index a724a9cd9094..005119baaa06 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.4.0-dev
+2.4.1
diff --git a/app/Bus/Commands/Component/CreateComponentCommand.php b/app/Bus/Commands/Component/CreateComponentCommand.php
index d2305fa989e5..4244f42cbc61 100644
--- a/app/Bus/Commands/Component/CreateComponentCommand.php
+++ b/app/Bus/Commands/Component/CreateComponentCommand.php
@@ -70,10 +70,17 @@ final class CreateComponentCommand
/**
* JSON meta data for the component.
*
- * @var string|null
+ * @var array|null
*/
public $meta;
+ /**
+ * Tags string.
+ *
+ * @var string
+ */
+ public $tags;
+
/**
* The validation rules.
*
@@ -81,13 +88,14 @@ final class CreateComponentCommand
*/
public $rules = [
'name' => 'required|string',
- 'description' => 'required|string',
+ 'description' => 'nullable|string',
'status' => 'required|int|min:0|max:4',
'link' => 'nullable|url',
'order' => 'nullable|int',
'group_id' => 'nullable|int',
'enabled' => 'nullable|bool',
- 'meta' => 'nullable|string',
+ 'meta' => 'nullable|array',
+ 'tags' => 'nullable|string',
];
/**
@@ -100,11 +108,12 @@ final class CreateComponentCommand
* @param int $order
* @param int $group_id
* @param bool $enabled
- * @param string|null $meta
+ * @param array|null $meta
+ * @param string|null $tags
*
* @return void
*/
- public function __construct($name, $description, $status, $link, $order, $group_id, $enabled, $meta)
+ public function __construct($name, $description, $status, $link, $order, $group_id, $enabled, $meta, $tags = null)
{
$this->name = $name;
$this->description = $description;
@@ -114,5 +123,6 @@ public function __construct($name, $description, $status, $link, $order, $group_
$this->group_id = $group_id;
$this->enabled = $enabled;
$this->meta = $meta;
+ $this->tags = $tags;
}
}
diff --git a/app/Bus/Commands/Component/UpdateComponentCommand.php b/app/Bus/Commands/Component/UpdateComponentCommand.php
index 6da4e02c0e5c..9909339754c1 100644
--- a/app/Bus/Commands/Component/UpdateComponentCommand.php
+++ b/app/Bus/Commands/Component/UpdateComponentCommand.php
@@ -25,59 +25,66 @@ final class UpdateComponentCommand
/**
* The component name.
*
- * @var string
+ * @var string|null
*/
public $name;
/**
* The component description.
*
- * @var string
+ * @var string|null
*/
public $description;
/**
* The component status.
*
- * @var int
+ * @var int|null
*/
public $status;
/**
* The component link.
*
- * @var string
+ * @var string|null
*/
public $link;
/**
* The component order.
*
- * @var int
+ * @var int|null
*/
public $order;
/**
* The component group.
*
- * @var int
+ * @var int|null
*/
public $group_id;
/**
* Is the component enabled?
*
- * @var bool
+ * @var bool|null
*/
public $enabled;
/**
* JSON meta data for the component.
*
- * @var string|null
+ * @var array|null
*/
public $meta;
+ /**
+ * The tags.
+ *
+ * @var string|null
+ */
+ public $tags;
+
/**
* If this is true, we won't notify subscribers of the change.
*
@@ -98,7 +105,7 @@ final class UpdateComponentCommand
'order' => 'nullable|int',
'group_id' => 'nullable|int',
'enabled' => 'nullable|bool',
- 'meta' => 'nullable|string',
+ 'meta' => 'nullable|array',
'silent' => 'nullable|bool',
];
@@ -106,29 +113,32 @@ final class UpdateComponentCommand
* Create a new update component command instance.
*
* @param \CachetHQ\Cachet\Models\Component $component
- * @param string $name
- * @param string $description
- * @param int $status
- * @param string $link
- * @param int $order
- * @param int $group_id
- * @param bool $enabled
- * @param string|null $meta
+ * @param string|null $name
+ * @param string|null $description
+ * @param int|null $status
+ * @param string|null $link
+ * @param int|null $order
+ * @param int|null $group_id
+ * @param bool|null $enabled
+ * @param array|null $meta
+ * @param string|null $tags
* @param bool $silent
*
* @return void
*/
- public function __construct(Component $component, $name, $description, $status, $link, $order, $group_id, $enabled, $meta, $silent)
+ public function __construct(Component $component, $name = null, $description = null, $status = null, $link = null, $order = null, $group_id = null, $enabled = null, $meta = null, $tags = null, $silent = null)
{
$this->component = $component;
$this->name = $name;
$this->description = $description;
- $this->status = (int) $status;
+ $this->status = $status;
$this->link = $link;
$this->order = $order;
$this->group_id = $group_id;
$this->enabled = $enabled;
$this->meta = $meta;
+ $this->tags = $tags;
$this->silent = $silent;
+ $this->tags = $tags;
}
}
diff --git a/app/Bus/Commands/Incident/CreateIncidentCommand.php b/app/Bus/Commands/Incident/CreateIncidentCommand.php
index ae8f5f97a1a6..4f94f2f890d6 100644
--- a/app/Bus/Commands/Incident/CreateIncidentCommand.php
+++ b/app/Bus/Commands/Incident/CreateIncidentCommand.php
@@ -96,6 +96,13 @@ final class CreateIncidentCommand
*/
public $template_vars;
+ /**
+ * Meta key/value pairs.
+ *
+ * @var array
+ */
+ public $meta = [];
+
/**
* The validation rules.
*
@@ -104,7 +111,7 @@ final class CreateIncidentCommand
public $rules = [
'name' => 'required|string',
'status' => 'required|int|min:0|max:4',
- 'message' => 'required|string',
+ 'message' => 'nullable|string',
'visible' => 'nullable|bool',
'component_id' => 'nullable|required_with:component_status|int',
'component_status' => 'nullable|required_with:component_id|int|min:0|max:4',
@@ -112,6 +119,7 @@ final class CreateIncidentCommand
'stickied' => 'required|bool',
'occurred_at' => 'nullable|string',
'template' => 'nullable|string',
+ 'meta' => 'nullable|array',
];
/**
@@ -128,10 +136,11 @@ final class CreateIncidentCommand
* @param string|null $occurred_at
* @param string|null $template
* @param array $template_vars
+ * @param array $meta
*
* @return void
*/
- public function __construct($name, $status, $message, $visible, $component_id, $component_status, $notify, $stickied, $occurred_at, $template, array $template_vars = [])
+ public function __construct($name, $status, $message, $visible, $component_id, $component_status, $notify, $stickied, $occurred_at, $template, array $template_vars = [], array $meta = [])
{
$this->name = $name;
$this->status = $status;
@@ -144,5 +153,6 @@ public function __construct($name, $status, $message, $visible, $component_id, $
$this->occurred_at = $occurred_at;
$this->template = $template;
$this->template_vars = $template_vars;
+ $this->meta = $meta;
}
}
diff --git a/app/Bus/Commands/Incident/UpdateIncidentCommand.php b/app/Bus/Commands/Incident/UpdateIncidentCommand.php
index 36036e6d9637..1328b37ca91a 100644
--- a/app/Bus/Commands/Incident/UpdateIncidentCommand.php
+++ b/app/Bus/Commands/Incident/UpdateIncidentCommand.php
@@ -106,6 +106,13 @@ final class UpdateIncidentCommand
*/
public $template_vars;
+ /**
+ * Meta key/value pairs.
+ *
+ * @var array
+ */
+ public $meta = [];
+
/**
* The validation rules.
*
@@ -122,6 +129,7 @@ final class UpdateIncidentCommand
'stickied' => 'nullable|bool',
'occurred_at' => 'nullable|string',
'template' => 'nullable|string',
+ 'meta' => 'nullable|array',
];
/**
@@ -139,10 +147,11 @@ final class UpdateIncidentCommand
* @param string|null $occurred_at
* @param string|null $template
* @param array $template_vars
+ * @param array $meta
*
* @return void
*/
- public function __construct(Incident $incident, $name, $status, $message, $visible, $component_id, $component_status, $notify, $stickied, $occurred_at, $template, array $template_vars = [])
+ public function __construct(Incident $incident, $name, $status, $message, $visible, $component_id, $component_status, $notify, $stickied, $occurred_at, $template, array $template_vars = [], array $meta = [])
{
$this->incident = $incident;
$this->name = $name;
@@ -156,5 +165,6 @@ public function __construct(Incident $incident, $name, $status, $message, $visib
$this->occurred_at = $occurred_at;
$this->template = $template;
$this->template_vars = $template_vars;
+ $this->meta = $meta;
}
}
diff --git a/app/Bus/Commands/IncidentUpdate/CreateIncidentUpdateCommand.php b/app/Bus/Commands/IncidentUpdate/CreateIncidentUpdateCommand.php
index 048465b8f8d0..caa65a757975 100644
--- a/app/Bus/Commands/IncidentUpdate/CreateIncidentUpdateCommand.php
+++ b/app/Bus/Commands/IncidentUpdate/CreateIncidentUpdateCommand.php
@@ -41,7 +41,19 @@ final class CreateIncidentUpdateCommand
* @var string
*/
public $message;
+ /**
+ * The incident component.
+ *
+ * @var int
+ */
+ public $component_id;
+ /**
+ * The component status.
+ *
+ * @var int
+ */
+ public $component_status;
/**
* The user.
*
@@ -55,10 +67,12 @@ final class CreateIncidentUpdateCommand
* @var string[]
*/
public $rules = [
- 'incident' => 'required',
- 'status' => 'required|int|min:1|max:4',
- 'message' => 'required|string',
- 'user' => 'required',
+ 'incident' => 'required',
+ 'status' => 'required|int|min:1|max:4',
+ 'message' => 'required|string',
+ 'component_id' => 'nullable|required_with:component_status|int',
+ 'component_status' => 'nullable|required_with:component_id|int|min:0|max:4',
+ 'user' => 'required',
];
/**
@@ -71,11 +85,13 @@ final class CreateIncidentUpdateCommand
*
* @return void
*/
- public function __construct(Incident $incident, $status, $message, User $user)
+ public function __construct(Incident $incident, $status, $message, $component_id, $component_status, User $user)
{
$this->incident = $incident;
$this->status = $status;
$this->message = $message;
+ $this->component_id = $component_id;
+ $this->component_status = $component_status;
$this->user = $user;
}
}
diff --git a/app/Bus/Commands/Metric/CreateMetricCommand.php b/app/Bus/Commands/Metric/CreateMetricCommand.php
index dc1ed90d6155..01e31ed39016 100644
--- a/app/Bus/Commands/Metric/CreateMetricCommand.php
+++ b/app/Bus/Commands/Metric/CreateMetricCommand.php
@@ -105,13 +105,12 @@ final class CreateMetricCommand
'name' => 'required|string',
'suffix' => 'required|string',
'description' => 'nullable|string',
- 'display_chart' => 'nullable|bool',
'default_value' => 'required|int',
'calc_type' => 'required|int',
'display_chart' => 'nullable|int',
'places' => 'nullable|int|between:0,4',
'default_view' => 'required|int|between:0,3',
- 'threshold' => 'nullable|numeric|between:0,10',
+ 'threshold' => 'required|int',
'order' => 'nullable|int',
'visible' => 'required|int|between:0,2',
];
diff --git a/app/Bus/Commands/Metric/CreateMetricPointCommand.php b/app/Bus/Commands/Metric/CreateMetricPointCommand.php
index a6b7e0a19ffa..3555f1945dab 100644
--- a/app/Bus/Commands/Metric/CreateMetricPointCommand.php
+++ b/app/Bus/Commands/Metric/CreateMetricPointCommand.php
@@ -38,7 +38,7 @@ final class CreateMetricPointCommand
/**
* The metric point created at.
*
- * @var string
+ * @var int
*/
public $created_at;
@@ -49,7 +49,7 @@ final class CreateMetricPointCommand
*/
public $rules = [
'value' => 'required|numeric',
- 'created_at' => 'required|string',
+ 'created_at' => 'nullable|int',
];
/**
@@ -57,7 +57,7 @@ final class CreateMetricPointCommand
*
* @param \CachetHQ\Cachet\Models\Metric $metric
* @param int $value
- * @param string $created_at
+ * @param int $created_at
*
* @return void
*/
diff --git a/app/Bus/Commands/Metric/UpdateMetricCommand.php b/app/Bus/Commands/Metric/UpdateMetricCommand.php
index 55939afb175d..535837f4ad23 100644
--- a/app/Bus/Commands/Metric/UpdateMetricCommand.php
+++ b/app/Bus/Commands/Metric/UpdateMetricCommand.php
@@ -108,15 +108,14 @@ final class UpdateMetricCommand
'name' => 'nullable|string',
'suffix' => 'nullable|string',
'description' => 'nullable|string',
- 'display_chart' => 'nullable|bool',
'default_value' => 'nullable|numeric',
'calc_type' => 'nullable|int|in:0,1',
'display_chart' => 'nullable|int',
'places' => 'nullable|numeric|between:0,4',
'default_view' => 'nullable|numeric|between:0,4',
- 'threshold' => 'nullable|numeric|between:0,10',
+ 'threshold' => 'nullable|int',
'order' => 'nullable|int',
- 'visible' => 'required|int|between:0,2',
+ 'visible' => 'nullable|int|between:0,2',
];
/**
diff --git a/app/Bus/Commands/Schedule/CreateScheduleCommand.php b/app/Bus/Commands/Schedule/CreateScheduleCommand.php
index 4268e68d2e36..d40d68df1489 100644
--- a/app/Bus/Commands/Schedule/CreateScheduleCommand.php
+++ b/app/Bus/Commands/Schedule/CreateScheduleCommand.php
@@ -60,6 +60,13 @@ final class CreateScheduleCommand
*/
public $components;
+ /**
+ * Whether to notify that the incident was reported.
+ *
+ * @var bool
+ */
+ public $notify;
+
/**
* The validation rules.
*
@@ -71,7 +78,8 @@ final class CreateScheduleCommand
'status' => 'required|int|min:0|max:2',
'scheduled_at' => 'required|string',
'completed_at' => 'nullable|string',
- 'components' => 'required|array',
+ 'components' => 'nullable|array',
+ 'notify' => 'nullable|bool',
];
/**
@@ -83,10 +91,11 @@ final class CreateScheduleCommand
* @param string $scheduled_at
* @param string $completed_at
* @param array $components
+ * @param bool $notify
*
* @return void
*/
- public function __construct($name, $message, $status, $scheduled_at, $completed_at, array $components)
+ public function __construct($name, $message, $status, $scheduled_at, $completed_at, $components, $notify)
{
$this->name = $name;
$this->message = $message;
@@ -94,5 +103,6 @@ public function __construct($name, $message, $status, $scheduled_at, $completed_
$this->scheduled_at = $scheduled_at;
$this->completed_at = $completed_at;
$this->components = $components;
+ $this->notify = $notify;
}
}
diff --git a/app/Bus/Commands/User/InviteUserCommand.php b/app/Bus/Commands/User/InviteUserCommand.php
index 2585f09518e5..49f16d9a615e 100644
--- a/app/Bus/Commands/User/InviteUserCommand.php
+++ b/app/Bus/Commands/User/InviteUserCommand.php
@@ -31,7 +31,7 @@ final class InviteUserCommand
* @var string[]
*/
public $rules = [
- 'emails' => 'required|array|email',
+ 'emails.*' => 'required|email',
];
/**
diff --git a/app/Bus/Events/Schedule/ScheduleWasCreatedEvent.php b/app/Bus/Events/Schedule/ScheduleWasCreatedEvent.php
index 1e1ecb4ee8e9..2438658d71be 100644
--- a/app/Bus/Events/Schedule/ScheduleWasCreatedEvent.php
+++ b/app/Bus/Events/Schedule/ScheduleWasCreatedEvent.php
@@ -36,18 +36,27 @@ final class ScheduleWasCreatedEvent implements ActionInterface, ScheduleEventInt
*/
public $schedule;
+ /**
+ * Whether to notify that the incident was reported.
+ *
+ * @var bool
+ */
+ public $notify;
+
/**
* Create a new schedule was created event instance.
*
* @param \CachetHQ\Cachet\Models\User $user
* @param \CachetHQ\Cachet\Models\Schedule $schedule
+ * @param bool notify
*
* @return void
*/
- public function __construct(User $user, Schedule $schedule)
+ public function __construct(User $user, Schedule $schedule, $notify = false)
{
$this->user = $user;
$this->schedule = $schedule;
+ $this->notify = $notify;
}
/**
diff --git a/app/Bus/Events/User/UserWasInvitedEvent.php b/app/Bus/Events/User/UserWasInvitedEvent.php
index 529efce0a81e..c2a65db9c181 100644
--- a/app/Bus/Events/User/UserWasInvitedEvent.php
+++ b/app/Bus/Events/User/UserWasInvitedEvent.php
@@ -16,7 +16,7 @@
/**
* This is the user was invited event class.
*
- * @author Joseph Cohen
+ * @author Joseph Cohen
* @author Graham Campbell
* @author James Brooks
*/
diff --git a/app/Bus/Exceptions/Component/ComponentExceptionInterface.php b/app/Bus/Exceptions/Component/ComponentExceptionInterface.php
new file mode 100644
index 000000000000..211d81f7a71b
--- /dev/null
+++ b/app/Bus/Exceptions/Component/ComponentExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface ComponentExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/ComponentGroup/ComponentGroup.php b/app/Bus/Exceptions/ComponentGroup/ComponentGroup.php
new file mode 100644
index 000000000000..8ca6edd05ee2
--- /dev/null
+++ b/app/Bus/Exceptions/ComponentGroup/ComponentGroup.php
@@ -0,0 +1,24 @@
+
+ */
+interface ComponentGroup extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/Incident/IncidentExceptionInterface.php b/app/Bus/Exceptions/Incident/IncidentExceptionInterface.php
new file mode 100644
index 000000000000..f6aa9be71dac
--- /dev/null
+++ b/app/Bus/Exceptions/Incident/IncidentExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface IncidentExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/Incident/InvalidIncidentTimestampException.php b/app/Bus/Exceptions/Incident/InvalidIncidentTimestampException.php
index 3843c180fa75..8d5d8708cd03 100644
--- a/app/Bus/Exceptions/Incident/InvalidIncidentTimestampException.php
+++ b/app/Bus/Exceptions/Incident/InvalidIncidentTimestampException.php
@@ -11,7 +11,6 @@
namespace CachetHQ\Cachet\Bus\Exceptions\Incident;
-use CachetHQ\Cachet\Bus\Exceptions\ExceptionInterface;
use Exception;
/**
@@ -19,7 +18,7 @@
*
* @author James Brooks
*/
-class InvalidIncidentTimestampException extends Exception implements ExceptionInterface
+class InvalidIncidentTimestampException extends Exception implements IncidentExceptionInterface
{
//
}
diff --git a/app/Bus/Exceptions/IncidentUpdate/IncidentUpdateExceptionInterface.php b/app/Bus/Exceptions/IncidentUpdate/IncidentUpdateExceptionInterface.php
new file mode 100644
index 000000000000..3abb87db89f2
--- /dev/null
+++ b/app/Bus/Exceptions/IncidentUpdate/IncidentUpdateExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface IncidentUpdateExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/Metric/MetricExceptionInterface.php b/app/Bus/Exceptions/Metric/MetricExceptionInterface.php
new file mode 100644
index 000000000000..51dd0f448601
--- /dev/null
+++ b/app/Bus/Exceptions/Metric/MetricExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface MetricExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/MetricPoint/MetricPointExceptionInterface.php b/app/Bus/Exceptions/MetricPoint/MetricPointExceptionInterface.php
new file mode 100644
index 000000000000..a0fe628cfa0f
--- /dev/null
+++ b/app/Bus/Exceptions/MetricPoint/MetricPointExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface MetricPointExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/Schedule/ScheduleExceptionInterface.php b/app/Bus/Exceptions/Schedule/ScheduleExceptionInterface.php
new file mode 100644
index 000000000000..61059820f368
--- /dev/null
+++ b/app/Bus/Exceptions/Schedule/ScheduleExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface ScheduleExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/Subscriber/SubscriberExceptionInterface.php b/app/Bus/Exceptions/Subscriber/SubscriberExceptionInterface.php
new file mode 100644
index 000000000000..afee3735b88e
--- /dev/null
+++ b/app/Bus/Exceptions/Subscriber/SubscriberExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface SubscriberExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Exceptions/User/UserExceptionInterface.php b/app/Bus/Exceptions/User/UserExceptionInterface.php
new file mode 100644
index 000000000000..e0b3d8aed1cf
--- /dev/null
+++ b/app/Bus/Exceptions/User/UserExceptionInterface.php
@@ -0,0 +1,24 @@
+
+ */
+interface UserExceptionInterface extends ExceptionInterface
+{
+ //
+}
diff --git a/app/Bus/Handlers/Commands/Component/CreateComponentCommandHandler.php b/app/Bus/Handlers/Commands/Component/CreateComponentCommandHandler.php
index 7cc941e0eb41..867f49fbeaa4 100644
--- a/app/Bus/Handlers/Commands/Component/CreateComponentCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Component/CreateComponentCommandHandler.php
@@ -53,6 +53,15 @@ public function handle(CreateComponentCommand $command)
{
$component = Component::create($this->filter($command));
+ // Sync the tags into the component.
+ if ($command->tags) {
+ collect(preg_split('/ ?, ?/', $command->tags))->filter()->map(function ($tag) {
+ return trim($tag);
+ })->pipe(function ($tags) use ($component) {
+ $component->attachTags($tags);
+ });
+ }
+
event(new ComponentWasCreatedEvent($this->auth->user(), $component));
return $component;
@@ -61,7 +70,7 @@ public function handle(CreateComponentCommand $command)
/**
* Filter the command data.
*
- * @param \CachetHQ\Cachet\Bus\Commands\Incident\CreateComponentCommand $command
+ * @param \CachetHQ\Cachet\Bus\Commands\Component\CreateComponentCommand $command
*
* @return array
*/
diff --git a/app/Bus/Handlers/Commands/Component/UpdateComponentCommandHandler.php b/app/Bus/Handlers/Commands/Component/UpdateComponentCommandHandler.php
index 736ff23cce44..f0ad1e44faab 100644
--- a/app/Bus/Handlers/Commands/Component/UpdateComponentCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Component/UpdateComponentCommandHandler.php
@@ -50,10 +50,21 @@ public function handle(UpdateComponentCommand $command)
$component = $command->component;
$originalStatus = $component->status;
- event(new ComponentStatusWasChangedEvent($this->auth->user(), $component, $originalStatus, $command->status, $command->silent));
+ if ($command->status && (int) $originalStatus !== (int) $command->status) {
+ event(new ComponentStatusWasChangedEvent($this->auth->user(), $component, $originalStatus, $command->status, $command->silent));
+ }
$component->update($this->filter($command));
+ // Sync the tags into the component.
+ if ($command->tags) {
+ collect(preg_split('/ ?, ?/', $command->tags))->filter()->map(function ($tag) {
+ return trim($tag);
+ })->pipe(function ($tags) use ($component) {
+ $component->syncTags($tags);
+ });
+ }
+
event(new ComponentWasUpdatedEvent($this->auth->user(), $component));
return $component;
@@ -62,7 +73,7 @@ public function handle(UpdateComponentCommand $command)
/**
* Filter the command data.
*
- * @param \CachetHQ\Cachet\Bus\Commands\Incident\UpdateComponentCommand $command
+ * @param \CachetHQ\Cachet\Bus\Commands\Component\UpdateComponentCommand $command
*
* @return array
*/
diff --git a/app/Bus/Handlers/Commands/Incident/CreateIncidentCommandHandler.php b/app/Bus/Handlers/Commands/Incident/CreateIncidentCommandHandler.php
index d8b36af2b3dc..2b3bcf77b8be 100644
--- a/app/Bus/Handlers/Commands/Incident/CreateIncidentCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Incident/CreateIncidentCommandHandler.php
@@ -15,14 +15,16 @@
use CachetHQ\Cachet\Bus\Commands\Incident\CreateIncidentCommand;
use CachetHQ\Cachet\Bus\Events\Incident\IncidentWasCreatedEvent;
use CachetHQ\Cachet\Bus\Exceptions\Incident\InvalidIncidentTimestampException;
+use CachetHQ\Cachet\Bus\Handlers\Traits\StoresMeta;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\IncidentTemplate;
+use CachetHQ\Cachet\Models\Meta;
use CachetHQ\Cachet\Services\Dates\DateFactory;
use Carbon\Carbon;
use Illuminate\Contracts\Auth\Guard;
-use Twig_Environment;
-use Twig_Loader_Array;
+use Twig\Environment as Twig_Environment;
+use Twig\Loader\ArrayLoader as Twig_Loader_Array;
/**
* This is the create incident command handler.
@@ -31,6 +33,8 @@
*/
class CreateIncidentCommandHandler
{
+ use StoresMeta;
+
/**
* The authentication guard instance.
*
@@ -45,6 +49,8 @@ class CreateIncidentCommandHandler
*/
protected $dates;
+ protected $twigConfig;
+
/**
* Create a new create incident command handler instance.
*
@@ -57,6 +63,8 @@ public function __construct(Guard $auth, DateFactory $dates)
{
$this->auth = $auth;
$this->dates = $dates;
+
+ $this->twigConfig = config('cachet.twig');
}
/**
@@ -69,6 +77,7 @@ public function __construct(Guard $auth, DateFactory $dates)
public function handle(CreateIncidentCommand $command)
{
$data = [
+ 'user_id' => $this->auth->user()->id,
'name' => $command->name,
'status' => $command->status,
'visible' => $command->visible,
@@ -100,9 +109,14 @@ public function handle(CreateIncidentCommand $command)
// Create the incident
$incident = Incident::create($data);
+ // Store any meta?
+ if ($meta = $command->meta) {
+ $this->storeMeta($command->meta, 'incidents', $incident->id);
+ }
+
// Update the component.
if ($component = Component::find($command->component_id)) {
- dispatch(new UpdateComponentCommand(
+ execute(new UpdateComponentCommand(
Component::find($command->component_id),
null,
null,
@@ -112,7 +126,8 @@ public function handle(CreateIncidentCommand $command)
null,
null,
null,
- false
+ null,
+ true // Silent mode
));
}
@@ -121,6 +136,37 @@ public function handle(CreateIncidentCommand $command)
return $incident;
}
+ protected function sandboxedTwigTemplateData(string $templateData)
+ {
+ if (!$templateData) {
+ return '';
+ }
+
+ $policy = new \Twig\Sandbox\SecurityPolicy(
+ $this->twigConfig['tags'],
+ $this->twigConfig['filters'],
+ $this->twigConfig['methods'],
+ $this->twigConfig['props'],
+ $this->twigConfig['functions']
+ );
+
+ $sandbox = new \Twig\Extension\SandboxExtension($policy);
+
+ $templateBasicLoader = new Twig_Loader_Array([
+ 'firstStageLoader' => $templateData,
+ ]);
+
+ $sandBoxBasicLoader = new Twig_Loader_Array([
+ 'secondStageLoader' => '{% sandbox %}{% include "firstStageLoader" %} {% endsandbox %}',
+ ]);
+
+ $hardenedLoader = new \Twig\Loader\ChainLoader([$templateBasicLoader, $sandBoxBasicLoader]);
+ $twig = new Twig_Environment($hardenedLoader);
+ $twig->addExtension($sandbox);
+
+ return $twig;
+ }
+
/**
* Compiles an incident template into an incident message.
*
@@ -131,8 +177,7 @@ public function handle(CreateIncidentCommand $command)
*/
protected function parseTemplate(IncidentTemplate $template, CreateIncidentCommand $command)
{
- $env = new Twig_Environment(new Twig_Loader_Array([]));
- $template = $env->createTemplate($template->template);
+ $template = $this->sandboxedTwigTemplateData($template->template);
$vars = array_merge($command->template_vars, [
'incident' => [
@@ -148,6 +193,6 @@ protected function parseTemplate(IncidentTemplate $template, CreateIncidentComma
],
]);
- return $template->render($vars);
+ return $template->render('secondStageLoader', $vars);
}
}
diff --git a/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php b/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php
index 00bf9f8d3ac4..c85920253832 100644
--- a/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php
@@ -15,13 +15,12 @@
use CachetHQ\Cachet\Bus\Commands\Incident\UpdateIncidentCommand;
use CachetHQ\Cachet\Bus\Events\Incident\IncidentWasUpdatedEvent;
use CachetHQ\Cachet\Bus\Exceptions\Incident\InvalidIncidentTimestampException;
+use CachetHQ\Cachet\Bus\Handlers\Traits\StoresMeta;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\IncidentTemplate;
use CachetHQ\Cachet\Services\Dates\DateFactory;
use Illuminate\Contracts\Auth\Guard;
-use Twig_Environment;
-use Twig_Loader_Array;
/**
* This is the update incident command handler.
@@ -30,6 +29,8 @@
*/
class UpdateIncidentCommandHandler
{
+ use StoresMeta;
+
/**
* The authentication guard instance.
*
@@ -44,6 +45,11 @@ class UpdateIncidentCommandHandler
*/
protected $dates;
+ /**
+ * Twig configuration array.
+ */
+ protected $twigConfig;
+
/**
* Create a new update incident command handler instance.
*
@@ -56,6 +62,8 @@ public function __construct(Guard $auth, DateFactory $dates)
{
$this->auth = $auth;
$this->dates = $dates;
+
+ $this->twigConfig = $twigConfig = config('cachet.twig');
}
/**
@@ -86,9 +94,14 @@ public function handle(UpdateIncidentCommand $command)
// Rather than making lots of updates, just fill and save.
$incident->save();
+ // Store any meta?
+ if ($meta = $command->meta) {
+ $this->storeMeta($command->meta, 'incidents', $incident->id);
+ }
+
// Update the component.
if ($component = Component::find($command->component_id)) {
- dispatch(new UpdateComponentCommand(
+ execute(new UpdateComponentCommand(
Component::find($command->component_id),
null,
null,
@@ -98,7 +111,8 @@ public function handle(UpdateIncidentCommand $command)
null,
null,
null,
- false
+ null,
+ true // Silent mode
));
}
@@ -132,6 +146,32 @@ protected function filter(UpdateIncidentCommand $command)
});
}
+ protected function sandboxedTwigTemplateData(string $templateData)
+ {
+ $policy = new \Twig\Sandbox\SecurityPolicy(
+ $this->twigConfig['tags'],
+ $this->twigConfig['filters'],
+ $this->twigConfig['methods'],
+ $this->twigConfig['props'],
+ $this->twigConfig['functions']
+ );
+ $sandbox = new \Twig\Extension\SandboxExtension($policy);
+
+ $templateBasicLoader = new \Twig\Loader\ArrayLoader([
+ 'firstStageLoader' => $templateData,
+ ]);
+
+ $sandBoxBasicLoader = new \Twig\Loader\ArrayLoader([
+ 'secondStageLoader' => '{% sandbox %}{% include "firstStageLoader" %} {% endsandbox %}',
+ ]);
+
+ $hardenedLoader = new \Twig\Loader\ChainLoader([$templateBasicLoader, $sandBoxBasicLoader]);
+ $twig = new \Twig\Environment($hardenedLoader);
+ $twig->addExtension($sandbox);
+
+ return $twig;
+ }
+
/**
* Compiles an incident template into an incident message.
*
@@ -142,8 +182,7 @@ protected function filter(UpdateIncidentCommand $command)
*/
protected function parseTemplate(IncidentTemplate $template, UpdateIncidentCommand $command)
{
- $env = new Twig_Environment(new Twig_Loader_Array([]));
- $template = $env->createTemplate($template->template);
+ $template = $this->sandboxedTwigTemplateData($template->template);
$vars = array_merge($command->template_vars, [
'incident' => [
@@ -159,6 +198,6 @@ protected function parseTemplate(IncidentTemplate $template, UpdateIncidentComma
],
]);
- return $template->render($vars);
+ return $template->render('secondStageLoader', $vars);
}
}
diff --git a/app/Bus/Handlers/Commands/IncidentUpdate/CreateIncidentUpdateCommandHandler.php b/app/Bus/Handlers/Commands/IncidentUpdate/CreateIncidentUpdateCommandHandler.php
index 09fe9d9b1047..20dd2c84a933 100644
--- a/app/Bus/Handlers/Commands/IncidentUpdate/CreateIncidentUpdateCommandHandler.php
+++ b/app/Bus/Handlers/Commands/IncidentUpdate/CreateIncidentUpdateCommandHandler.php
@@ -63,7 +63,7 @@ public function handle(CreateIncidentUpdateCommand $command)
$update = IncidentUpdate::create($data);
// Update the original incident with the new status.
- dispatch(new UpdateIncidentCommand(
+ execute(new UpdateIncidentCommand(
$command->incident,
null,
$command->status,
diff --git a/app/Bus/Handlers/Commands/Invite/ClaimInviteCommandHandler.php b/app/Bus/Handlers/Commands/Invite/ClaimInviteCommandHandler.php
index 6499eae8ad10..bd2603bebbd0 100644
--- a/app/Bus/Handlers/Commands/Invite/ClaimInviteCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Invite/ClaimInviteCommandHandler.php
@@ -20,7 +20,7 @@ class ClaimInviteCommandHandler
/**
* Handle the claim invite command.
*
- * @param \CachetHQ\Cachet\Bus\Commands\User\ClaimInviteCommand $command
+ * @param \CachetHQ\Cachet\Bus\Commands\Invite\ClaimInviteCommand $command
*
* @return void
*/
diff --git a/app/Bus/Handlers/Commands/Metric/CreateMetricPointCommandHandler.php b/app/Bus/Handlers/Commands/Metric/CreateMetricPointCommandHandler.php
index 4e065de715fe..8fdbe1ca21c6 100644
--- a/app/Bus/Handlers/Commands/Metric/CreateMetricPointCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Metric/CreateMetricPointCommandHandler.php
@@ -79,7 +79,7 @@ public function handle(CreateMetricPointCommand $command)
*/
protected function findOrCreatePoint(CreateMetricPointCommand $command)
{
- $buffer = Carbon::now()->subMinutes($command->metric->threshold);
+ $buffer = Carbon::now()->subMinutes($command->metric->threshold - 1)->startOfMinute();
if ($point = MetricPoint::where('metric_id', '=', $command->metric->id)->where('value', '=', $command->value)->where('created_at', '>=', $buffer)->first()) {
return $point;
diff --git a/app/Bus/Handlers/Commands/Schedule/CreateScheduleCommandHandler.php b/app/Bus/Handlers/Commands/Schedule/CreateScheduleCommandHandler.php
index 403131a25563..9069eadb9c01 100644
--- a/app/Bus/Handlers/Commands/Schedule/CreateScheduleCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Schedule/CreateScheduleCommandHandler.php
@@ -11,11 +11,14 @@
namespace CachetHQ\Cachet\Bus\Handlers\Commands\Schedule;
+use AltThree\Validator\ValidationException;
use CachetHQ\Cachet\Bus\Commands\Schedule\CreateScheduleCommand;
use CachetHQ\Cachet\Bus\Events\Schedule\ScheduleWasCreatedEvent;
use CachetHQ\Cachet\Models\Schedule;
use CachetHQ\Cachet\Services\Dates\DateFactory;
use Illuminate\Contracts\Auth\Guard;
+use Illuminate\Support\MessageBag;
+use InvalidArgumentException;
/**
* This is the create schedule command handler.
@@ -61,9 +64,12 @@ public function __construct(Guard $auth, DateFactory $dates)
*/
public function handle(CreateScheduleCommand $command)
{
- $schedule = Schedule::create($this->filter($command));
-
- event(new ScheduleWasCreatedEvent($this->auth->user(), $schedule));
+ try {
+ $schedule = Schedule::create($this->filter($command));
+ event(new ScheduleWasCreatedEvent($this->auth->user(), $schedule, (bool) $command->notify));
+ } catch (InvalidArgumentException $e) {
+ throw new ValidationException(new MessageBag([$e->getMessage()]));
+ }
return $schedule;
}
@@ -89,10 +95,11 @@ protected function filter(CreateScheduleCommand $command)
'status' => $command->status,
'scheduled_at' => $scheduledAt,
'completed_at' => $completedAt,
+ 'notify' => $command->notify,
];
$availableParams = array_filter($params, function ($val) {
- return $val !== null;
+ return $val !== null && $val !== '';
});
return $availableParams;
diff --git a/app/Bus/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php b/app/Bus/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php
index 6a9839c72858..1dde43da4a84 100644
--- a/app/Bus/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php
@@ -58,7 +58,7 @@ public function handle(SubscribeSubscriberCommand $command)
});
if ($command->verified) {
- dispatch(new VerifySubscriberCommand($subscriber));
+ execute(new VerifySubscriberCommand($subscriber));
} else {
$subscriber->notify(new VerifySubscriptionNotification());
}
diff --git a/app/Bus/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php b/app/Bus/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php
index cf43e1be829b..be0dd0217528 100644
--- a/app/Bus/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php
@@ -13,7 +13,6 @@
use CachetHQ\Cachet\Bus\Commands\Subscriber\UnsubscribeSubscriberCommand;
use CachetHQ\Cachet\Bus\Events\Subscriber\SubscriberHasUnsubscribedEvent;
-use CachetHQ\Cachet\Models\Subscriber;
/**
* This is the unsubscribe subscriber command class.
diff --git a/app/Bus/Handlers/Commands/Subscriber/UpdateSubscriberSubscriptionCommandHandler.php b/app/Bus/Handlers/Commands/Subscriber/UpdateSubscriberSubscriptionCommandHandler.php
index 24a7d27f567b..5e8a1dd5a8c7 100644
--- a/app/Bus/Handlers/Commands/Subscriber/UpdateSubscriberSubscriptionCommandHandler.php
+++ b/app/Bus/Handlers/Commands/Subscriber/UpdateSubscriberSubscriptionCommandHandler.php
@@ -36,7 +36,7 @@ public function handle(UpdateSubscriberSubscriptionCommand $command)
$subscriber = $command->subscriber;
$subscriptions = $command->subscriptions ?: [];
- $components = Component::all();
+ $components = Component::enabled()->get();
$updateSubscriptions = $components->filter(function ($item) use ($subscriptions) {
return in_array($item->id, $subscriptions);
diff --git a/app/Bus/Handlers/Events/Component/SendComponentUpdateEmailNotificationHandler.php b/app/Bus/Handlers/Events/Component/SendComponentUpdateEmailNotificationHandler.php
index 33c77fb29618..6ecdbfca3a0f 100644
--- a/app/Bus/Handlers/Events/Component/SendComponentUpdateEmailNotificationHandler.php
+++ b/app/Bus/Handlers/Events/Component/SendComponentUpdateEmailNotificationHandler.php
@@ -12,12 +12,20 @@
namespace CachetHQ\Cachet\Bus\Handlers\Events\Component;
use CachetHQ\Cachet\Bus\Events\Component\ComponentStatusWasChangedEvent;
+use CachetHQ\Cachet\Integrations\Contracts\System;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Subscriber;
use CachetHQ\Cachet\Notifications\Component\ComponentStatusChangedNotification;
class SendComponentUpdateEmailNotificationHandler
{
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
/**
* The subscriber instance.
*
@@ -32,8 +40,9 @@ class SendComponentUpdateEmailNotificationHandler
*
* @return void
*/
- public function __construct(Subscriber $subscriber)
+ public function __construct(System $system, Subscriber $subscriber)
{
+ $this->system = $system;
$this->subscriber = $subscriber;
}
@@ -48,8 +57,8 @@ public function handle(ComponentStatusWasChangedEvent $event)
{
$component = $event->component;
- // If we're silent, then don't send this.
- if ($event->silent) {
+ // If we're silent or the notifications are suppressed don't send this.
+ if ($event->silent || !$this->system->canNotifySubscribers()) {
return;
}
diff --git a/app/Bus/Handlers/Events/Incident/SendIncidentEmailNotificationHandler.php b/app/Bus/Handlers/Events/Incident/SendIncidentEmailNotificationHandler.php
index b85b8fc865ef..d30916d10de3 100644
--- a/app/Bus/Handlers/Events/Incident/SendIncidentEmailNotificationHandler.php
+++ b/app/Bus/Handlers/Events/Incident/SendIncidentEmailNotificationHandler.php
@@ -12,11 +12,19 @@
namespace CachetHQ\Cachet\Bus\Handlers\Events\Incident;
use CachetHQ\Cachet\Bus\Events\Incident\IncidentWasCreatedEvent;
+use CachetHQ\Cachet\Integrations\Contracts\System;
use CachetHQ\Cachet\Models\Subscriber;
use CachetHQ\Cachet\Notifications\Incident\NewIncidentNotification;
class SendIncidentEmailNotificationHandler
{
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
/**
* The subscriber instance.
*
@@ -27,12 +35,14 @@ class SendIncidentEmailNotificationHandler
/**
* Create a new send incident email notification handler.
*
- * @param \CachetHQ\Cachet\Models\Subscriber $subscriber
+ * @param \CachetHQ\Cachet\Integrations\Contracts\System $system
+ * @param \CachetHQ\Cachet\Models\Subscriber $subscriber
*
* @return void
*/
- public function __construct(Subscriber $subscriber)
+ public function __construct(System $system, Subscriber $subscriber)
{
+ $this->system = $system;
$this->subscriber = $subscriber;
}
@@ -47,7 +57,7 @@ public function handle(IncidentWasCreatedEvent $event)
{
$incident = $event->incident;
- if (!$event->notify) {
+ if (!$event->notify || !$this->system->canNotifySubscribers()) {
return false;
}
diff --git a/app/Bus/Handlers/Events/IncidentUpdate/SendIncidentUpdateEmailNotificationHandler.php b/app/Bus/Handlers/Events/IncidentUpdate/SendIncidentUpdateEmailNotificationHandler.php
index 86ed8147c97d..447604816e4d 100644
--- a/app/Bus/Handlers/Events/IncidentUpdate/SendIncidentUpdateEmailNotificationHandler.php
+++ b/app/Bus/Handlers/Events/IncidentUpdate/SendIncidentUpdateEmailNotificationHandler.php
@@ -12,11 +12,19 @@
namespace CachetHQ\Cachet\Bus\Handlers\Events\IncidentUpdate;
use CachetHQ\Cachet\Bus\Events\IncidentUpdate\IncidentUpdateWasReportedEvent;
+use CachetHQ\Cachet\Integrations\Contracts\System;
use CachetHQ\Cachet\Models\Subscriber;
use CachetHQ\Cachet\Notifications\IncidentUpdate\IncidentUpdatedNotification;
class SendIncidentUpdateEmailNotificationHandler
{
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
/**
* The subscriber instance.
*
@@ -27,12 +35,14 @@ class SendIncidentUpdateEmailNotificationHandler
/**
* Create a new send incident email notification handler.
*
- * @param \CachetHQ\Cachet\Models\Subscriber $subscriber
+ * @param \CachetHQ\Cachet\Integrations\Contracts\System $system
+ * @param \CachetHQ\Cachet\Models\Subscriber $subscriber
*
* @return void
*/
- public function __construct(Subscriber $subscriber)
+ public function __construct(System $system, Subscriber $subscriber)
{
+ $this->system = $system;
$this->subscriber = $subscriber;
}
@@ -48,8 +58,8 @@ public function handle(IncidentUpdateWasReportedEvent $event)
$update = $event->update;
$incident = $update->incident;
- // Only send emails for public incidents.
- if (!$incident->visible) {
+ // Only send emails for public incidents while the system is not under scheduled maintenance.
+ if (!$incident->visible || !$this->system->canNotifySubscribers()) {
return;
}
@@ -73,8 +83,8 @@ public function handle(IncidentUpdateWasReportedEvent $event)
->get()
->reject(function ($subscriber) use ($notified) {
return in_array($subscriber->id, $notified);
- })->each(function ($subscriber) use ($incident) {
- $subscriber->notify(new IncidentUpdatedNotification($incident));
+ })->each(function ($subscriber) use ($update) {
+ $subscriber->notify(new IncidentUpdatedNotification($update));
});
}
}
diff --git a/app/Bus/Handlers/Events/Schedule/SendScheduleEmailNotificationHandler.php b/app/Bus/Handlers/Events/Schedule/SendScheduleEmailNotificationHandler.php
index 11e6b377034d..84e9db31d616 100644
--- a/app/Bus/Handlers/Events/Schedule/SendScheduleEmailNotificationHandler.php
+++ b/app/Bus/Handlers/Events/Schedule/SendScheduleEmailNotificationHandler.php
@@ -51,6 +51,9 @@ public function __construct(Subscriber $subscriber)
public function handle(ScheduleEventInterface $event)
{
$schedule = $event->schedule;
+ if (!$event->notify) {
+ return false;
+ }
// First notify all global subscribers.
$globalSubscribers = $this->subscriber->isVerified()->isGlobal()->get()->each(function ($subscriber) use ($schedule) {
diff --git a/app/Bus/Handlers/Jobs/System/SendBeaconJobHandler.php b/app/Bus/Handlers/Jobs/System/SendBeaconJobHandler.php
index 0d3025dc6650..da0eb87d1bb7 100644
--- a/app/Bus/Handlers/Jobs/System/SendBeaconJobHandler.php
+++ b/app/Bus/Handlers/Jobs/System/SendBeaconJobHandler.php
@@ -44,7 +44,7 @@ public function __construct(Beacon $beacon)
/**
* Handle the send beacon job.
*
- * @param \CachetHQ\Cachet\Bus\Jobs\SendBeaconJob $job
+ * @param \CachetHQ\Cachet\Bus\Jobs\System\SendBeaconJob $job
*
* @return void
*/
diff --git a/app/Bus/Handlers/Traits/StoresMeta.php b/app/Bus/Handlers/Traits/StoresMeta.php
new file mode 100644
index 000000000000..e5272ba51b45
--- /dev/null
+++ b/app/Bus/Handlers/Traits/StoresMeta.php
@@ -0,0 +1,81 @@
+ $value) {
+ $modelInstance = call_user_func(
+ [$metaModel, 'firstOrNew'],
+ [
+ 'key' => $key,
+ 'meta_type' => $metaType,
+ 'meta_id' => $metaId,
+ ]
+ );
+
+ $value = $this->removeEmptyValues($value);
+ if (!empty($value)) {
+ $modelInstance->setAttribute('value', $value);
+ $modelInstance->save();
+ continue;
+ }
+
+ // The value is empty, remove the row
+ if ($modelInstance->exists) {
+ $modelInstance->delete();
+ }
+ }
+ }
+
+ /**
+ * Determine if a Value is empty.
+ *
+ * @param mixed $values
+ *
+ * @return array|mixed
+ */
+ protected function removeEmptyValues($values)
+ {
+ if (!is_array($values)) {
+ return empty($values) ? null : $values;
+ }
+
+ foreach ($values as $key => $value) {
+ if (!empty($value)) {
+ continue;
+ }
+ unset($values[$key]);
+ }
+
+ return $values;
+ }
+}
diff --git a/app/Composers/AppComposer.php b/app/Composers/AppComposer.php
index 4c2afaf9c701..822b30f2615a 100644
--- a/app/Composers/AppComposer.php
+++ b/app/Composers/AppComposer.php
@@ -17,7 +17,7 @@
use Illuminate\Contracts\View\View;
/**
- * This is the app composer.
+ * This is the app composer class.
*
* @author James Brooks
* @author Graham Campbell
@@ -61,7 +61,13 @@ public function __construct(DateFactory $dates, Repository $config)
*/
public function compose(View $view)
{
- $view->withAboutApp(Markdown::convertToHtml($this->config->get('setting.app_about')));
+ if ($this->config->get('setting.app_about')) {
+ $about = Markdown::convertToHtml($this->config->get('setting.app_about'));
+ } else {
+ $about = '';
+ }
+
+ $view->withAboutApp($about);
$view->withAppAnalytics($this->config->get('setting.app_analytics'));
$view->withAppAnalyticsGoSquared($this->config->get('setting.app_analytics_gs'));
$view->withAppAnalyticsPiwikUrl($this->config->get('setting.app_analytics_piwik_url'));
@@ -81,6 +87,7 @@ public function compose(View $view)
$view->withAutomaticLocalization($this->config->get('setting.automatic_localization'));
$view->withEnableExternalDependencies($this->config->get('setting.enable_external_dependencies'));
$view->withShowTimezone($this->config->get('setting.show_timezone'));
+ $view->withAppRefreshRate($this->config->get('setting.app_refresh_rate'));
$view->withTimezone($this->dates->getTimezone());
$view->withSiteTitle($this->config->get('setting.app_name'));
$view->withFontSubset($this->config->get('langs.'.$this->config->get('app.locale').'.subset', 'latin'));
diff --git a/app/Composers/Modules/ComponentsComposer.php b/app/Composers/ComponentsComposer.php
similarity index 93%
rename from app/Composers/Modules/ComponentsComposer.php
rename to app/Composers/ComponentsComposer.php
index 10555c21d889..1fac9423df71 100644
--- a/app/Composers/Modules/ComponentsComposer.php
+++ b/app/Composers/ComponentsComposer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
@@ -53,7 +53,7 @@ public function __construct(Guard $guard)
public function compose(View $view)
{
$componentGroups = $this->getVisibleGroupedComponents();
- $ungroupedComponents = Component::ungrouped()->get();
+ $ungroupedComponents = Component::ungrouped()->orderBy('status', 'desc')->get();
$view->withComponentGroups($componentGroups)
->withUngroupedComponents($ungroupedComponents);
diff --git a/app/Composers/CurrentUserComposer.php b/app/Composers/CurrentUserComposer.php
index b90f6272b2df..d7afe3b9603d 100644
--- a/app/Composers/CurrentUserComposer.php
+++ b/app/Composers/CurrentUserComposer.php
@@ -13,9 +13,10 @@
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
+use McCool\LaravelAutoPresenter\Facades\AutoPresenter;
/**
- * This is the current user composer.
+ * This is the current user composer class.
*
* @author Joseph Cohen
* @author James Brooks
@@ -32,6 +33,6 @@ class CurrentUserComposer
*/
public function compose(View $view)
{
- $view->withCurrentUser(Auth::user());
+ $view->withCurrentUser(AutoPresenter::decorate(Auth::user()));
}
}
diff --git a/app/Composers/DashboardComposer.php b/app/Composers/DashboardComposer.php
index 40f03ae1edab..c5ccef937ce1 100644
--- a/app/Composers/DashboardComposer.php
+++ b/app/Composers/DashboardComposer.php
@@ -19,13 +19,76 @@
use Illuminate\Contracts\View\View;
/**
- * This is the dashboard composer.
+ * This is the dashboard composer class.
*
* @author James Brooks
* @author Graham Campbell
*/
class DashboardComposer
{
+ /**
+ * The component count.
+ *
+ * @var int
+ */
+ protected $componentCount;
+
+ /**
+ * The incident count.
+ *
+ * @var int
+ */
+ protected $incidentCount;
+
+ /**
+ * The incident template count.
+ *
+ * @var int
+ */
+ protected $incidentTemplateCount;
+
+ /**
+ * The schedule count.
+ *
+ * @var int
+ */
+ protected $scheduleCount;
+
+ /**
+ * The subscriber count.
+ *
+ * @var int
+ */
+ protected $subscriberCount;
+
+ /**
+ * Create a new dashboard composer instance.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ if (is_null($this->componentCount)) {
+ $this->componentCount = Component::count();
+ }
+
+ if (is_null($this->incidentCount)) {
+ $this->incidentCount = Incident::count();
+ }
+
+ if (is_null($this->incidentTemplateCount)) {
+ $this->incidentTemplateCount = IncidentTemplate::count();
+ }
+
+ if (is_null($this->scheduleCount)) {
+ $this->scheduleCount = Schedule::count();
+ }
+
+ if (is_null($this->subscriberCount)) {
+ $this->subscriberCount = Subscriber::isVerified()->count();
+ }
+ }
+
/**
* Bind data to the view.
*
@@ -35,11 +98,11 @@ class DashboardComposer
*/
public function compose(View $view)
{
- $view->withComponentCount(Component::count());
- $view->withIncidentCount(Incident::count());
- $view->withIncidentTemplateCount(IncidentTemplate::count());
- $view->withScheduleCount(Schedule::count());
- $view->withSubscriberCount(Subscriber::isVerified()->count());
+ $view->withComponentCount($this->componentCount);
+ $view->withIncidentCount($this->incidentCount);
+ $view->withIncidentTemplateCount($this->incidentTemplateCount);
+ $view->withScheduleCount($this->scheduleCount);
+ $view->withSubscriberCount($this->subscriberCount);
$view->withIsWriteable(is_writable(app()->bootstrapPath().'/cachet'));
}
}
diff --git a/app/Composers/Modules/MetricsComposer.php b/app/Composers/MetricsComposer.php
similarity index 97%
rename from app/Composers/Modules/MetricsComposer.php
rename to app/Composers/MetricsComposer.php
index ba49156a9168..e6e32e9f7f19 100644
--- a/app/Composers/Modules/MetricsComposer.php
+++ b/app/Composers/MetricsComposer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use CachetHQ\Cachet\Models\Metric;
use Illuminate\Contracts\Auth\Guard;
diff --git a/app/Composers/ModuleComposer.php b/app/Composers/ModuleComposer.php
deleted file mode 100644
index b758401bb3f0..000000000000
--- a/app/Composers/ModuleComposer.php
+++ /dev/null
@@ -1,76 +0,0 @@
-
- */
-class ModuleComposer
-{
- /**
- * The application instance.
- *
- * @var \Illuminate\Contracts\Foundation\Application
- */
- protected $app;
-
- /**
- * The modules manager instance.
- *
- * @var \CachetHQ\Cachet\Services\Modules\Manager
- */
- protected $manager;
-
- /**
- * Create a new modules composer.
- *
- * @param \Illuminate\Contracts\Foundation\Application $app
- * @param \CachetHQ\Cachet\Services\Modules\Manager $manager
- *
- * @return void
- */
- public function __construct(Application $app, Manager $manager)
- {
- $this->app = $app;
- $this->manager = $manager;
- }
-
- /**
- * Bind data to the view.
- *
- * @param \Illuminate\Contracts\View\View $view
- *
- * @return void
- */
- public function compose(View $view)
- {
- $key = $view->getName();
-
- $view->with('view', $key);
-
- $modules = "view.modules: {$key}";
- $groups = "view.groups: {$key}";
-
- $modules = $this->app->bound($modules) ? $this->app[$modules] : [];
- $groups = $this->app->bound($groups) ? $this->app[$groups] : [];
-
- $modules = $this->manager->groupModules($modules, $groups);
-
- $view->withModules($modules);
- }
-}
diff --git a/app/Composers/Modules/ScheduledComposer.php b/app/Composers/ScheduledComposer.php
similarity index 83%
rename from app/Composers/Modules/ScheduledComposer.php
rename to app/Composers/ScheduledComposer.php
index 642984f5d2f1..0e65b4a89245 100644
--- a/app/Composers/Modules/ScheduledComposer.php
+++ b/app/Composers/ScheduledComposer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use CachetHQ\Cachet\Models\Schedule;
use Illuminate\Contracts\View\View;
@@ -31,7 +31,7 @@ class ScheduledComposer
*/
public function compose(View $view)
{
- $scheduledMaintenance = Schedule::futureSchedules()->orderBy('scheduled_at')->get();
+ $scheduledMaintenance = Schedule::uncompleted()->orderBy('scheduled_at')->get();
$view->withScheduledMaintenance($scheduledMaintenance);
}
diff --git a/app/Composers/SettingsComposer.php b/app/Composers/SettingsComposer.php
index dd9d772f35a0..aa0ff2fac6c3 100644
--- a/app/Composers/SettingsComposer.php
+++ b/app/Composers/SettingsComposer.php
@@ -14,7 +14,7 @@
use Illuminate\Contracts\View\View;
/**
- * This is the settings composer.
+ * This is the settings composer class.
*
* @author James Brooks
*/
diff --git a/app/Composers/Modules/StatusComposer.php b/app/Composers/StatusComposer.php
similarity index 80%
rename from app/Composers/Modules/StatusComposer.php
rename to app/Composers/StatusComposer.php
index 6449bfe5da8e..6b953343e9a7 100644
--- a/app/Composers/Modules/StatusComposer.php
+++ b/app/Composers/StatusComposer.php
@@ -9,10 +9,11 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use CachetHQ\Cachet\Integrations\Contracts\System;
use Illuminate\Contracts\View\View;
+use Illuminate\Support\Arr;
/**
* This is the status composer.
@@ -50,6 +51,9 @@ public function __construct(System $system)
*/
public function compose(View $view)
{
- $view->with($this->system->getStatus());
+ $status = $this->system->getStatus();
+
+ $view->withSystemStatus(Arr::get($status, 'system_status'));
+ $view->withSystemMessage(Arr::get($status, 'system_message'));
}
}
diff --git a/app/Composers/Modules/StickiedComposer.php b/app/Composers/StickiedComposer.php
similarity index 96%
rename from app/Composers/Modules/StickiedComposer.php
rename to app/Composers/StickiedComposer.php
index 880458ab9910..82e357f395e2 100644
--- a/app/Composers/Modules/StickiedComposer.php
+++ b/app/Composers/StickiedComposer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Services\Dates\DateFactory;
diff --git a/app/Composers/ThemeComposer.php b/app/Composers/ThemeComposer.php
index acc39933a2bb..0153a35f9d46 100644
--- a/app/Composers/ThemeComposer.php
+++ b/app/Composers/ThemeComposer.php
@@ -15,7 +15,7 @@
use Illuminate\Contracts\View\View;
/**
- * This is the theme composer.
+ * This is the theme composer class.
*
* @author James Brooks
* @author Graham Campbell
diff --git a/app/Composers/Modules/TimelineComposer.php b/app/Composers/TimelineComposer.php
similarity index 93%
rename from app/Composers/Modules/TimelineComposer.php
rename to app/Composers/TimelineComposer.php
index 7064a00ccbd4..0206a2dc7220 100644
--- a/app/Composers/Modules/TimelineComposer.php
+++ b/app/Composers/TimelineComposer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Composers\Modules;
+namespace CachetHQ\Cachet\Composers;
use Illuminate\Contracts\View\View;
diff --git a/app/Composers/TimezoneLocaleComposer.php b/app/Composers/TimezoneLocaleComposer.php
index c5c57a834ee9..5e3712d8e58a 100644
--- a/app/Composers/TimezoneLocaleComposer.php
+++ b/app/Composers/TimezoneLocaleComposer.php
@@ -15,9 +15,10 @@
use DateTimeZone;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Contracts\View\View;
+use Illuminate\Support\Arr;
/**
- * This is the timezone locale composer.
+ * This is the timezone locale composer class.
*
* @author Joseph Cohen
* @author James Brooks
@@ -58,7 +59,7 @@ public function compose(View $view)
$langs = array_map(function ($lang) use ($enabledLangs) {
$locale = basename($lang);
- return [$locale => array_get($enabledLangs, $locale, [
+ return [$locale => Arr::get($enabledLangs, $locale, [
'name' => $locale,
'subset' => null,
])];
diff --git a/app/Console/Commands/AppResetCommand.php b/app/Console/Commands/AppResetCommand.php
new file mode 100644
index 000000000000..3add76aa5c62
--- /dev/null
+++ b/app/Console/Commands/AppResetCommand.php
@@ -0,0 +1,76 @@
+
+ */
+class AppResetCommand extends Command
+{
+ /**
+ * The name and signature of the console command.
+ *
+ * @var string
+ */
+ protected $signature = 'app:reset';
+
+ /**
+ * The console command description.
+ *
+ * @var string
+ */
+ protected $description = 'Resets and installs the application';
+
+ /**
+ * The events instance.
+ *
+ * @var \Illuminate\Contracts\Events\Dispatcher
+ */
+ protected $events;
+
+ /**
+ * Create a new command instance.
+ *
+ * @return void
+ */
+ public function __construct(Dispatcher $events)
+ {
+ $this->events = $events;
+
+ parent::__construct();
+ }
+
+ /**
+ * Execute the console command.
+ *
+ * @return mixed
+ */
+ public function handle()
+ {
+ $this->events->fire('command.resetting', $this);
+ $this->events->fire('command.generatekey', $this);
+ $this->events->fire('command.cacheconfig', $this);
+ $this->events->fire('command.cacheroutes', $this);
+ $this->events->fire('command.publishvendors', $this);
+ $this->events->fire('command.resetmigrations', $this);
+ $this->events->fire('command.runmigrations', $this);
+ $this->events->fire('command.runseeding', $this);
+ $this->events->fire('command.updatecache', $this);
+ $this->events->fire('command.extrastuff', $this);
+ $this->events->fire('command.reset', $this);
+ }
+}
diff --git a/app/Console/Commands/AppUpdateCommand.php b/app/Console/Commands/AppUpdateCommand.php
new file mode 100644
index 000000000000..1aa4bd975eb0
--- /dev/null
+++ b/app/Console/Commands/AppUpdateCommand.php
@@ -0,0 +1,73 @@
+
+ */
+class AppUpdateCommand extends Command
+{
+ /**
+ * The name and signature of the console command.
+ *
+ * @var string
+ */
+ protected $signature = 'app:update';
+
+ /**
+ * The console command description.
+ *
+ * @var string
+ */
+ protected $description = 'Updates the application';
+
+ /**
+ * The events instance.
+ *
+ * @var \Illuminate\Contracts\Events\Dispatcher
+ */
+ protected $events;
+
+ /**
+ * Create a new command instance.
+ *
+ * @return void
+ */
+ public function __construct(Dispatcher $events)
+ {
+ $this->events = $events;
+
+ parent::__construct();
+ }
+
+ /**
+ * Execute the console command.
+ *
+ * @return mixed
+ */
+ public function handle()
+ {
+ $this->events->fire('command.updating', $this);
+ $this->events->fire('command.cacheconfig', $this);
+ $this->events->fire('command.cacheroutes', $this);
+ $this->events->fire('command.publishvendors', $this);
+ $this->events->fire('command.runmigrations', $this);
+ $this->events->fire('command.updatecache', $this);
+ $this->events->fire('command.extrastuff', $this);
+ $this->events->fire('command.updated', $this);
+ }
+}
diff --git a/app/Console/Commands/BeaconCommand.php b/app/Console/Commands/BeaconCommand.php
index 5045f642ccef..27cad3f06843 100644
--- a/app/Console/Commands/BeaconCommand.php
+++ b/app/Console/Commands/BeaconCommand.php
@@ -40,7 +40,7 @@ class BeaconCommand extends Command
*
* @return void
*/
- public function fire()
+ public function handle()
{
dispatch(new SendBeaconJob());
}
diff --git a/app/Console/Commands/DemoMetricPointSeederCommand.php b/app/Console/Commands/DemoMetricPointSeederCommand.php
index ed754b16966b..d4e16235849f 100644
--- a/app/Console/Commands/DemoMetricPointSeederCommand.php
+++ b/app/Console/Commands/DemoMetricPointSeederCommand.php
@@ -12,8 +12,6 @@
namespace CachetHQ\Cachet\Console\Commands;
use CachetHQ\Cachet\Models\MetricPoint;
-use DateInterval;
-use DateTime;
use Illuminate\Console\Command;
use Illuminate\Console\ConfirmableTrait;
use Symfony\Component\Console\Input\InputOption;
@@ -46,7 +44,7 @@ class DemoMetricPointSeederCommand extends Command
*
* @return void
*/
- public function fire()
+ public function handle()
{
if (!$this->confirmToProceed()) {
return;
@@ -66,16 +64,26 @@ protected function seedMetricPoints()
{
MetricPoint::truncate();
- // Generate 11 hours of metric points
- for ($i = 0; $i < 11; $i++) {
- $metricTime = (new DateTime())->sub(new DateInterval('PT'.$i.'H'));
+ $points = [];
- MetricPoint::create([
- 'metric_id' => 1,
- 'value' => random_int(1, 10),
- 'created_at' => $metricTime,
- 'updated_at' => $metricTime,
- ]);
+ // Generate 24 hours of metric points
+ for ($i = 0; $i <= 23; $i++) {
+ for ($j = 0; $j <= 59; $j++) {
+ $this->info("{$i}:{$j}");
+
+ $pointTime = date("Y-m-d {$i}:{$j}:00");
+
+ $points[] = [
+ 'metric_id' => 1,
+ 'value' => random_int(1, 10),
+ 'created_at' => $pointTime,
+ 'updated_at' => $pointTime,
+ ];
+ }
+ }
+
+ foreach (array_chunk($points, 100) as $chunk) {
+ MetricPoint::insert($chunk);
}
}
diff --git a/app/Console/Commands/DemoSeederCommand.php b/app/Console/Commands/DemoSeederCommand.php
index ecddf5749d89..3d496ca06674 100644
--- a/app/Console/Commands/DemoSeederCommand.php
+++ b/app/Console/Commands/DemoSeederCommand.php
@@ -56,14 +56,14 @@ class DemoSeederCommand extends Command
/**
* The settings repository.
*
- * @var \CachetHQ\Cache\Settings\Repository
+ * @var \CachetHQ\Cachet\Settings\Repository
*/
protected $settings;
/**
* Create a new demo seeder command instance.
*
- * @param \CachetHQ\Cache\Settings\Repository $settings
+ * @param \CachetHQ\Cachet\Settings\Repository $settings
*
* @return void
*/
@@ -79,12 +79,13 @@ public function __construct(Repository $settings)
*
* @return void
*/
- public function fire()
+ public function handle()
{
if (!$this->confirmToProceed()) {
return;
}
+ $this->seedUsers();
$this->seedActions();
$this->seedComponentGroups();
$this->seedComponents();
@@ -95,7 +96,6 @@ public function fire()
$this->seedSchedules();
$this->seedSettings();
$this->seedSubscribers();
- $this->seedUsers();
$this->info('Database seeded with demo data successfully!');
}
@@ -124,7 +124,7 @@ protected function seedComponentGroups()
'collapsed' => 0,
'visible' => ComponentGroup::VISIBLE_AUTHENTICATED,
], [
- 'name' => 'Alt Three',
+ 'name' => 'Services',
'order' => 2,
'collapsed' => 1,
'visible' => ComponentGroup::VISIBLE_GUEST,
@@ -168,26 +168,26 @@ protected function seedComponents()
'group_id' => 1,
'link' => 'https://cachethq.io',
], [
- 'name' => 'Blog',
- 'description' => 'The Alt Three Blog.',
+ 'name' => 'Laravel Artisan Cheatsheet',
+ 'description' => 'A searchable, bookmarkable cheatsheet for Laravel\'s Artisan commands.',
'status' => 1,
'order' => 0,
'group_id' => 2,
- 'link' => 'https://blog.alt-three.com',
+ 'link' => 'https://artisan.page',
], [
- 'name' => 'StyleCI',
- 'description' => 'The PHP Coding Style Service.',
+ 'name' => 'Checkmango',
+ 'description' => 'The Full-Stack A/B Testing Platform',
'status' => 1,
'order' => 1,
'group_id' => 2,
- 'link' => 'https://styleci.io',
+ 'link' => 'https://checkmango.com',
], [
'name' => 'GitHub',
'description' => '',
'status' => 1,
'order' => 0,
'group_id' => 0,
- 'link' => 'https://github.com/CachetHQ/Cachet',
+ 'link' => 'https://github.com/cachethq/cachet',
],
];
@@ -223,6 +223,7 @@ protected function seedIncidents()
'component_id' => 0,
'visible' => 1,
'stickied' => false,
+ 'user_id' => 1,
'occurred_at' => Carbon::now(),
],
[
@@ -232,6 +233,7 @@ protected function seedIncidents()
'component_id' => 0,
'visible' => 1,
'stickied' => false,
+ 'user_id' => 1,
'occurred_at' => Carbon::now(),
],
];
@@ -394,20 +396,20 @@ protected function seedSettings()
'key' => 'app_incident_days',
'value' => '7',
], [
- 'key' => 'app_analytics',
- 'value' => 'UA-58442674-3',
- ], [
- 'key' => 'app_analytics_gs',
- 'value' => 'GSN-712462-P',
+ 'key' => 'app_refresh_rate',
+ 'value' => '0',
], [
'key' => 'display_graphs',
'value' => '1',
], [
'key' => 'app_about',
- 'value' => 'This is the demo instance of [Cachet](https://cachethq.io?ref=demo). The open source status page system, for everyone. An [Alt Three](https://alt-three.com) product.',
+ 'value' => 'This is the demo instance of [Cachet](https://cachethq.io?ref=demo). The open-source status page system, for everyone. 3.x is coming soon! [Read the announcement](https://github.com/cachethq/cachet/discussions/4342).',
], [
'key' => 'enable_subscribers',
'value' => '0',
+ ], [
+ 'key' => 'header',
+ 'value' => '',
],
];
@@ -439,7 +441,7 @@ protected function seedUsers()
[
'username' => 'test',
'password' => 'test123',
- 'email' => 'test@test.com',
+ 'email' => 'test@example.com',
'level' => User::LEVEL_ADMIN,
'api_key' => '9yMHsdioQosnyVK4iCVR',
],
diff --git a/app/Console/Commands/InstallCommand.php b/app/Console/Commands/InstallCommand.php
index c9df46e0f496..7c71cbc0de2e 100644
--- a/app/Console/Commands/InstallCommand.php
+++ b/app/Console/Commands/InstallCommand.php
@@ -11,9 +11,12 @@
namespace CachetHQ\Cachet\Console\Commands;
+use CachetHQ\Cachet\Models\User;
use Dotenv\Dotenv;
use Dotenv\Exception\InvalidPathException;
use Illuminate\Console\Command;
+use Illuminate\Contracts\Console\Kernel;
+use Illuminate\Contracts\Events\Dispatcher;
/**
* This is the install command class.
@@ -36,25 +39,55 @@ class InstallCommand extends Command
*/
protected $description = 'Install Cachet';
+ /**
+ * The events instance.
+ *
+ * @var \Illuminate\Contracts\Events\Dispatcher
+ */
+ protected $events;
+
+ /**
+ * Create a new command instance.
+ *
+ * @param Dispatcher $events
+ */
+ public function __construct(Dispatcher $events)
+ {
+ $this->events = $events;
+
+ parent::__construct();
+ }
+
/**
* Execute the console command.
*
* @return void
*/
- public function fire()
+ public function handle()
{
- if (!$this->confirm('Do you want to install Cachet?')) {
- $this->line('Installation aborted. Goodbye!');
-
- return;
+ if ($this->confirm('Do you want to configure Cachet before installing?')) {
+ $this->configureEnvironmentFile();
+ $this->configureKey();
+ $this->configureDatabase();
+ $this->configureDrivers();
+ $this->configureMail();
+ $this->configureCachet();
+ $this->configureUser();
}
- $this->configureEnvironmentFile();
- $this->configureKey();
- $this->configureDatabase();
- $this->configureDrivers();
- $this->configureMail();
- $this->configureCachet();
+ $this->line('Installing Cachet...');
+
+ $this->events->fire('command.installing', $this);
+ $this->events->fire('command.generatekey', $this);
+ $this->events->fire('command.cacheconfig', $this);
+ $this->events->fire('command.cacheroutes', $this);
+ $this->events->fire('command.publishvendors', $this);
+ $this->events->fire('command.runmigrations', $this);
+ $this->events->fire('command.runseeding', $this);
+ $this->events->fire('command.updatecache', $this);
+ $this->events->fire('command.linkstorage', $this);
+ $this->events->fire('command.extrastuff', $this);
+ $this->events->fire('command.installed', $this);
$this->info('Cachet is installed ⚡');
}
@@ -110,7 +143,7 @@ protected function configureDatabase(array $default = [])
$config['DB_DRIVER'] = $this->choice('Which database driver do you want to use?', [
'mysql' => 'MySQL',
- 'postgresql' => 'PostgreSQL',
+ 'pgsql' => 'PostgreSQL',
'sqlite' => 'SQLite',
], $config['DB_DRIVER']);
@@ -118,6 +151,9 @@ protected function configureDatabase(array $default = [])
$config['DB_DATABASE'] = $this->ask('Please provide the full path to your SQLite file.', $config['DB_DATABASE']);
} else {
$config['DB_HOST'] = $this->ask("What is the host of your {$config['DB_DRIVER']} database?", $config['DB_HOST']);
+ if ($config['DB_HOST'] === 'localhost' && $config['DB_DRIVER'] === 'mysql') {
+ $this->warn("Using 'localhost' will result in the usage of a local unix socket. Use 127.0.0.1 if you want to connect over TCP");
+ }
$config['DB_DATABASE'] = $this->ask('What is the name of the database that Cachet should use?', $config['DB_DATABASE']);
@@ -125,6 +161,7 @@ protected function configureDatabase(array $default = [])
$config['DB_PASSWORD'] = $this->secret('What password should we connect with?', $config['DB_PASSWORD']);
+ $config['DB_PORT'] = $config['DB_DRIVER'] === 'mysql' ? 3306 : 5432;
if ($this->confirm('Is your database listening on a non-standard port number?')) {
$config['DB_PORT'] = $this->anticipate('What port number is your database using?', [3306, 5432], $config['DB_PORT']);
}
@@ -279,10 +316,13 @@ protected function configureMail(array $config = [])
/**
* Configure Cachet.
*
+ * @param array $config
+ *
* @return void
*/
- protected function configureCachet()
+ protected function configureCachet(array $config = [])
{
+ $config = [];
if ($this->confirm('Do you wish to use Cachet Beacon?')) {
$config['CACHET_BEACON'] = 'true';
}
@@ -297,6 +337,33 @@ protected function configureCachet()
}
}
+ /**
+ * Configure the first user.
+ *
+ * @return void
+ */
+ protected function configureUser()
+ {
+ if (!$this->confirm('Do you want to create an admin user?')) {
+ return;
+ }
+
+ // We need to refresh the config to get access to the newly connected database.
+ $this->getFreshConfiguration();
+
+ // Now we need to install the application.
+ // $this->call('cachet:install');
+
+ $user = [
+ 'username' => $this->ask('Please enter your username'),
+ 'email' => $this->ask('Please enter your email'),
+ 'password' => $this->secret('Please enter your password'),
+ 'level' => User::LEVEL_ADMIN,
+ ];
+
+ User::create($user);
+ }
+
/**
* Configure the redis connection.
*
@@ -337,6 +404,17 @@ protected function formatConfigsTable(array $config)
$this->table(['Setting', 'Value'], $configRows);
}
+ /**
+ * Boot a fresh copy of the application configuration.
+ *
+ * @return void
+ */
+ protected function getFreshConfiguration()
+ {
+ $app = require $this->laravel->bootstrapPath().'/app.php';
+ $app->make(Kernel::class)->bootstrap();
+ }
+
/**
* Writes to the .env file with given parameters.
*
@@ -357,11 +435,12 @@ protected function writeEnv($key, $value)
$envKey = strtoupper($key);
$envValue = env($envKey) ?: 'null';
- file_put_contents($path, str_replace(
- "{$envKey}={$envValue}",
- "{$envKey}={$value}",
- file_get_contents($path)
- ));
+ $envFileContents = file_get_contents($path);
+ $envFileContents = str_replace("{$envKey}={$envValue}", "{$envKey}={$value}", $envFileContents, $count);
+ if ($count < 1 && $envValue === 'null') {
+ $envFileContents = str_replace("{$envKey}=", "{$envKey}={$value}", $envFileContents);
+ }
+ file_put_contents($path, $envFileContents);
} catch (InvalidPathException $e) {
throw $e;
}
diff --git a/app/Console/Commands/VersionCommand.php b/app/Console/Commands/VersionCommand.php
index b18209dd0fe5..e093fe7a07f4 100644
--- a/app/Console/Commands/VersionCommand.php
+++ b/app/Console/Commands/VersionCommand.php
@@ -39,7 +39,7 @@ class VersionCommand extends Command
*
* @return void
*/
- public function fire()
+ public function handle()
{
$this->info('Cachet '.CACHET_VERSION.' is installed ⚡');
}
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index 9a203840c3cb..12bc4a2ab21c 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -11,6 +11,8 @@
namespace CachetHQ\Cachet\Console;
+use CachetHQ\Cachet\Console\Commands\AppResetCommand;
+use CachetHQ\Cachet\Console\Commands\AppUpdateCommand;
use CachetHQ\Cachet\Console\Commands\BeaconCommand;
use CachetHQ\Cachet\Console\Commands\DemoMetricPointSeederCommand;
use CachetHQ\Cachet\Console\Commands\DemoSeederCommand;
@@ -34,6 +36,8 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
+ AppResetCommand::class,
+ AppUpdateCommand::class,
BeaconCommand::class,
DemoMetricPointSeederCommand::class,
DemoSeederCommand::class,
diff --git a/app/Foundation/Exceptions/Displayers/JsonValidationDisplayer.php b/app/Exceptions/Displayers/JsonValidationDisplayer.php
similarity index 90%
rename from app/Foundation/Exceptions/Displayers/JsonValidationDisplayer.php
rename to app/Exceptions/Displayers/JsonValidationDisplayer.php
index 02fd20ad3cba..bb3d0c5014e4 100644
--- a/app/Foundation/Exceptions/Displayers/JsonValidationDisplayer.php
+++ b/app/Exceptions/Displayers/JsonValidationDisplayer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Exceptions\Displayers;
+namespace CachetHQ\Cachet\Exceptions\Displayers;
use AltThree\Validator\ValidationException;
use Exception;
@@ -29,7 +29,7 @@ class JsonValidationDisplayer extends JsonDisplayer implements DisplayerInterfac
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function display(Exception $exception, $id, $code, array $headers)
+ public function display(Exception $exception, string $id, int $code, array $headers)
{
$info = $this->info->generate($exception, $id, 400);
@@ -47,7 +47,7 @@ public function display(Exception $exception, $id, $code, array $headers)
*
* @return bool
*/
- public function canDisplay(Exception $original, Exception $transformed, $code)
+ public function canDisplay(Exception $original, Exception $transformed, int $code)
{
return $transformed instanceof ValidationException;
}
diff --git a/app/Exceptions/Displayers/MaintenanceDisplayer.php b/app/Exceptions/Displayers/MaintenanceDisplayer.php
new file mode 100644
index 000000000000..20b4a16d5e75
--- /dev/null
+++ b/app/Exceptions/Displayers/MaintenanceDisplayer.php
@@ -0,0 +1,104 @@
+
+ */
+class MaintenanceDisplayer implements DisplayerInterface
+{
+ /**
+ * The view factory instance.
+ *
+ * @var \Illuminate\Contracts\View\Factory
+ */
+ protected $view;
+
+ /**
+ * Create a new maintenance displayer instance.
+ *
+ * @param \Illuminate\Contracts\View\Factory $view
+ *
+ * @return void
+ */
+ public function __construct(Factory $view)
+ {
+ $this->view = $view;
+ }
+
+ /**
+ * Get the error response associated with the given exception.
+ *
+ * @param \Exception $exception
+ * @param string $id
+ * @param int $code
+ * @param string[] $headers
+ *
+ * @return \Symfony\Component\HttpFoundation\Response
+ */
+ public function display(Exception $exception, string $id, int $code, array $headers)
+ {
+ return new Response($this->render(), $code, array_merge($headers, ['Content-Type' => $this->contentType()]));
+ }
+
+ /**
+ * Render the page.
+ *
+ * @return string
+ */
+ protected function render()
+ {
+ return $this->view->make('errors.maintenance')->render();
+ }
+
+ /**
+ * Get the supported content type.
+ *
+ * @return string
+ */
+ public function contentType()
+ {
+ return 'text/html';
+ }
+
+ /**
+ * Can we display the exception?
+ *
+ * @param \Exception $original
+ * @param \Exception $transformed
+ * @param int $code
+ *
+ * @return bool
+ */
+ public function canDisplay(Exception $original, Exception $transformed, int $code)
+ {
+ return $transformed instanceof MaintenanceModeException;
+ }
+
+ /**
+ * Do we provide verbose information about the exception?
+ *
+ * @return bool
+ */
+ public function isVerbose()
+ {
+ return false;
+ }
+}
diff --git a/app/Foundation/Exceptions/Displayers/RedirectDisplayer.php b/app/Exceptions/Displayers/RedirectDisplayer.php
similarity index 92%
rename from app/Foundation/Exceptions/Displayers/RedirectDisplayer.php
rename to app/Exceptions/Displayers/RedirectDisplayer.php
index 147a2c97618e..7a1670cbf77f 100644
--- a/app/Foundation/Exceptions/Displayers/RedirectDisplayer.php
+++ b/app/Exceptions/Displayers/RedirectDisplayer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Exceptions\Displayers;
+namespace CachetHQ\Cachet\Exceptions\Displayers;
use Exception;
use GrahamCampbell\Exceptions\Displayers\DisplayerInterface;
@@ -47,7 +47,7 @@ public function __construct(Request $request)
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function display(Exception $exception, $id, $code, array $headers)
+ public function display(Exception $exception, string $id, int $code, array $headers)
{
return redirect()->guest('auth/login');
}
@@ -71,7 +71,7 @@ public function contentType()
*
* @return bool
*/
- public function canDisplay(Exception $original, Exception $transformed, $code)
+ public function canDisplay(Exception $original, Exception $transformed, int $code)
{
$redirect = $transformed instanceof HttpExceptionInterface && $transformed->getStatusCode() === 401;
diff --git a/app/Exceptions/Displayers/SettingsDisplayer.php b/app/Exceptions/Displayers/SettingsDisplayer.php
new file mode 100644
index 000000000000..d3a76d0408a5
--- /dev/null
+++ b/app/Exceptions/Displayers/SettingsDisplayer.php
@@ -0,0 +1,88 @@
+request = $request;
+ }
+
+ /**
+ * Get the error response associated with the given exception.
+ *
+ * @param \Exception $exception
+ * @param string $id
+ * @param int $code
+ * @param string[] $headers
+ *
+ * @return \Symfony\Component\HttpFoundation\Response
+ */
+ public function display(Exception $exception, string $id, int $code, array $headers)
+ {
+ return cachet_redirect('setup');
+ }
+
+ /**
+ * Get the supported content type.
+ *
+ * @return string
+ */
+ public function contentType()
+ {
+ return 'text/html';
+ }
+
+ /**
+ * Can we display the exception?
+ *
+ * @param \Exception $original
+ * @param \Exception $transformed
+ * @param int $code
+ *
+ * @return bool
+ */
+ public function canDisplay(Exception $original, Exception $transformed, int $code)
+ {
+ return ($transformed instanceof ReadException) && !$this->request->is('setup*');
+ }
+
+ /**
+ * Do we provide verbose information about the exception?
+ *
+ * @return bool
+ */
+ public function isVerbose()
+ {
+ return false;
+ }
+}
diff --git a/app/Foundation/Exceptions/Displayers/ThrottleDisplayer.php b/app/Exceptions/Displayers/ThrottleDisplayer.php
similarity index 87%
rename from app/Foundation/Exceptions/Displayers/ThrottleDisplayer.php
rename to app/Exceptions/Displayers/ThrottleDisplayer.php
index f36871db9215..5f1907c7d7db 100644
--- a/app/Foundation/Exceptions/Displayers/ThrottleDisplayer.php
+++ b/app/Exceptions/Displayers/ThrottleDisplayer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Exceptions\Displayers;
+namespace CachetHQ\Cachet\Exceptions\Displayers;
use Exception;
use GrahamCampbell\Exceptions\Displayers\DisplayerInterface;
@@ -47,9 +47,9 @@ public function __construct(Request $request)
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function display(Exception $exception, $id, $code, array $headers)
+ public function display(Exception $exception, string $id, int $code, array $headers)
{
- return redirect()->route('auth.login')->withError(trans('forms.login.rate-limit'));
+ return cachet_redirect('auth.login')->withError(trans('forms.login.rate-limit'));
}
/**
@@ -71,7 +71,7 @@ public function contentType()
*
* @return bool
*/
- public function canDisplay(Exception $original, Exception $transformed, $code)
+ public function canDisplay(Exception $original, Exception $transformed, int $code)
{
return $transformed instanceof TooManyRequestsHttpException && $this->request->is('auth*');
}
diff --git a/app/Foundation/Exceptions/Filters/ApiFilter.php b/app/Exceptions/Filters/ApiFilter.php
similarity index 84%
rename from app/Foundation/Exceptions/Filters/ApiFilter.php
rename to app/Exceptions/Filters/ApiFilter.php
index e824de2a4957..8d12e4dbffc2 100644
--- a/app/Foundation/Exceptions/Filters/ApiFilter.php
+++ b/app/Exceptions/Filters/ApiFilter.php
@@ -9,10 +9,11 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Exceptions\Filters;
+namespace CachetHQ\Cachet\Exceptions\Filters;
use Exception;
use Illuminate\Http\Request;
+use Illuminate\Support\Str;
class ApiFilter
{
@@ -27,11 +28,11 @@ class ApiFilter
*
* @return \GrahamCampbell\Exceptions\Displayers\DisplayerInterface[]
*/
- public function filter(array $displayers, Request $request, Exception $original, Exception $transformed, $code)
+ public function filter(array $displayers, Request $request, Exception $original, Exception $transformed, int $code)
{
if ($request->is('api*')) {
foreach ($displayers as $index => $displayer) {
- if (!str_contains($displayer->contentType(), 'application/')) {
+ if (!Str::contains($displayer->contentType(), 'application/')) {
unset($displayers[$index]);
}
}
diff --git a/app/Foundation/Exceptions/Transformers/BusTransformer.php b/app/Exceptions/Transformers/BusTransformer.php
similarity index 93%
rename from app/Foundation/Exceptions/Transformers/BusTransformer.php
rename to app/Exceptions/Transformers/BusTransformer.php
index 6ffd879a2e96..be0b2fe5cb18 100644
--- a/app/Foundation/Exceptions/Transformers/BusTransformer.php
+++ b/app/Exceptions/Transformers/BusTransformer.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Exceptions\Transformers;
+namespace CachetHQ\Cachet\Exceptions\Transformers;
use CachetHQ\Cachet\Bus\Exceptions\ExceptionInterface;
use Exception;
diff --git a/app/Foundation/Providers/ModuleServiceProvider.php b/app/Foundation/Providers/ModuleServiceProvider.php
deleted file mode 100644
index b4181c6141eb..000000000000
--- a/app/Foundation/Providers/ModuleServiceProvider.php
+++ /dev/null
@@ -1,95 +0,0 @@
- [
- ['group' => 'messages', 'partial' => 'partials.modules.messages'],
- ['group' => 'status', 'partial' => 'partials.modules.status'],
- ['group' => 'components', 'partial' => 'partials.modules.components'],
- ['group' => 'metrics', 'partial' => 'partials.modules.metrics'],
- ['group' => 'stickied', 'partial' => 'partials.modules.stickied'],
- ['group' => 'scheduled', 'partial' => 'partials.modules.scheduled'],
- ['group' => 'timeline', 'partial' => 'partials.modules.timeline'],
- ],
- ];
-
- /**
- * The group definitions.
- *
- * @var array
- */
- protected $groups = [
- 'index' => [
- 'messages' => 10000,
- 'status' => 20000,
- 'components' => 30000,
- 'metrics' => 40000,
- 'scheduled' => 50000,
- 'stickied' => 60000,
- 'timeline' => 70000,
- ],
- ];
-
- /**
- * Boot the service provider.
- *
- * @param \Illuminate\View\Compilers\BladeCompiler $blade
- */
- public function boot(BladeCompiler $blade)
- {
- $blade->directive('modules', function ($group) {
- return sprintf(
- 'call(\'%s@%s\', [
- \'factory\' => $__env,
- \'data\' => array_except(get_defined_vars(), array(\'__data\', \'__path\')),
- \'modules\' => $modules,
- \'group\' => %s,
- ]); ?>',
- ModulesRenderer::class,
- 'renderModules',
- empty($group) ? 'null' : $group
- );
- });
- }
-
- /**
- * Register the service provider.
- *
- * @return void
- */
- public function register()
- {
- foreach ($this->modules as $key => $modules) {
- $this->app->singleton("view.modules: {$key}", function () use ($modules) {
- return $modules;
- });
- }
-
- foreach ($this->groups as $key => $groups) {
- $this->app->singleton("view.groups: {$key}", function () use ($groups) {
- return $groups;
- });
- }
- }
-}
diff --git a/app/Http/Controllers/Api/AbstractApiController.php b/app/Http/Controllers/Api/AbstractApiController.php
index 4b871c5be28f..10be23db248f 100644
--- a/app/Http/Controllers/Api/AbstractApiController.php
+++ b/app/Http/Controllers/Api/AbstractApiController.php
@@ -141,7 +141,7 @@ protected function paginator(Paginator $paginator, Request $request)
{
foreach ($request->query as $key => $value) {
if ($key != 'page') {
- $paginator->addQuery($key, $value);
+ $paginator->appends($key, $value);
}
}
diff --git a/app/Http/Controllers/Api/ComponentController.php b/app/Http/Controllers/Api/ComponentController.php
index de811f3bccc8..9bda7b09cb53 100644
--- a/app/Http/Controllers/Api/ComponentController.php
+++ b/app/Http/Controllers/Api/ComponentController.php
@@ -15,7 +15,6 @@
use CachetHQ\Cachet\Bus\Commands\Component\RemoveComponentCommand;
use CachetHQ\Cachet\Bus\Commands\Component\UpdateComponentCommand;
use CachetHQ\Cachet\Models\Component;
-use CachetHQ\Cachet\Models\Tag;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Database\QueryException;
@@ -29,7 +28,7 @@ class ComponentController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getComponents()
+ public function index()
{
if (app(Guard::class)->check()) {
$components = Component::query();
@@ -37,6 +36,10 @@ public function getComponents()
$components = Component::enabled();
}
+ if ($tags = Binput::get('tags')) {
+ $components->withAnyTags($tags);
+ }
+
$components->search(Binput::except(['sort', 'order', 'per_page']));
if ($sortBy = Binput::get('sort')) {
@@ -57,7 +60,7 @@ public function getComponents()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getComponent(Component $component)
+ public function show(Component $component)
{
return $this->item($component);
}
@@ -67,10 +70,10 @@ public function getComponent(Component $component)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postComponents()
+ public function store()
{
try {
- $component = dispatch(new CreateComponentCommand(
+ $component = execute(new CreateComponentCommand(
Binput::get('name'),
Binput::get('description'),
Binput::get('status'),
@@ -78,26 +81,13 @@ public function postComponents()
Binput::get('order'),
Binput::get('group_id'),
(bool) Binput::get('enabled', true),
- Binput::get('meta', null)
+ Binput::get('meta'),
+ Binput::get('tags')
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
- if (Binput::has('tags')) {
- // The component was added successfully, so now let's deal with the tags.
- $tags = preg_split('/ ?, ?/', Binput::get('tags'));
-
- // For every tag, do we need to create it?
- $componentTags = array_map(function ($taggable) use ($component) {
- return Tag::firstOrCreate([
- 'name' => $taggable,
- ])->id;
- }, $tags);
-
- $component->tags()->sync($componentTags);
- }
-
return $this->item($component);
}
@@ -108,10 +98,10 @@ public function postComponents()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putComponent(Component $component)
+ public function update(Component $component)
{
try {
- dispatch(new UpdateComponentCommand(
+ execute(new UpdateComponentCommand(
$component,
Binput::get('name'),
Binput::get('description'),
@@ -119,25 +109,15 @@ public function putComponent(Component $component)
Binput::get('link'),
Binput::get('order'),
Binput::get('group_id'),
- (bool) Binput::get('enabled', true),
- Binput::get('meta', null),
+ Binput::get('enabled', $component->enabled),
+ Binput::get('meta'),
+ Binput::get('tags'),
(bool) Binput::get('silent', false)
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
- if (Binput::has('tags')) {
- $tags = preg_split('/ ?, ?/', Binput::get('tags'));
-
- // For every tag, do we need to create it?
- $componentTags = array_map(function ($taggable) use ($component) {
- return Tag::firstOrCreate(['name' => $taggable])->id;
- }, $tags);
-
- $component->tags()->sync($componentTags);
- }
-
return $this->item($component);
}
@@ -148,9 +128,9 @@ public function putComponent(Component $component)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteComponent(Component $component)
+ public function destroy(Component $component)
{
- dispatch(new RemoveComponentCommand($component));
+ execute(new RemoveComponentCommand($component));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/ComponentGroupController.php b/app/Http/Controllers/Api/ComponentGroupController.php
index 38f54767738c..957106e101d3 100644
--- a/app/Http/Controllers/Api/ComponentGroupController.php
+++ b/app/Http/Controllers/Api/ComponentGroupController.php
@@ -52,7 +52,7 @@ public function __construct(Guard $guard)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getGroups()
+ public function index()
{
$groups = ComponentGroup::query();
if (!$this->guard->check()) {
@@ -79,7 +79,7 @@ public function getGroups()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getGroup(ComponentGroup $group)
+ public function show(ComponentGroup $group)
{
return $this->item($group);
}
@@ -89,10 +89,10 @@ public function getGroup(ComponentGroup $group)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postGroups()
+ public function store()
{
try {
- $group = dispatch(new CreateComponentGroupCommand(
+ $group = execute(new CreateComponentGroupCommand(
Binput::get('name'),
Binput::get('order', 0),
Binput::get('collapsed', 0),
@@ -112,10 +112,10 @@ public function postGroups()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putGroup(ComponentGroup $group)
+ public function update(ComponentGroup $group)
{
try {
- $group = dispatch(new UpdateComponentGroupCommand(
+ $group = execute(new UpdateComponentGroupCommand(
$group,
Binput::get('name'),
Binput::get('order'),
@@ -136,9 +136,9 @@ public function putGroup(ComponentGroup $group)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteGroup(ComponentGroup $group)
+ public function destroy(ComponentGroup $group)
{
- dispatch(new RemoveComponentGroupCommand($group));
+ execute(new RemoveComponentGroupCommand($group));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/GeneralController.php b/app/Http/Controllers/Api/GeneralController.php
index 9fb36d964aad..23ba1fa4485f 100644
--- a/app/Http/Controllers/Api/GeneralController.php
+++ b/app/Http/Controllers/Api/GeneralController.php
@@ -17,7 +17,7 @@
/**
* This is the general api controller.
*
- * @author James Brooks
+ * @author James Brooks
*/
class GeneralController extends AbstractApiController
{
diff --git a/app/Http/Controllers/Api/IncidentController.php b/app/Http/Controllers/Api/IncidentController.php
index 98b66cc2ffb5..cd705519f588 100644
--- a/app/Http/Controllers/Api/IncidentController.php
+++ b/app/Http/Controllers/Api/IncidentController.php
@@ -28,7 +28,7 @@ class IncidentController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getIncidents()
+ public function index()
{
$incidentVisibility = app(Guard::class)->check() ? 0 : 1;
@@ -54,7 +54,7 @@ public function getIncidents()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getIncident(Incident $incident)
+ public function show(Incident $incident)
{
return $this->item($incident);
}
@@ -64,21 +64,22 @@ public function getIncident(Incident $incident)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postIncidents()
+ public function store()
{
try {
- $incident = dispatch(new CreateIncidentCommand(
+ $incident = execute(new CreateIncidentCommand(
Binput::get('name'),
Binput::get('status'),
Binput::get('message', null, false, false),
- Binput::get('visible', true),
+ (bool) Binput::get('visible', true),
Binput::get('component_id'),
Binput::get('component_status'),
- Binput::get('notify', true),
- Binput::get('stickied', false),
+ (bool) Binput::get('notify', true),
+ (bool) Binput::get('stickied', false),
Binput::get('occurred_at'),
Binput::get('template'),
- Binput::get('vars', [])
+ Binput::get('vars', []),
+ Binput::get('meta', [])
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
@@ -94,19 +95,19 @@ public function postIncidents()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putIncident(Incident $incident)
+ public function update(Incident $incident)
{
try {
- $incident = dispatch(new UpdateIncidentCommand(
+ $incident = execute(new UpdateIncidentCommand(
$incident,
Binput::get('name'),
Binput::get('status'),
Binput::get('message'),
- Binput::get('visible', true),
+ (bool) Binput::get('visible', true),
Binput::get('component_id'),
Binput::get('component_status'),
- Binput::get('notify', true),
- Binput::get('stickied', false),
+ (bool) Binput::get('notify', true),
+ (bool) Binput::get('stickied', false),
Binput::get('occurred_at'),
Binput::get('template'),
Binput::get('vars', [])
@@ -125,9 +126,9 @@ public function putIncident(Incident $incident)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteIncident(Incident $incident)
+ public function destroy(Incident $incident)
{
- dispatch(new RemoveIncidentCommand($incident));
+ execute(new RemoveIncidentCommand($incident));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/IncidentTemplateController.php b/app/Http/Controllers/Api/IncidentTemplateController.php
new file mode 100644
index 000000000000..3f1ba4183566
--- /dev/null
+++ b/app/Http/Controllers/Api/IncidentTemplateController.php
@@ -0,0 +1,51 @@
+sort($sortBy, $direction);
+ }
+
+ $templates = $templates->paginate(Binput::get('per_page', 20));
+
+ return $this->paginator($templates, Request::instance());
+ }
+
+ /**
+ * Get a single incident templates.
+ *
+ * @param \CachetHQ\Cachet\Models\IncidentTemplate $incidentTemplate
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function show(IncidentTemplate $incidentTemplate)
+ {
+ return $this->item($incidentTemplate);
+ }
+}
diff --git a/app/Http/Controllers/Api/IncidentUpdateController.php b/app/Http/Controllers/Api/IncidentUpdateController.php
index 73faf3794696..0c239a6a4310 100644
--- a/app/Http/Controllers/Api/IncidentUpdateController.php
+++ b/app/Http/Controllers/Api/IncidentUpdateController.php
@@ -36,9 +36,9 @@ class IncidentUpdateController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getIncidentUpdates(Incident $incident)
+ public function index(Incident $incident)
{
- $updates = IncidentUpdate::orderBy('created_at', 'desc');
+ $updates = $incident->updates()->orderBy('created_at', 'desc');
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
@@ -59,7 +59,7 @@ public function getIncidentUpdates(Incident $incident)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getIncidentUpdate(Incident $incident, IncidentUpdate $update)
+ public function show(Incident $incident, IncidentUpdate $update)
{
return $this->item($update);
}
@@ -71,13 +71,15 @@ public function getIncidentUpdate(Incident $incident, IncidentUpdate $update)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postIncidentUpdate(Incident $incident)
+ public function store(Incident $incident)
{
try {
- $update = dispatch(new CreateIncidentUpdateCommand(
+ $update = execute(new CreateIncidentUpdateCommand(
$incident,
Binput::get('status'),
Binput::get('message'),
+ Binput::get('component_id'),
+ Binput::get('component_status'),
Auth::user()
));
} catch (QueryException $e) {
@@ -95,10 +97,10 @@ public function postIncidentUpdate(Incident $incident)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putIncidentUpdate(Incident $incident, IncidentUpdate $update)
+ public function update(Incident $incident, IncidentUpdate $update)
{
try {
- $update = dispatch(new UpdateIncidentUpdateCommand(
+ $update = execute(new UpdateIncidentUpdateCommand(
$update,
Binput::get('status'),
Binput::get('message'),
@@ -119,10 +121,10 @@ public function putIncidentUpdate(Incident $incident, IncidentUpdate $update)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteIncidentUpdate(Incident $incident, IncidentUpdate $update)
+ public function destroy(Incident $incident, IncidentUpdate $update)
{
try {
- dispatch(new RemoveIncidentUpdateCommand($update));
+ execute(new RemoveIncidentUpdateCommand($update));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
diff --git a/app/Http/Controllers/Api/MetricController.php b/app/Http/Controllers/Api/MetricController.php
index 39d6fc2018cd..4ef2e1e4fd38 100644
--- a/app/Http/Controllers/Api/MetricController.php
+++ b/app/Http/Controllers/Api/MetricController.php
@@ -27,7 +27,7 @@ class MetricController extends AbstractApiController
*
* @return \Illuminate\Database\Eloquent\Collection
*/
- public function getMetrics()
+ public function index()
{
$metrics = Metric::query();
@@ -49,34 +49,20 @@ public function getMetrics()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getMetric(Metric $metric)
+ public function show(Metric $metric)
{
return $this->item($metric);
}
- /**
- * Get all metric points.
- *
- * @param \CachetHQ\Cachet\Models\Metric $metric
- *
- * @return \Illuminate\Database\Eloquent\Collection
- */
- public function getMetricPoints(Metric $metric)
- {
- $points = $metric->points()->paginate(Binput::get('per_page', 20));
-
- return $this->paginator($points, Request::instance());
- }
-
/**
* Create a new metric.
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postMetrics()
+ public function store()
{
try {
- $metric = dispatch(new CreateMetricCommand(
+ $metric = execute(new CreateMetricCommand(
Binput::get('name'),
Binput::get('suffix'),
Binput::get('description'),
@@ -103,10 +89,10 @@ public function postMetrics()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putMetric(Metric $metric)
+ public function update(Metric $metric)
{
try {
- $metric = dispatch(new UpdateMetricCommand(
+ $metric = execute(new UpdateMetricCommand(
$metric,
Binput::get('name'),
Binput::get('suffix'),
@@ -134,9 +120,9 @@ public function putMetric(Metric $metric)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteMetric(Metric $metric)
+ public function destroy(Metric $metric)
{
- dispatch(new RemoveMetricCommand($metric));
+ execute(new RemoveMetricCommand($metric));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/MetricPointController.php b/app/Http/Controllers/Api/MetricPointController.php
index 09ddff66ed81..8afb5c59ed11 100644
--- a/app/Http/Controllers/Api/MetricPointController.php
+++ b/app/Http/Controllers/Api/MetricPointController.php
@@ -18,6 +18,7 @@
use CachetHQ\Cachet\Models\MetricPoint;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Database\QueryException;
+use Illuminate\Support\Facades\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class MetricPointController extends AbstractApiController
@@ -30,9 +31,11 @@ class MetricPointController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getMetricPoints(Metric $metric, MetricPoint $metricPoint)
+ public function index(Metric $metric, MetricPoint $metricPoint)
{
- return $this->item($metricPoint);
+ $points = $metric->points()->paginate(Binput::get('per_page', 20));
+
+ return $this->paginator($points, Request::instance());
}
/**
@@ -42,10 +45,10 @@ public function getMetricPoints(Metric $metric, MetricPoint $metricPoint)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postMetricPoints(Metric $metric)
+ public function store(Metric $metric)
{
try {
- $metricPoint = dispatch(new CreateMetricPointCommand(
+ $metricPoint = execute(new CreateMetricPointCommand(
$metric,
Binput::get('value'),
Binput::get('timestamp')
@@ -61,13 +64,13 @@ public function postMetricPoints(Metric $metric)
* Updates a metric point.
*
* @param \CachetHQ\Cachet\Models\Metric $metric
- * @param \CachetHQ\Cachet\Models\MetircPoint $metricPoint
+ * @param \CachetHQ\Cachet\Models\MetricPoint $metricPoint
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putMetricPoint(Metric $metric, MetricPoint $metricPoint)
+ public function update(Metric $metric, MetricPoint $metricPoint)
{
- $metricPoint = dispatch(new UpdateMetricPointCommand(
+ $metricPoint = execute(new UpdateMetricPointCommand(
$metricPoint,
$metric,
Binput::get('value'),
@@ -85,9 +88,9 @@ public function putMetricPoint(Metric $metric, MetricPoint $metricPoint)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteMetricPoint(Metric $metric, MetricPoint $metricPoint)
+ public function destroy(Metric $metric, MetricPoint $metricPoint)
{
- dispatch(new RemoveMetricPointCommand($metricPoint));
+ execute(new RemoveMetricPointCommand($metricPoint));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/ScheduleController.php b/app/Http/Controllers/Api/ScheduleController.php
index 2838d2958f8e..c59f46dbd62c 100644
--- a/app/Http/Controllers/Api/ScheduleController.php
+++ b/app/Http/Controllers/Api/ScheduleController.php
@@ -32,9 +32,9 @@ class ScheduleController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getSchedules()
+ public function index()
{
- $schedule = Schedule::whereRaw('1 = 1');
+ $schedule = Schedule::query();
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
@@ -54,7 +54,7 @@ public function getSchedules()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getSchedule(Schedule $schedule)
+ public function show(Schedule $schedule)
{
return $this->item($schedule);
}
@@ -64,16 +64,17 @@ public function getSchedule(Schedule $schedule)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postSchedule()
+ public function store()
{
try {
- $schedule = dispatch(new CreateScheduleCommand(
+ $schedule = execute(new CreateScheduleCommand(
Binput::get('name'),
Binput::get('message', null, false, false),
Binput::get('status'),
Binput::get('scheduled_at'),
Binput::get('completed_at'),
- Binput::get('components', [])
+ Binput::get('components', []),
+ Binput::get('notify', false)
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
@@ -89,10 +90,10 @@ public function postSchedule()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function putSchedule(Schedule $schedule)
+ public function update(Schedule $schedule)
{
try {
- $schedule = dispatch(new UpdateScheduleCommand(
+ $schedule = execute(new UpdateScheduleCommand(
$schedule,
Binput::get('name'),
Binput::get('message'),
@@ -115,10 +116,10 @@ public function putSchedule(Schedule $schedule)
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteSchedule(Schedule $schedule)
+ public function destroy(Schedule $schedule)
{
try {
- dispatch(new DeleteScheduleCommand($schedule));
+ execute(new DeleteScheduleCommand($schedule));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
diff --git a/app/Http/Controllers/Api/SubscriberController.php b/app/Http/Controllers/Api/SubscriberController.php
index e7dfb1a76fcc..621aa06d70bb 100644
--- a/app/Http/Controllers/Api/SubscriberController.php
+++ b/app/Http/Controllers/Api/SubscriberController.php
@@ -13,9 +13,7 @@
use CachetHQ\Cachet\Bus\Commands\Subscriber\SubscribeSubscriberCommand;
use CachetHQ\Cachet\Bus\Commands\Subscriber\UnsubscribeSubscriberCommand;
-use CachetHQ\Cachet\Bus\Commands\Subscriber\UnsubscribeSubscriptionCommand;
use CachetHQ\Cachet\Models\Subscriber;
-use CachetHQ\Cachet\Models\Subscription;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Database\QueryException;
@@ -35,7 +33,7 @@ class SubscriberController extends AbstractApiController
*
* @return \Illuminate\Http\JsonResponse
*/
- public function getSubscribers()
+ public function index()
{
$subscribers = Subscriber::paginate(Binput::get('per_page', 20));
@@ -47,12 +45,12 @@ public function getSubscribers()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function postSubscribers()
+ public function store()
{
$verified = Binput::get('verify', app(Repository::class)->get('setting.skip_subscriber_verification'));
try {
- $subscriber = dispatch(new SubscribeSubscriberCommand(Binput::get('email'), $verified, Binput::get('components', null)));
+ $subscriber = execute(new SubscribeSubscriberCommand(Binput::get('email'), $verified, Binput::get('components', null)));
} catch (QueryException $e) {
throw new BadRequestHttpException();
}
@@ -67,23 +65,9 @@ public function postSubscribers()
*
* @return \Illuminate\Http\JsonResponse
*/
- public function deleteSubscriber(Subscriber $subscriber)
+ public function destroy(Subscriber $subscriber)
{
- dispatch(new UnsubscribeSubscriberCommand($subscriber));
-
- return $this->noContent();
- }
-
- /**
- * Delete a subscriber.
- *
- * @param \CachetHQ\Cachet\Models\Subscriber $subscriber
- *
- * @return \Illuminate\Http\JsonResponse
- */
- public function deleteSubscription(Subscription $subscriber)
- {
- dispatch(new UnsubscribeSubscriptionCommand($subscriber));
+ execute(new UnsubscribeSubscriberCommand($subscriber));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Api/SubscriptionController.php b/app/Http/Controllers/Api/SubscriptionController.php
new file mode 100644
index 000000000000..173a5e0ffc9e
--- /dev/null
+++ b/app/Http/Controllers/Api/SubscriptionController.php
@@ -0,0 +1,37 @@
+
+ */
+class SubscriptionController extends AbstractApiController
+{
+ /**
+ * Delete a subscription.
+ *
+ * @param \CachetHQ\Cachet\Models\Subscription $subscription
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function destroy(Subscription $subscription)
+ {
+ execute(new UnsubscribeSubscriptionCommand($subscription));
+
+ return $this->noContent();
+ }
+}
diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php
index 70d0d0105ae5..597b9b51893a 100644
--- a/app/Http/Controllers/AuthController.php
+++ b/app/Http/Controllers/AuthController.php
@@ -17,11 +17,12 @@
use CachetHQ\Cachet\Bus\Events\User\UserPassedTwoAuthEvent;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
+use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
-use PragmaRX\Google2FA\Vendor\Laravel\Facade as Google2FA;
+use PragmaRX\Google2FA\Google2FA;
class AuthController extends Controller
{
@@ -47,9 +48,9 @@ public function postLogin()
// Login with username or email.
$loginKey = filter_var($loginData['username'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
- $loginData[$loginKey] = array_pull($loginData, 'username');
+ $loginData[$loginKey] = Arr::pull($loginData, 'username');
- $rememberUser = array_pull($loginData, 'remember_me') === '1';
+ $rememberUser = Arr::pull($loginData, 'remember_me') === '1';
// Validate login credentials.
if (Auth::validate($loginData)) {
@@ -88,6 +89,10 @@ public function showTwoFactorAuth()
*
* This feels very hacky, but we have to juggle authentication and codes.
*
+ * @throws \PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException
+ * @throws \PragmaRX\Google2FA\Exceptions\InvalidCharactersException
+ * @throws \PragmaRX\Google2FA\Exceptions\SecretKeyTooShortException
+ *
* @return \Illuminate\Http\RedirectResponse
*/
public function postTwoFactor()
@@ -99,16 +104,19 @@ public function postTwoFactor()
// Maybe a temp login here.
Auth::loginUsingId($userId);
- $valid = Google2FA::verifyKey(Auth::user()->google_2fa_secret, $code);
+ $user = Auth::user();
+
+ $google2fa = new Google2FA();
+ $valid = $google2fa->verifyKey($user->google_2fa_secret, $code);
if ($valid) {
- event(new UserPassedTwoAuthEvent(Auth::user()));
+ event(new UserPassedTwoAuthEvent($user));
- event(new UserLoggedInEvent(Auth::user()));
+ event(new UserLoggedInEvent($user));
return Redirect::intended('dashboard');
} else {
- event(new UserFailedTwoAuthEvent(Auth::user()));
+ event(new UserFailedTwoAuthEvent($user));
// Failed login, log back out.
Auth::logout();
@@ -131,6 +139,6 @@ public function logoutAction()
Auth::logout();
- return Redirect::to('/');
+ return cachet_redirect('status-page');
}
}
diff --git a/app/Http/Controllers/Dashboard/ApiController.php b/app/Http/Controllers/Dashboard/ApiController.php
index 9cc80c4e8e3d..4e59a7a40c17 100644
--- a/app/Http/Controllers/Dashboard/ApiController.php
+++ b/app/Http/Controllers/Dashboard/ApiController.php
@@ -36,7 +36,7 @@ class ApiController extends AbstractApiController
public function postUpdateComponent(Component $component)
{
try {
- dispatch(new UpdateComponentCommand(
+ execute(new UpdateComponentCommand(
$component,
$component->name,
$component->description,
@@ -46,7 +46,8 @@ public function postUpdateComponent(Component $component)
$component->group_id,
$component->enabled,
$component->meta,
- false
+ $component->tags,
+ true // Silent mode
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
@@ -68,7 +69,7 @@ public function postUpdateComponentOrder()
try {
$component = Component::find($componentId);
- dispatch(new UpdateComponentCommand(
+ execute(new UpdateComponentCommand(
$component,
$component->name,
$component->description,
@@ -78,7 +79,8 @@ public function postUpdateComponentOrder()
$component->group_id,
$component->enabled,
$component->meta,
- true
+ $component->tags,
+ true // Silent mode
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
@@ -100,7 +102,7 @@ public function postUpdateComponentGroupOrder()
foreach ($groupData as $order => $groupId) {
$group = ComponentGroup::find($groupId);
- dispatch(new UpdateComponentGroupCommand(
+ execute(new UpdateComponentGroupCommand(
$group,
$group->name,
$order + 1,
diff --git a/app/Http/Controllers/Dashboard/ComponentController.php b/app/Http/Controllers/Dashboard/ComponentController.php
index dd991db1a2d1..c9c8e6792e1e 100644
--- a/app/Http/Controllers/Dashboard/ComponentController.php
+++ b/app/Http/Controllers/Dashboard/ComponentController.php
@@ -15,16 +15,17 @@
use CachetHQ\Cachet\Bus\Commands\Component\CreateComponentCommand;
use CachetHQ\Cachet\Bus\Commands\Component\RemoveComponentCommand;
use CachetHQ\Cachet\Bus\Commands\Component\UpdateComponentCommand;
-use CachetHQ\Cachet\Bus\Commands\ComponentGroup\CreateComponentGroupCommand;
-use CachetHQ\Cachet\Bus\Commands\ComponentGroup\RemoveComponentGroupCommand;
-use CachetHQ\Cachet\Bus\Commands\ComponentGroup\UpdateComponentGroupCommand;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
-use CachetHQ\Cachet\Models\Tag;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\View;
+/**
+ * This is the component controller class.
+ *
+ * @author James Brooks
+ */
class ComponentController extends Controller
{
/**
@@ -57,8 +58,8 @@ public function __construct()
];
View::share([
- 'sub_menu' => $this->subMenu,
- 'sub_title' => trans_choice('dashboard.components.components', 2),
+ 'subMenu' => $this->subMenu,
+ 'subTitle' => trans_choice('dashboard.components.components', 2),
]);
}
@@ -69,7 +70,7 @@ public function __construct()
*/
public function showComponents()
{
- $components = Component::orderBy('order')->orderBy('created_at')->get();
+ $components = Component::with('group')->orderBy('order')->orderBy('created_at')->get();
$this->subMenu['components']['active'] = true;
@@ -79,21 +80,6 @@ public function showComponents()
->withSubMenu($this->subMenu);
}
- /**
- * Shows the component groups view.
- *
- * @return \Illuminate\View\View
- */
- public function showComponentGroups()
- {
- $this->subMenu['groups']['active'] = true;
-
- return View::make('dashboard.components.groups.index')
- ->withPageTitle(trans_choice('dashboard.components.groups.groups', 2).' - '.trans('dashboard.dashboard'))
- ->withGroups(ComponentGroup::orderBy('order')->get())
- ->withSubMenu($this->subMenu);
- }
-
/**
* Shows the edit component view.
*
@@ -123,10 +109,9 @@ public function showEditComponent(Component $component)
public function updateComponentAction(Component $component)
{
$componentData = Binput::get('component');
- $tags = array_pull($componentData, 'tags');
try {
- $component = dispatch(new UpdateComponentCommand(
+ $component = execute(new UpdateComponentCommand(
$component,
$componentData['name'],
$componentData['description'],
@@ -136,6 +121,7 @@ public function updateComponentAction(Component $component)
$componentData['group_id'],
$componentData['enabled'],
null, // Meta data cannot be supplied through the dashboard yet.
+ $componentData['tags'], // Meta data cannot be supplied through the dashboard yet.
true // Silent since we're not really making changes to the component (this should be optional)
));
} catch (ValidationException $e) {
@@ -145,16 +131,6 @@ public function updateComponentAction(Component $component)
->withErrors($e->getMessageBag());
}
- // The component was added successfully, so now let's deal with the tags.
- $tags = preg_split('/ ?, ?/', $tags);
-
- // For every tag, do we need to create it?
- $componentTags = array_map(function ($taggable) use ($component) {
- return Tag::firstOrCreate(['name' => $taggable])->id;
- }, $tags);
-
- $component->tags()->sync($componentTags);
-
return cachet_redirect('dashboard.components.edit', [$component->id])
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.edit.success')));
}
@@ -179,10 +155,9 @@ public function showAddComponent()
public function createComponentAction()
{
$componentData = Binput::get('component');
- $tags = array_pull($componentData, 'tags');
try {
- $component = dispatch(new CreateComponentCommand(
+ $component = execute(new CreateComponentCommand(
$componentData['name'],
$componentData['description'],
$componentData['status'],
@@ -190,7 +165,8 @@ public function createComponentAction()
$componentData['order'],
$componentData['group_id'],
$componentData['enabled'],
- null // Meta data cannot be supplied through the dashboard yet.
+ null, // Meta data cannot be supplied through the dashboard yet.
+ $componentData['tags']
));
} catch (ValidationException $e) {
return cachet_redirect('dashboard.components.create')
@@ -199,16 +175,6 @@ public function createComponentAction()
->withErrors($e->getMessageBag());
}
- // The component was added successfully, so now let's deal with the tags.
- $tags = preg_split('/ ?, ?/', $tags);
-
- // For every tag, do we need to create it?
- $componentTags = array_map(function ($taggable) use ($component) {
- return Tag::firstOrCreate(['name' => $taggable])->id;
- }, $tags);
-
- $component->tags()->sync($componentTags);
-
return cachet_redirect('dashboard.components')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.add.success')));
}
@@ -222,102 +188,9 @@ public function createComponentAction()
*/
public function deleteComponentAction(Component $component)
{
- dispatch(new RemoveComponentCommand($component));
+ execute(new RemoveComponentCommand($component));
return cachet_redirect('dashboard.components')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.delete.success')));
}
-
- /**
- * Deletes a given component group.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup $group
- *
- * @return \Illuminate\Http\RedirectResponse
- */
- public function deleteComponentGroupAction(ComponentGroup $group)
- {
- dispatch(new RemoveComponentGroupCommand($group));
-
- return cachet_redirect('dashboard.components.groups')
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.delete.success')));
- }
-
- /**
- * Shows the add component group view.
- *
- * @return \Illuminate\View\View
- */
- public function showAddComponentGroup()
- {
- return View::make('dashboard.components.groups.add')
- ->withPageTitle(trans('dashboard.components.groups.add.title').' - '.trans('dashboard.dashboard'));
- }
-
- /**
- * Shows the edit component group view.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup $group
- *
- * @return \Illuminate\View\View
- */
- public function showEditComponentGroup(ComponentGroup $group)
- {
- return View::make('dashboard.components.groups.edit')
- ->withPageTitle(trans('dashboard.components.groups.edit.title').' - '.trans('dashboard.dashboard'))
- ->withGroup($group);
- }
-
- /**
- * Creates a new component.
- *
- * @return \Illuminate\Http\RedirectResponse
- */
- public function postAddComponentGroup()
- {
- try {
- $group = dispatch(new CreateComponentGroupCommand(
- Binput::get('name'),
- Binput::get('order', 0),
- Binput::get('collapsed'),
- Binput::get('visible')
- ));
- } catch (ValidationException $e) {
- return cachet_redirect('dashboard.components.groups.create')
- ->withInput(Binput::all())
- ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.add.failure')))
- ->withErrors($e->getMessageBag());
- }
-
- return cachet_redirect('dashboard.components.groups')
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.add.success')));
- }
-
- /**
- * Updates a component group.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup $group
- *
- * @return \Illuminate\Http\RedirectResponse
- */
- public function updateComponentGroupAction(ComponentGroup $group)
- {
- try {
- $group = dispatch(new UpdateComponentGroupCommand(
- $group,
- Binput::get('name'),
- $group->order,
- Binput::get('collapsed'),
- Binput::get('visible')
- ));
- } catch (ValidationException $e) {
- return cachet_redirect('dashboard.components.groups.edit', [$group->id])
- ->withInput(Binput::all())
- ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.edit.failure')))
- ->withErrors($e->getMessageBag());
- }
-
- return cachet_redirect('dashboard.components.groups.edit', [$group->id])
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.edit.success')));
- }
}
diff --git a/app/Http/Controllers/Dashboard/ComponentGroupController.php b/app/Http/Controllers/Dashboard/ComponentGroupController.php
new file mode 100644
index 000000000000..ad81afc9f00e
--- /dev/null
+++ b/app/Http/Controllers/Dashboard/ComponentGroupController.php
@@ -0,0 +1,173 @@
+
+ */
+class ComponentGroupController extends Controller
+{
+ /**
+ * Array of sub-menu items.
+ *
+ * @var array
+ */
+ protected $subMenu = [];
+
+ /**
+ * Creates a new component controller instance.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ $this->subMenu = [
+ 'components' => [
+ 'title' => trans('dashboard.components.components'),
+ 'url' => cachet_route('dashboard.components'),
+ 'icon' => 'ion-ios-browsers',
+ 'active' => false,
+ ],
+ 'groups' => [
+ 'title' => trans_choice('dashboard.components.groups.groups', 2),
+ 'url' => cachet_route('dashboard.components.groups'),
+ 'icon' => 'ion-folder',
+ 'active' => false,
+ ],
+ ];
+
+ View::share([
+ 'sub_menu' => $this->subMenu,
+ 'subTitle' => trans_choice('dashboard.components.components', 2),
+ ]);
+ }
+
+ /**
+ * Shows the component groups view.
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showComponentGroups()
+ {
+ $this->subMenu['groups']['active'] = true;
+
+ return View::make('dashboard.components.groups.index')
+ ->withPageTitle(trans_choice('dashboard.components.groups.groups', 2).' - '.trans('dashboard.dashboard'))
+ ->withGroups(ComponentGroup::orderBy('order')->get())
+ ->withSubMenu($this->subMenu);
+ }
+
+ /**
+ * Deletes a given component group.
+ *
+ * @param \CachetHQ\Cachet\Models\ComponentGroup $group
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function deleteComponentGroupAction(ComponentGroup $group)
+ {
+ execute(new RemoveComponentGroupCommand($group));
+
+ return cachet_redirect('dashboard.components.groups')
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.delete.success')));
+ }
+
+ /**
+ * Shows the add component group view.
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showAddComponentGroup()
+ {
+ return View::make('dashboard.components.groups.add')
+ ->withPageTitle(trans('dashboard.components.groups.add.title').' - '.trans('dashboard.dashboard'));
+ }
+
+ /**
+ * Shows the edit component group view.
+ *
+ * @param \CachetHQ\Cachet\Models\ComponentGroup $group
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showEditComponentGroup(ComponentGroup $group)
+ {
+ return View::make('dashboard.components.groups.edit')
+ ->withPageTitle(trans('dashboard.components.groups.edit.title').' - '.trans('dashboard.dashboard'))
+ ->withGroup($group);
+ }
+
+ /**
+ * Creates a new component.
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postAddComponentGroup()
+ {
+ try {
+ $group = execute(new CreateComponentGroupCommand(
+ Binput::get('name'),
+ Binput::get('order', 0),
+ Binput::get('collapsed'),
+ Binput::get('visible')
+ ));
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.components.groups.create')
+ ->withInput(Binput::all())
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.add.failure')))
+ ->withErrors($e->getMessageBag());
+ }
+
+ return cachet_redirect('dashboard.components.groups')
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.add.success')));
+ }
+
+ /**
+ * Updates a component group.
+ *
+ * @param \CachetHQ\Cachet\Models\ComponentGroup $group
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function updateComponentGroupAction(ComponentGroup $group)
+ {
+ try {
+ $group = execute(new UpdateComponentGroupCommand(
+ $group,
+ Binput::get('name'),
+ $group->order,
+ Binput::get('collapsed'),
+ Binput::get('visible')
+ ));
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.components.groups.edit', [$group->id])
+ ->withInput(Binput::all())
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.edit.failure')))
+ ->withErrors($e->getMessageBag());
+ }
+
+ return cachet_redirect('dashboard.components.groups.edit', [$group->id])
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.edit.success')));
+ }
+}
diff --git a/app/Http/Controllers/Dashboard/DashboardController.php b/app/Http/Controllers/Dashboard/DashboardController.php
index 13f4d2d9dbf4..2d5281a19e85 100644
--- a/app/Http/Controllers/Dashboard/DashboardController.php
+++ b/app/Http/Controllers/Dashboard/DashboardController.php
@@ -48,7 +48,7 @@ class DashboardController extends Controller
/**
* The feed integration.
*
- * @var \CachetHQ\Cachet\Integrations\Feed
+ * @var \CachetHQ\Cachet\Integrations\Contracts\Feed
*/
protected $feed;
@@ -62,8 +62,8 @@ class DashboardController extends Controller
/**
* Creates a new dashboard controller instance.
*
- * @param \CachetHQ\Cachet\Integrations\Feed $feed
- * @param \Illuminate\Contracts\Auth\Guard $guard
+ * @param \CachetHQ\Cachet\Integrations\Contracts\Feed $feed
+ * @param \Illuminate\Contracts\Auth\Guard $guard
*
* @return void
*/
@@ -101,12 +101,14 @@ public function showDashboard()
$welcomeUser = !Auth::user()->welcomed;
if ($welcomeUser) {
- dispatch(new WelcomeUserCommand(Auth::user()));
+ execute(new WelcomeUserCommand(Auth::user()));
}
$entries = null;
- if ($feed = $this->feed->latest()) {
- $entries = array_slice($feed->channel->item, 0, 5);
+ if ($feed = $this->feed->latest() !== 1) {
+ if (is_object($feed)) {
+ $entries = array_slice($feed->channel->item, 0, 5);
+ }
}
return View::make('dashboard.index')
diff --git a/app/Http/Controllers/Dashboard/IncidentController.php b/app/Http/Controllers/Dashboard/IncidentController.php
index c1aa9a05f5f2..f5555aa0bb9c 100644
--- a/app/Http/Controllers/Dashboard/IncidentController.php
+++ b/app/Http/Controllers/Dashboard/IncidentController.php
@@ -15,7 +15,7 @@
use CachetHQ\Cachet\Bus\Commands\Incident\CreateIncidentCommand;
use CachetHQ\Cachet\Bus\Commands\Incident\RemoveIncidentCommand;
use CachetHQ\Cachet\Bus\Commands\Incident\UpdateIncidentCommand;
-use CachetHQ\Cachet\Bus\Commands\IncidentUpdate\CreateIncidentUpdateCommand;
+use CachetHQ\Cachet\Integrations\Contracts\System;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
@@ -46,6 +46,13 @@ class IncidentController extends Controller
*/
protected $auth;
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
/**
* Creates a new incident controller instance.
*
@@ -53,11 +60,12 @@ class IncidentController extends Controller
*
* @return void
*/
- public function __construct(Guard $auth)
+ public function __construct(Guard $auth, System $system)
{
$this->auth = $auth;
+ $this->system = $system;
- View::share('sub_title', trans('dashboard.incidents.title'));
+ View::share('subTitle', trans('dashboard.incidents.title'));
}
/**
@@ -67,7 +75,7 @@ public function __construct(Guard $auth)
*/
public function showIncidents()
{
- $incidents = Incident::orderBy('created_at', 'desc')->get();
+ $incidents = Incident::with('user')->orderBy('created_at', 'desc')->get();
return View::make('dashboard.incidents.index')
->withPageTitle(trans('dashboard.incidents.incidents').' - '.trans('dashboard.dashboard'))
@@ -85,6 +93,7 @@ public function showAddIncident()
->withPageTitle(trans('dashboard.incidents.add.title').' - '.trans('dashboard.dashboard'))
->withComponentsInGroups(ComponentGroup::with('components')->get())
->withComponentsOutGroups(Component::where('group_id', '=', 0)->get())
+ ->withNotificationsEnabled($this->system->canNotifySubscribers())
->withIncidentTemplates(IncidentTemplate::all());
}
@@ -108,7 +117,7 @@ public function showTemplates()
public function createIncidentAction()
{
try {
- $incident = dispatch(new CreateIncidentCommand(
+ $incident = execute(new CreateIncidentCommand(
Binput::get('name'),
Binput::get('status'),
Binput::get('message', null, false, false),
@@ -119,7 +128,8 @@ public function createIncidentAction()
Binput::get('stickied', false),
Binput::get('occurred_at'),
null,
- []
+ [],
+ ['seo' => Binput::get('seo', [])]
));
} catch (ValidationException $e) {
return cachet_redirect('dashboard.incidents.create')
@@ -204,7 +214,7 @@ public function createIncidentTemplateAction()
*/
public function deleteIncidentAction(Incident $incident)
{
- dispatch(new RemoveIncidentCommand($incident));
+ execute(new RemoveIncidentCommand($incident));
return cachet_redirect('dashboard.incidents')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.delete.success')));
@@ -223,7 +233,8 @@ public function showEditIncidentAction(Incident $incident)
->withPageTitle(trans('dashboard.incidents.edit.title').' - '.trans('dashboard.dashboard'))
->withIncident($incident)
->withComponentsInGroups(ComponentGroup::with('components')->get())
- ->withComponentsOutGroups(Component::where('group_id', '=', 0)->get());
+ ->withComponentsOutGroups(Component::where('group_id', '=', 0)->get())
+ ->withNotificationsEnabled($this->system->canNotifySubscribers());
}
/**
@@ -236,7 +247,7 @@ public function showEditIncidentAction(Incident $incident)
public function editIncidentAction(Incident $incident)
{
try {
- $incident = dispatch(new UpdateIncidentCommand(
+ $incident = execute(new UpdateIncidentCommand(
$incident,
Binput::get('name'),
Binput::get('status'),
@@ -248,7 +259,8 @@ public function editIncidentAction(Incident $incident)
Binput::get('stickied', false),
Binput::get('occurred_at'),
null,
- []
+ [],
+ ['seo' => Binput::get('seo', [])]
));
} catch (ValidationException $e) {
return cachet_redirect('dashboard.incidents.edit', ['id' => $incident->id])
@@ -285,43 +297,4 @@ public function editTemplateAction(IncidentTemplate $template)
return cachet_redirect('dashboard.templates.edit', ['id' => $template->id])
->withUpdatedTemplate($template);
}
-
- /**
- * Shows the incident update form.
- *
- * @param \CachetHQ\Cachet\Models\Incident $incident
- *
- * @return \Illuminate\View\View
- */
- public function showIncidentUpdateAction(Incident $incident)
- {
- return View::make('dashboard.incidents.update')->withIncident($incident);
- }
-
- /**
- * Creates a new incident update.
- *
- * @param \CachetHQ\Cachet\Models\Incident $incident
- *
- * @return \Illuminate\Http\RedirectResponse
- */
- public function createIncidentUpdateAction(Incident $incident)
- {
- try {
- $incident = dispatch(new CreateIncidentUpdateCommand(
- $incident,
- Binput::get('status'),
- Binput::get('message'),
- $this->auth->user()
- ));
- } catch (ValidationException $e) {
- return cachet_redirect('dashboard.incidents.updates', ['id' => $incident->id])
- ->withInput(Binput::all())
- ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.incidents.templates.edit.failure')))
- ->withErrors($e->getMessageBag());
- }
-
- return cachet_redirect('dashboard.incidents')
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.delete.success')));
- }
}
diff --git a/app/Http/Controllers/Dashboard/IncidentTemplateController.php b/app/Http/Controllers/Dashboard/IncidentTemplateController.php
new file mode 100644
index 000000000000..853b5b2baec1
--- /dev/null
+++ b/app/Http/Controllers/Dashboard/IncidentTemplateController.php
@@ -0,0 +1,161 @@
+
+ */
+class IncidentTemplateController extends Controller
+{
+ /**
+ * Stores the sub-sidebar tree list.
+ *
+ * @var array
+ */
+ protected $subMenu = [];
+
+ /**
+ * The guard instance.
+ *
+ * @var \Illuminate\Contracts\Auth\Guard
+ */
+ protected $auth;
+
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
+ /**
+ * Creates a new incident controller instance.
+ *
+ * @param \Illuminate\Contracts\Auth\Guard $auth
+ *
+ * @return void
+ */
+ public function __construct(Guard $auth, System $system)
+ {
+ $this->auth = $auth;
+ $this->system = $system;
+
+ View::share('sub_title', trans('dashboard.incidents.title'));
+ }
+
+ /**
+ * Shows the incident templates.
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showTemplates()
+ {
+ return View::make('dashboard.templates.index')
+ ->withPageTitle(trans('dashboard.incidents.templates.title').' - '.trans('dashboard.dashboard'))
+ ->withIncidentTemplates(IncidentTemplate::all());
+ }
+
+ /**
+ * Shows the add incident template view.
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showAddIncidentTemplate()
+ {
+ return View::make('dashboard.templates.add')
+ ->withPageTitle(trans('dashboard.incidents.templates.add.title').' - '.trans('dashboard.dashboard'));
+ }
+
+ /**
+ * Shows the edit incident template view.
+ *
+ * @param \CachetHQ\Cachet\Models\IncidentTemplate $template
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showEditTemplateAction(IncidentTemplate $template)
+ {
+ return View::make('dashboard.templates.edit')
+ ->withPageTitle(trans('dashboard.incidents.templates.edit.title').' - '.trans('dashboard.dashboard'))
+ ->withTemplate($template);
+ }
+
+ /**
+ * Deletes an incident template.
+ *
+ * @param \CachetHQ\Cachet\Models\IncidentTemplate $template
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function deleteTemplateAction(IncidentTemplate $template)
+ {
+ $template->delete();
+
+ return cachet_redirect('dashboard.templates')
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.templates.delete.success')));
+ }
+
+ /**
+ * Creates a new incident template.
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function createIncidentTemplateAction()
+ {
+ try {
+ IncidentTemplate::create([
+ 'name' => Binput::get('name'),
+ 'template' => Binput::get('template', null, false, false),
+ ]);
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.templates.create')
+ ->withInput(Binput::all())
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.incidents.templates.add.failure')))
+ ->withErrors($e->getMessageBag());
+ }
+
+ return cachet_redirect('dashboard.templates')
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.templates.add.success')));
+ }
+
+ /**
+ * Edit an incident template.
+ *
+ * @param \CachetHQ\Cachet\Models\IncidentTemplate $template
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function editTemplateAction(IncidentTemplate $template)
+ {
+ try {
+ $template->update(Binput::get('template'));
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.templates.edit', ['id' => $template->id])
+ ->withUpdatedTemplate($template)
+ ->withTemplateErrors($e->getMessageBag()->getErrors());
+ }
+
+ return cachet_redirect('dashboard.templates.edit', ['id' => $template->id])
+ ->withUpdatedTemplate($template);
+ }
+}
diff --git a/app/Http/Controllers/Dashboard/IncidentUpdateController.php b/app/Http/Controllers/Dashboard/IncidentUpdateController.php
new file mode 100644
index 000000000000..092809e374dc
--- /dev/null
+++ b/app/Http/Controllers/Dashboard/IncidentUpdateController.php
@@ -0,0 +1,172 @@
+
+ */
+class IncidentUpdateController extends Controller
+{
+ /**
+ * Stores the sub-sidebar tree list.
+ *
+ * @var array
+ */
+ protected $subMenu = [];
+
+ /**
+ * The guard instance.
+ *
+ * @var \Illuminate\Contracts\Auth\Guard
+ */
+ protected $auth;
+
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
+ /**
+ * Creates a new incident controller instance.
+ *
+ * @param \Illuminate\Contracts\Auth\Guard $auth
+ *
+ * @return void
+ */
+ public function __construct(Guard $auth, System $system)
+ {
+ $this->auth = $auth;
+ $this->system = $system;
+
+ View::share('sub_title', trans('dashboard.incidents.title'));
+ }
+
+ /**
+ * Shows the incident update form.
+ *
+ * @param \CachetHQ\Cachet\Models\Incident $incident
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showIncidentUpdates(Incident $incident)
+ {
+ return View::make('dashboard.incidents.updates.index')->withIncident($incident);
+ }
+
+ /**
+ * Shows the incident update form.
+ *
+ * @param \CachetHQ\Cachet\Models\Incident $incident
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showCreateIncidentUpdateAction(Incident $incident)
+ {
+ return View::make('dashboard.incidents.updates.add')
+ ->withIncident($incident)
+ ->withIncidentTemplates(IncidentTemplate::all())
+ ->withNotificationsEnabled($this->system->canNotifySubscribers());
+ }
+
+ /**
+ * Creates a new incident update.
+ *
+ * @param \CachetHQ\Cachet\Models\Incident $incident
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function createIncidentUpdateAction(Incident $incident)
+ {
+ try {
+ $incidentUpdate = execute(new CreateIncidentUpdateCommand(
+ $incident,
+ Binput::get('status'),
+ Binput::get('message'),
+ Binput::get('component_id'),
+ Binput::get('component_status'),
+ $this->auth->user()
+ ));
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.incidents.updates.create', ['id' => $incident->id])
+ ->withInput(Binput::all())
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.incidents.updates.add.failure')))
+ ->withErrors($e->getMessageBag());
+ }
+
+ if ($incident->component) {
+ $incident->component->update(['status' => Binput::get('component_status')]);
+ }
+
+ return cachet_redirect('dashboard.incidents')
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.updates.success')));
+ }
+
+ /**
+ * Shows the edit incident view.
+ *
+ * @param \CachetHQ\Cachet\Models\Incident $incident
+ * @param \CachetHQ\Cachet\Models\IncidentUpdate $incidentUpdate
+ *
+ * @return \Illuminate\View\View
+ */
+ public function showEditIncidentUpdateAction(Incident $incident, IncidentUpdate $incidentUpdate)
+ {
+ return View::make('dashboard.incidents.updates.edit')
+ ->withIncident($incident)
+ ->withUpdate($incidentUpdate)
+ ->withNotificationsEnabled($this->system->canNotifySubscribers());
+ }
+
+ /**
+ * Edit an incident update.
+ *
+ * @param \CachetHQ\Cachet\Models\Incident $incident
+ * @param \CachetHQ\Cachet\Models\IncidentUpdate $incidentUpdate
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function editIncidentUpdateAction(Incident $incident, IncidentUpdate $incidentUpdate)
+ {
+ try {
+ $incidentUpdate = execute(new UpdateIncidentUpdateCommand(
+ $incidentUpdate,
+ Binput::get('status'),
+ Binput::get('message'),
+ $this->auth->user()
+ ));
+ } catch (ValidationException $e) {
+ return cachet_redirect('dashboard.incidents.updates.edit', ['incident' => $incident->id, 'incident_update' => $incidentUpdate->id])
+ ->withInput(Binput::all())
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.incidents.updates.edit.failure')))
+ ->withErrors($e->getMessageBag());
+ }
+
+ return cachet_redirect('dashboard.incidents.updates', ['incident' => $incident->id])
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.incidents.updates.edit.success')));
+ }
+}
diff --git a/app/Http/Controllers/Dashboard/MetricController.php b/app/Http/Controllers/Dashboard/MetricController.php
index d87fb436d9e5..1a0b601c7458 100644
--- a/app/Http/Controllers/Dashboard/MetricController.php
+++ b/app/Http/Controllers/Dashboard/MetricController.php
@@ -70,7 +70,7 @@ public function createMetricAction()
$metricData = Binput::get('metric');
try {
- dispatch(new CreateMetricCommand(
+ execute(new CreateMetricCommand(
$metricData['name'],
$metricData['suffix'],
$metricData['description'],
@@ -114,7 +114,7 @@ public function showAddMetricPoint()
*/
public function deleteMetricAction(Metric $metric)
{
- dispatch(new RemoveMetricCommand($metric));
+ execute(new RemoveMetricCommand($metric));
return cachet_redirect('dashboard.metrics')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.metrics.delete.success')));
@@ -144,7 +144,7 @@ public function showEditMetricAction(Metric $metric)
public function editMetricAction(Metric $metric)
{
try {
- dispatch(new UpdateMetricCommand(
+ execute(new UpdateMetricCommand(
$metric,
Binput::get('name', null, false),
Binput::get('suffix', null, false),
diff --git a/app/Http/Controllers/Dashboard/ScheduleController.php b/app/Http/Controllers/Dashboard/ScheduleController.php
index f9dfd23b9f4f..c06216a916f6 100644
--- a/app/Http/Controllers/Dashboard/ScheduleController.php
+++ b/app/Http/Controllers/Dashboard/ScheduleController.php
@@ -15,6 +15,7 @@
use CachetHQ\Cachet\Bus\Commands\Schedule\CreateScheduleCommand;
use CachetHQ\Cachet\Bus\Commands\Schedule\DeleteScheduleCommand;
use CachetHQ\Cachet\Bus\Commands\Schedule\UpdateScheduleCommand;
+use CachetHQ\Cachet\Integrations\Contracts\System;
use CachetHQ\Cachet\Models\IncidentTemplate;
use CachetHQ\Cachet\Models\Schedule;
use GrahamCampbell\Binput\Facades\Binput;
@@ -35,14 +36,22 @@ class ScheduleController extends Controller
*/
protected $subMenu = [];
+ /**
+ * The system instance.
+ *
+ * @var \CachetHQ\Cachet\Integrations\Contracts\System
+ */
+ protected $system;
+
/**
* Creates a new schedule controller instance.
*
* @return void
*/
- public function __construct()
+ public function __construct(System $system)
{
- View::share('sub_title', trans('dashboard.schedule.title'));
+ $this->system = $system;
+ View::share('subTitle', trans('dashboard.schedule.title'));
}
/**
@@ -54,7 +63,7 @@ public function showIndex()
{
$schedule = Schedule::orderBy('created_at')->get();
- return View::make('dashboard.schedule.index')
+ return View::make('dashboard.maintenance.index')
->withPageTitle(trans('dashboard.schedule.schedule').' - '.trans('dashboard.dashboard'))
->withSchedule($schedule);
}
@@ -68,9 +77,10 @@ public function showAddSchedule()
{
$incidentTemplates = IncidentTemplate::all();
- return View::make('dashboard.schedule.add')
+ return View::make('dashboard.maintenance.add')
->withPageTitle(trans('dashboard.schedule.add.title').' - '.trans('dashboard.dashboard'))
- ->withIncidentTemplates($incidentTemplates);
+ ->withIncidentTemplates($incidentTemplates)
+ ->withNotificationsEnabled($this->system->canNotifySubscribers());
}
/**
@@ -81,18 +91,19 @@ public function showAddSchedule()
public function addScheduleAction()
{
try {
- dispatch(new CreateScheduleCommand(
+ execute(new CreateScheduleCommand(
Binput::get('name'),
Binput::get('message', null, false, false),
Binput::get('status', Schedule::UPCOMING),
Binput::get('scheduled_at'),
Binput::get('completed_at'),
- Binput::get('components', [])
+ Binput::get('components', []),
+ Binput::get('notify', false)
));
} catch (ValidationException $e) {
return cachet_redirect('dashboard.schedule.create')
->withInput(Binput::all())
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.schedule.add.failure')))
+ ->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.schedule.edit.failure')))
->withErrors($e->getMessageBag());
}
@@ -111,7 +122,7 @@ public function showEditSchedule(Schedule $schedule)
{
$incidentTemplates = IncidentTemplate::all();
- return View::make('dashboard.schedule.edit')
+ return View::make('dashboard.maintenance.edit')
->withPageTitle(trans('dashboard.schedule.edit.title').' - '.trans('dashboard.dashboard'))
->withIncidentTemplates($incidentTemplates)
->withSchedule($schedule);
@@ -127,7 +138,7 @@ public function showEditSchedule(Schedule $schedule)
public function editScheduleAction(Schedule $schedule)
{
try {
- $schedule = dispatch(new UpdateScheduleCommand(
+ $schedule = execute(new UpdateScheduleCommand(
$schedule,
Binput::get('name', null),
Binput::get('message', null),
@@ -156,7 +167,7 @@ public function editScheduleAction(Schedule $schedule)
*/
public function deleteScheduleAction(Schedule $schedule)
{
- dispatch(new DeleteScheduleCommand($schedule));
+ execute(new DeleteScheduleCommand($schedule));
return cachet_redirect('dashboard.schedule')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.schedule.delete.success')));
diff --git a/app/Http/Controllers/Dashboard/SettingsController.php b/app/Http/Controllers/Dashboard/SettingsController.php
index 26378a8fbb6b..f128e22711e1 100644
--- a/app/Http/Controllers/Dashboard/SettingsController.php
+++ b/app/Http/Controllers/Dashboard/SettingsController.php
@@ -19,6 +19,7 @@
use Exception;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
+use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Lang;
@@ -27,6 +28,7 @@
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Str;
+use Monolog\Handler\SyslogHandler;
class SettingsController extends Controller
{
@@ -114,8 +116,8 @@ public function __construct()
];
View::share([
- 'sub_title' => trans('dashboard.settings.settings'),
- 'sub_menu' => $this->subMenu,
+ 'subTitle' => trans('dashboard.settings.settings'),
+ 'subMenu' => $this->subMenu,
]);
}
@@ -268,13 +270,17 @@ public function showLogView()
{
$this->subMenu['log']['active'] = true;
- $log = Log::getMonolog();
+ $log = Log::getLogger();
- if (file_exists($path = $log->getHandlers()[0]->getUrl())) {
- $logContents = file_get_contents($path);
- } else {
- $logContents = '';
- }
+ $logContents = '';
+
+ collect($log->getHandlers())->reject(function ($handler) {
+ return $handler instanceof SyslogHandler;
+ })->each(function ($handler) use (&$logContents, $log) {
+ if (file_exists($path = $log->getHandlers()[0]->getUrl())) {
+ $logContents = file_get_contents($path);
+ }
+ });
return View::make('dashboard.settings.log')->withLog($logContents)->withSubMenu($this->subMenu);
}
@@ -313,7 +319,7 @@ public function postMail()
{
$config = Binput::get('config');
- dispatch(new UpdateConfigCommand($config));
+ execute(new UpdateConfigCommand($config));
return cachet_redirect('dashboard.settings.mail')
->withInput(Binput::all())
@@ -351,6 +357,14 @@ public function postSettings()
}
}
+ if (isset($parameters['stylesheet'])) {
+ if ($stylesheet = Binput::get('stylesheet', null, false, false)) {
+ $setting->set('stylesheet', $stylesheet);
+ } else {
+ $setting->delete('stylesheet');
+ }
+ }
+
if (Binput::hasFile('app_banner')) {
$this->handleUpdateBanner($setting);
}
@@ -361,6 +375,7 @@ public function postSettings()
'remove_banner',
'header',
'footer',
+ 'stylesheet',
];
try {
@@ -379,6 +394,10 @@ public function postSettings()
Lang::setLocale(Binput::get('app_locale'));
}
+ if (Binput::has('always_authenticate')) {
+ Artisan::call('route:clear');
+ }
+
return Redirect::back()->withSuccess(trans('dashboard.settings.edit.success'));
}
@@ -392,6 +411,7 @@ public function postSettings()
protected function handleUpdateBanner(Repository $setting)
{
$file = Binput::file('app_banner');
+ $redirectUrl = $this->subMenu['theme']['url'];
// Image Validation.
// Image size in bytes.
diff --git a/app/Http/Controllers/Dashboard/SubscriberController.php b/app/Http/Controllers/Dashboard/SubscriberController.php
index e97499969735..17de83eb4a2d 100644
--- a/app/Http/Controllers/Dashboard/SubscriberController.php
+++ b/app/Http/Controllers/Dashboard/SubscriberController.php
@@ -31,7 +31,7 @@ public function showSubscribers()
{
return View::make('dashboard.subscribers.index')
->withPageTitle(trans('dashboard.subscribers.subscribers').' - '.trans('dashboard.dashboard'))
- ->withSubscribers(Subscriber::all());
+ ->withSubscribers(Subscriber::with('subscriptions.component')->get());
}
/**
@@ -58,7 +58,7 @@ public function createSubscriberAction()
$subscribers = preg_split("/\r\n|\n|\r/", Binput::get('email'));
foreach ($subscribers as $subscriber) {
- dispatch(new SubscribeSubscriberCommand($subscriber, $verified));
+ execute(new SubscribeSubscriberCommand($subscriber, $verified));
}
} catch (ValidationException $e) {
return cachet_redirect('dashboard.subscribers.create')
@@ -82,7 +82,7 @@ public function createSubscriberAction()
*/
public function deleteSubscriberAction(Subscriber $subscriber)
{
- dispatch(new UnsubscribeSubscriberCommand($subscriber));
+ execute(new UnsubscribeSubscriberCommand($subscriber));
return cachet_redirect('dashboard.subscribers');
}
diff --git a/app/Http/Controllers/Dashboard/TeamController.php b/app/Http/Controllers/Dashboard/TeamController.php
index 6e0d112b305a..b762161907f8 100644
--- a/app/Http/Controllers/Dashboard/TeamController.php
+++ b/app/Http/Controllers/Dashboard/TeamController.php
@@ -80,7 +80,7 @@ public function showInviteTeamMemberView()
public function postAddUser()
{
try {
- dispatch(new CreateUserCommand(
+ execute(new CreateUserCommand(
Binput::get('username'),
Binput::get('password'),
Binput::get('email'),
@@ -129,7 +129,7 @@ public function postUpdateUser(User $user)
public function postInviteUser()
{
try {
- dispatch(new InviteUserCommand(
+ execute(new InviteUserCommand(
array_unique(array_filter((array) Binput::get('emails')))
));
} catch (ValidationException $e) {
@@ -152,7 +152,7 @@ public function postInviteUser()
*/
public function deleteUser(User $user)
{
- dispatch(new RemoveUserCommand($user));
+ execute(new RemoveUserCommand($user));
return cachet_redirect('dashboard.team')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.team.delete.success')));
diff --git a/app/Http/Controllers/Dashboard/UserController.php b/app/Http/Controllers/Dashboard/UserController.php
index f9112b1e980d..ba01e862b6d3 100644
--- a/app/Http/Controllers/Dashboard/UserController.php
+++ b/app/Http/Controllers/Dashboard/UserController.php
@@ -18,9 +18,10 @@
use CachetHQ\Cachet\Models\User;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
+use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\View;
-use PragmaRX\Google2FA\Vendor\Laravel\Facade as Google2FA;
+use PragmaRX\Google2FA\Google2FA;
class UserController extends Controller
{
@@ -38,18 +39,22 @@ public function showUser()
/**
* Updates the current user.
*
+ * @throws \PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException
+ * @throws \PragmaRX\Google2FA\Exceptions\InvalidCharactersException
+ *
* @return \Illuminate\View\View
*/
public function postUser()
{
$userData = array_filter(Binput::only(['username', 'email', 'password', 'google2fa']));
- $enable2FA = (bool) array_pull($userData, 'google2fa');
+ $enable2FA = (bool) Arr::pull($userData, 'google2fa');
// Let's enable/disable auth
if ($enable2FA && !Auth::user()->hasTwoFactor) {
event(new UserEnabledTwoAuthEvent(Auth::user()));
- $userData['google_2fa_secret'] = Google2FA::generateSecretKey();
+ $google2fa = new Google2FA();
+ $userData['google_2fa_secret'] = $google2fa->generateSecretKey();
} elseif (!$enable2FA) {
event(new UserDisabledTwoAuthEvent(Auth::user()));
$userData['google_2fa_secret'] = '';
diff --git a/app/Http/Controllers/FeedController.php b/app/Http/Controllers/FeedController.php
deleted file mode 100644
index 1cf96e2b76c4..000000000000
--- a/app/Http/Controllers/FeedController.php
+++ /dev/null
@@ -1,117 +0,0 @@
-
- */
-class FeedController extends Controller
-{
- /**
- * Feed facade.
- *
- * @var \Roumen\Feed\Feed
- */
- protected $feed;
-
- /**
- * Create a new feed controller instance.
- *
- * @return void
- */
- public function __construct()
- {
- $this->feed = app('feed');
- $this->feed->title = Config::get('setting.app_name');
- $this->feed->description = trans('cachet.feed');
- $this->feed->link = Str::canonicalize(Config::get('setting.app_domain'));
- $this->feed->ctype = 'text/xml';
- $this->feed->setDateFormat('datetime');
- }
-
- /**
- * Generates an Atom feed of all incidents.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup|null $group
- *
- * @return \Illuminate\Http\Response
- */
- public function atomAction(ComponentGroup $group = null)
- {
- return $this->feedAction($group, false);
- }
-
- /**
- * Generates a Rss feed of all incidents.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup|null $group
- *
- * @return \Illuminate\Http\Response
- */
- public function rssAction(ComponentGroup $group = null)
- {
- $this->feed->lang = Config::get('setting.app_locale');
-
- return $this->feedAction($group, true);
- }
-
- /**
- * Generates a Rss feed of all incidents.
- *
- * @param \CachetHQ\Cachet\Models\ComponentGroup|null $group
- * @param bool $isRss
- *
- * @return \Illuminate\Http\Response
- */
- private function feedAction(ComponentGroup &$group, $isRss)
- {
- if ($group->exists) {
- $group->components->map(function ($component) use ($isRss) {
- $component->incidents()->visible()->orderBy('occurred_at', 'desc')->get()->map(function ($incident) use ($isRss) {
- $this->feedAddItem($incident, $isRss);
- });
- });
- } else {
- Incident::visible()->orderBy('occurred_at', 'desc')->get()->map(function ($incident) use ($isRss) {
- $this->feedAddItem($incident, $isRss);
- });
- }
-
- return $this->feed->render($isRss ? 'rss' : 'atom');
- }
-
- /**
- * Adds an item to the feed.
- *
- * @param \CachetHQ\Cachet\Models\Incident $incident
- * @param bool $isRss
- */
- private function feedAddItem(Incident $incident, $isRss)
- {
- $this->feed->add(
- $incident->name,
- Config::get('setting.app_name'),
- Str::canonicalize(cachet_route('incident', [$incident->id])),
- $isRss ? $incident->occurred_at->toRssString() : $incident->occurred_at->toAtomString(),
- $isRss ? $incident->message : Markdown::convertToHtml($incident->message)
- );
- }
-}
diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php
index 6f6d0add062b..52bf51f7a3bd 100644
--- a/app/Http/Controllers/SetupController.php
+++ b/app/Http/Controllers/SetupController.php
@@ -16,6 +16,7 @@
use CachetHQ\Cachet\Settings\Repository;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
+use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Request;
@@ -52,12 +53,12 @@ class SetupController extends Controller
* @var string[]
*/
protected $mailDrivers = [
- 'smtp' => 'SMTP',
- 'mail' => 'Mail',
- 'sendmail' => 'Sendmail',
- 'mailgun' => 'Mailgun',
- 'mandrill' => 'Mandrill',
- // 'ses' => 'Amazon SES', this will be available only if aws/aws-sdk-php is installed
+ 'smtp' => 'SMTP',
+ 'mail' => 'Mail',
+ 'sendmail' => 'Sendmail',
+ 'mailgun' => 'Mailgun',
+ 'mandrill' => 'Mandrill',
+ 'ses' => 'Amazon SES',
'sparkpost' => 'SparkPost',
'log' => 'Log (Testing)',
];
@@ -133,18 +134,21 @@ public function __construct()
*/
public function getIndex()
{
- $supportedLanguages = Request::getLanguages();
+ $requestedLanguages = Request::getLanguages();
$userLanguage = Config::get('app.locale');
+ $langs = Config::get('langs');
- foreach ($supportedLanguages as $language) {
+ foreach ($requestedLanguages as $language) {
$language = str_replace('_', '-', $language);
- if (isset($this->langs[$language])) {
+ if (isset($langs[$language])) {
$userLanguage = $language;
break;
}
}
+ app('translator')->setLocale($userLanguage);
+
// Since .env may already be configured, we should show that data!
$cacheConfig = [
'driver' => Config::get('cache.default'),
@@ -194,8 +198,12 @@ public function postStep1()
return $input->env['mail_driver'] === 'smtp';
});
- $v->sometimes(['env.mail_address', 'env.mail_username', 'env.mail_password'], 'required', function ($input) {
- return $input->env['mail_driver'] !== 'log';
+ $v->sometimes(['env.mail_address', 'env.mail_password'], 'required', function ($input) {
+ return !in_array($input->env['mail_driver'], ['log', 'smtp']);
+ });
+
+ $v->sometimes(['env.mail_username'], 'required', function ($input) {
+ return !in_array($input->env['mail_driver'], ['sendmail', 'log']);
});
if ($v->passes()) {
@@ -236,7 +244,7 @@ public function postStep3()
if ($v->passes()) {
// Pull the user details out.
- $userDetails = array_pull($postData, 'user');
+ $userDetails = Arr::pull($postData, 'user');
$user = User::create([
'username' => $userDetails['username'],
@@ -249,16 +257,16 @@ public function postStep3()
$setting = app(Repository::class);
- $settings = array_pull($postData, 'settings');
+ $settings = Arr::pull($postData, 'settings');
foreach ($settings as $settingName => $settingValue) {
$setting->set($settingName, $settingValue);
}
- $envData = array_pull($postData, 'env');
+ $envData = Arr::pull($postData, 'env');
// Write the env to the .env file.
- dispatch(new UpdateConfigCommand($envData));
+ execute(new UpdateConfigCommand($envData));
if (Request::ajax()) {
return Response::json(['status' => 1]);
diff --git a/app/Http/Controllers/SignupController.php b/app/Http/Controllers/SignupController.php
index a506c59fbfff..6c7db1522d49 100644
--- a/app/Http/Controllers/SignupController.php
+++ b/app/Http/Controllers/SignupController.php
@@ -69,7 +69,7 @@ public function postSignup($code = null)
}
try {
- dispatch(new SignupUserCommand(
+ execute(new SignupUserCommand(
Binput::get('username'),
Binput::get('password'),
Binput::get('email'),
@@ -82,7 +82,7 @@ public function postSignup($code = null)
->withErrors($e->getMessageBag());
}
- dispatch(new ClaimInviteCommand($invite));
+ execute(new ClaimInviteCommand($invite));
return cachet_redirect('status-page')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.signup.success')));
diff --git a/app/Http/Controllers/StatusPageController.php b/app/Http/Controllers/StatusPageController.php
index 8a746d7d3b7b..12766de5af0b 100644
--- a/app/Http/Controllers/StatusPageController.php
+++ b/app/Http/Controllers/StatusPageController.php
@@ -11,7 +11,7 @@
namespace CachetHQ\Cachet\Http\Controllers;
-use AltThree\Badger\Facades\Badger;
+use CachetHQ\Badger\Facades\Badger;
use CachetHQ\Cachet\Http\Controllers\Api\AbstractApiController;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Incident;
@@ -19,7 +19,6 @@
use CachetHQ\Cachet\Models\Schedule;
use CachetHQ\Cachet\Repositories\Metric\MetricRepository;
use CachetHQ\Cachet\Services\Dates\DateFactory;
-use Exception;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
@@ -45,37 +44,71 @@ class StatusPageController extends AbstractApiController
*/
public function showIndex()
{
- $today = Date::now();
- $startDate = Date::now();
-
- // Check if we have another starting date
- if (Binput::has('start_date')) {
- try {
- // If date provided is valid
- $oldDate = Date::createFromFormat('Y-m-d', Binput::get('start_date'));
-
- // If trying to get a future date fallback to today
- if ($today->gt($oldDate)) {
- $startDate = $oldDate;
- }
- } catch (Exception $e) {
- // Fallback to today
+ $onlyDisruptedDays = Config::get('setting.only_disrupted_days');
+ $appIncidentDays = (int) Config::get('setting.app_incident_days', 1);
+
+ $startDate = Date::createFromFormat('Y-m-d', Binput::get('start_date', Date::now()->toDateString()));
+ $endDate = $startDate->copy()->subDays($appIncidentDays);
+
+ $canPageForward = false;
+ $canPageBackward = false;
+ $previousDate = null;
+ $nextDate = null;
+
+ if ($onlyDisruptedDays) {
+ // In this case, start_date GET parameter means the page
+ $page = (int) Binput::get('start_date', 0);
+
+ $allIncidentDays = Incident::where('visible', '>=', (int) !Auth::check())
+ ->select('occurred_at')
+ ->whereBetween('occurred_at', [
+ $endDate->format('Y-m-d').' 00:00:00',
+ $startDate->format('Y-m-d').' 23:59:59',
+ ])
+ ->distinct()
+ ->orderBy('occurred_at', 'desc')
+ ->get()
+ ->map(function (Incident $incident) {
+ return app(DateFactory::class)->make($incident->occurred_at)->toDateString();
+ })->unique()
+ ->values();
+
+ $numIncidentDays = count($allIncidentDays);
+ $numPages = round($numIncidentDays / max($appIncidentDays, 1));
+
+ $selectedDays = $allIncidentDays->slice($page * $appIncidentDays, $appIncidentDays)->all();
+
+ if (count($selectedDays) > 0) {
+ $startDate = Date::createFromFormat('Y-m-d', array_values($selectedDays)[0]);
+ $endDate = Date::createFromFormat('Y-m-d', array_values(array_slice($selectedDays, -1))[0]);
}
+
+ $canPageForward = $page > 0;
+ $canPageBackward = ($page + 1) < $numPages;
+ $previousDate = $page + 1;
+ $nextDate = $page - 1;
+ } else {
+ $date = Date::now();
+
+ $canPageForward = (bool) $startDate->lt($date->sub('1 day'));
+ $canPageBackward = Incident::where('occurred_at', '<', $date->format('Y-m-d'))->count() > 0;
+ $previousDate = $startDate->copy()->subDays($appIncidentDays)->toDateString();
+ $nextDate = $startDate->copy()->addDays($appIncidentDays)->toDateString();
}
- $daysToShow = max(0, (int) Config::get('setting.app_incident_days', 0) - 1);
- $incidentDays = range(0, $daysToShow);
+ $allIncidents = Incident::with('component', 'updates.incident')
+ ->where('visible', '>=', (int) !Auth::check())->whereBetween('occurred_at', [
+ $endDate->format('Y-m-d').' 00:00:00',
+ $startDate->format('Y-m-d').' 23:59:59',
+ ])->orderBy('occurred_at', 'desc')->get()->groupBy(function (Incident $incident) {
+ return app(DateFactory::class)->make($incident->occurred_at)->toDateString();
+ });
- $allIncidents = Incident::where('visible', '>=', (int) !Auth::check())->whereBetween('occurred_at', [
- $startDate->copy()->subDays($daysToShow)->format('Y-m-d').' 00:00:00',
- $startDate->format('Y-m-d').' 23:59:59',
- ])->orderBy('occurred_at', 'desc')->get()->groupBy(function (Incident $incident) {
- return app(DateFactory::class)->make($incident->occurred_at)->toDateString();
- });
+ if (!$onlyDisruptedDays) {
+ $incidentDays = array_pad([], $appIncidentDays, null);
- // Add in days that have no incidents
- if (Config::get('setting.only_disrupted_days') === false) {
- foreach ($incidentDays as $i) {
+ // Add in days that have no incidents
+ foreach ($incidentDays as $i => $day) {
$date = app(DateFactory::class)->make($startDate)->subDays($i);
if (!isset($allIncidents[$date->toDateString()])) {
@@ -90,12 +123,12 @@ public function showIndex()
}, SORT_REGULAR, true);
return View::make('index')
- ->withDaysToShow($daysToShow)
+ ->withDaysToShow($appIncidentDays)
->withAllIncidents($allIncidents)
- ->withCanPageForward((bool) $today->gt($startDate))
- ->withCanPageBackward(Incident::where('occurred_at', '<', $startDate->format('Y-m-d'))->count() > 0)
- ->withPreviousDate($startDate->copy()->subDays($daysToShow)->toDateString())
- ->withNextDate($startDate->copy()->addDays($daysToShow)->toDateString());
+ ->withCanPageForward($canPageForward)
+ ->withCanPageBackward($canPageBackward)
+ ->withPreviousDate($previousDate)
+ ->withNextDate($nextDate);
}
/**
@@ -131,14 +164,18 @@ public function showSchedule(Schedule $schedule)
*/
public function getMetrics(Metric $metric)
{
- $type = Binput::get('filter', 'last_hour');
+ $type = Binput::get('filter', AutoPresenter::decorate($metric)->view_name);
$metrics = app(MetricRepository::class);
switch ($type) {
- case 'last_hour': $metricData = $metrics->listPointsLastHour($metric); break;
- case 'today': $metricData = $metrics->listPointsToday($metric); break;
- case 'week': $metricData = $metrics->listPointsForWeek($metric); break;
- case 'month': $metricData = $metrics->listPointsForMonth($metric); break;
+ case 'last_hour': $metricData = $metrics->listPointsLastHour($metric);
+ break;
+ case 'today': $metricData = $metrics->listPointsToday($metric);
+ break;
+ case 'week': $metricData = $metrics->listPointsForWeek($metric);
+ break;
+ case 'month': $metricData = $metrics->listPointsForMonth($metric);
+ break;
default: $metricData = [];
}
@@ -160,10 +197,14 @@ public function showComponentBadge(Component $component)
$component = AutoPresenter::decorate($component);
switch ($component->status_color) {
- case 'reds': $color = Config::get('setting.style_reds', '#FF6F6F'); break;
- case 'blues': $color = Config::get('setting.style_blues', '#3498DB'); break;
- case 'greens': $color = Config::get('setting.style_greens', '#7ED321'); break;
- case 'yellows': $color = Config::get('setting.style_yellows', '#F7CA18'); break;
+ case 'reds': $color = Config::get('setting.style_reds', '#FF6F6F');
+ break;
+ case 'blues': $color = Config::get('setting.style_blues', '#3498DB');
+ break;
+ case 'greens': $color = Config::get('setting.style_greens', '#7ED321');
+ break;
+ case 'yellows': $color = Config::get('setting.style_yellows', '#F7CA18');
+ break;
default: $color = null;
}
diff --git a/app/Http/Controllers/SubscribeController.php b/app/Http/Controllers/SubscribeController.php
index f630a2c55659..afa866a9610e 100644
--- a/app/Http/Controllers/SubscribeController.php
+++ b/app/Http/Controllers/SubscribeController.php
@@ -21,11 +21,14 @@
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Subscriber;
use CachetHQ\Cachet\Models\Subscription;
+use CachetHQ\Cachet\Notifications\Subscriber\ManageSubscriptionNotification;
use GrahamCampbell\Binput\Facades\Binput;
use GrahamCampbell\Markdown\Facades\Markdown;
+use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\View;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -37,6 +40,25 @@
*/
class SubscribeController extends Controller
{
+ /**
+ * The illuminate guard instance.
+ *
+ * @var \Illuminate\Contracts\Auth\Guard
+ */
+ protected $auth;
+
+ /**
+ * Create a new subscribe controller instance.
+ *
+ * @param \Illuminate\Contracts\Auth\Guard $auth
+ *
+ * @return void
+ */
+ public function __construct(Guard $auth)
+ {
+ $this->auth = $auth;
+ }
+
/**
* Show the subscribe by email page.
*
@@ -60,7 +82,7 @@ public function postSubscribe()
$verified = app(Repository::class)->get('setting.skip_subscriber_verification');
try {
- $subscription = dispatch(new SubscribeSubscriberCommand($email, $verified));
+ $subscription = execute(new SubscribeSubscriberCommand($email, $verified));
} catch (ValidationException $e) {
return cachet_redirect('status-page')
->withInput(Binput::all())
@@ -68,12 +90,16 @@ public function postSubscribe()
->withErrors($e->getMessageBag());
}
- if ($subscription->is_verified) {
- return cachet_redirect('status-page')->withSuccess(trans('cachet.subscriber.email.already-subscribed', ['email' => $email]));
- }
+ // Send the subscriber a link to manage their subscription.
+ $subscription->notify(new ManageSubscriptionNotification());
- return cachet_redirect('subscribe.manage', $subscription->verify_code)
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.subscribed')));
+ return redirect()->back()->withSuccess(
+ sprintf(
+ '%s %s',
+ trans('dashboard.notifications.awesome'),
+ trans('cachet.subscriber.email.manage_subscription')
+ )
+ );
}
/**
@@ -96,11 +122,11 @@ public function getVerify($code = null)
}
if (!$subscriber->is_verified) {
- dispatch(new VerifySubscriberCommand($subscriber));
+ execute(new VerifySubscriberCommand($subscriber));
}
- return cachet_redirect('status-page')
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.verified')));
+ return redirect()->to(URL::signedRoute(cachet_route_generator('subscribe.manage'), ['code' => $code]))
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.subscribed')));
}
/**
@@ -124,9 +150,9 @@ public function getUnsubscribe($code = null, $subscription = null)
}
if ($subscription) {
- dispatch(new UnsubscribeSubscriptionCommand(Subscription::forSubscriber($subscriber->id)->firstOrFail()));
+ execute(new UnsubscribeSubscriptionCommand(Subscription::forSubscriber($subscriber->id)->firstOrFail()));
} else {
- dispatch(new UnsubscribeSubscriberCommand($subscriber, $subscription));
+ execute(new UnsubscribeSubscriberCommand($subscriber));
}
return cachet_redirect('status-page')
@@ -146,10 +172,12 @@ public function showManage($code = null)
throw new NotFoundHttpException();
}
+ $includePrivate = $this->auth->check();
+
$subscriber = Subscriber::where('verify_code', '=', $code)->first();
- $usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id');
+ $usedComponentGroups = Component::enabled()->authenticated($includePrivate)->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id');
$componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get();
- $ungroupedComponents = Component::enabled()->where('group_id', '=', 0)->orderBy('order')->orderBy('created_at')->get();
+ $ungroupedComponents = Component::enabled()->authenticated($includePrivate)->where('group_id', '=', 0)->orderBy('order')->orderBy('created_at')->get();
if (!$subscriber) {
throw new BadRequestHttpException();
@@ -182,15 +210,15 @@ public function postManage($code = null)
}
try {
- dispatch(new UpdateSubscriberSubscriptionCommand($subscriber, Binput::get('subscriptions')));
+ execute(new UpdateSubscriberSubscriptionCommand($subscriber, Binput::get('subscriptions')));
} catch (ValidationException $e) {
- return cachet_redirect('subscribe.manage', $subscriber->verify_code)
+ return redirect()->to(URL::signedRoute(cachet_route_generator('subscribe.manage'), ['code' => $subscriber->verify_code]))
->withInput(Binput::all())
->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('cachet.subscriber.email.failure')))
->withErrors($e->getMessageBag());
}
- return cachet_redirect('subscribe.manage', $subscriber->verify_code)
- ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.subscribed')));
+ return redirect()->to(URL::signedRoute(cachet_route_generator('subscribe.manage'), ['code' => $subscriber->verify_code]))
+ ->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.updated-subscribe')));
}
}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index afb1bd2c3a6e..ee7e3b40aa96 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -11,7 +11,23 @@
namespace CachetHQ\Cachet\Http;
+use Barryvdh\Cors\HandleCors;
+use CachetHQ\Cachet\Http\Middleware\Admin;
+use CachetHQ\Cachet\Http\Middleware\ApiAuthentication;
+use CachetHQ\Cachet\Http\Middleware\Authenticate;
+use CachetHQ\Cachet\Http\Middleware\CacheControl;
+use CachetHQ\Cachet\Http\Middleware\Localize;
+use CachetHQ\Cachet\Http\Middleware\ReadyForUse;
+use CachetHQ\Cachet\Http\Middleware\RedirectIfAuthenticated;
+use CachetHQ\Cachet\Http\Middleware\RemoteUserAuthenticate;
+use CachetHQ\Cachet\Http\Middleware\SetupAlreadyCompleted;
+use CachetHQ\Cachet\Http\Middleware\SubscribersConfigured;
+use CachetHQ\Cachet\Http\Middleware\Throttler;
+use CachetHQ\Cachet\Http\Middleware\TrustProxies;
+use Illuminate\Auth\Middleware\Authorize;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
+use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
+use Illuminate\Routing\Middleware\ValidateSignature;
class Kernel extends HttpKernel
{
@@ -21,8 +37,8 @@ class Kernel extends HttpKernel
* @var array
*/
protected $middleware = [
- 'Fideloper\Proxy\TrustProxies',
- 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
+ TrustProxies::class,
+ CheckForMaintenanceMode::class,
];
/**
@@ -31,15 +47,19 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
- 'admin' => 'CachetHQ\Cachet\Http\Middleware\Admin',
- 'can' => 'Illuminate\Auth\Middleware\Authorize',
- 'auth' => 'CachetHQ\Cachet\Http\Middleware\Authenticate',
- 'auth.api' => 'CachetHQ\Cachet\Http\Middleware\ApiAuthentication',
- 'guest' => 'CachetHQ\Cachet\Http\Middleware\RedirectIfAuthenticated',
- 'localize' => 'CachetHQ\Cachet\Http\Middleware\Localize',
- 'ready' => 'CachetHQ\Cachet\Http\Middleware\ReadyForUse',
- 'setup' => 'CachetHQ\Cachet\Http\Middleware\SetupAlreadyCompleted',
- 'subscribers' => 'CachetHQ\Cachet\Http\Middleware\SubscribersConfigured',
- 'throttle' => 'AltThree\Throttle\ThrottlingMiddleware',
+ 'admin' => Admin::class,
+ 'auth.api' => ApiAuthentication::class,
+ 'auth.remoteuser' => RemoteUserAuthenticate::class,
+ 'auth' => Authenticate::class,
+ 'cache' => CacheControl::class,
+ 'can' => Authorize::class,
+ 'cors' => HandleCors::class,
+ 'guest' => RedirectIfAuthenticated::class,
+ 'localize' => Localize::class,
+ 'ready' => ReadyForUse::class,
+ 'setup' => SetupAlreadyCompleted::class,
+ 'signed' => ValidateSignature::class,
+ 'subscribers' => SubscribersConfigured::class,
+ 'throttle' => Throttler::class,
];
}
diff --git a/app/Http/Middleware/Acceptable.php b/app/Http/Middleware/Acceptable.php
index 7db13506338d..97974fa72b64 100644
--- a/app/Http/Middleware/Acceptable.php
+++ b/app/Http/Middleware/Acceptable.php
@@ -18,7 +18,7 @@
/**
* This is the acceptable middleware class.
*
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
*/
class Acceptable
diff --git a/app/Http/Middleware/Admin.php b/app/Http/Middleware/Admin.php
index 5c83c82141e8..4180c3665d1a 100644
--- a/app/Http/Middleware/Admin.php
+++ b/app/Http/Middleware/Admin.php
@@ -20,7 +20,7 @@
* This is the admin middleware class.
*
* @author Joseph Cohen
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
*/
class Admin
diff --git a/app/Http/Middleware/ApiAuthentication.php b/app/Http/Middleware/ApiAuthentication.php
index 0ae7a0683aad..c02b6c089c5e 100644
--- a/app/Http/Middleware/ApiAuthentication.php
+++ b/app/Http/Middleware/ApiAuthentication.php
@@ -22,7 +22,7 @@
* This is the api authentication middleware class.
*
* @author Joseph Cohen
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
*/
class ApiAuthentication
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
index 6139df30c200..9b5562cb3173 100644
--- a/app/Http/Middleware/Authenticate.php
+++ b/app/Http/Middleware/Authenticate.php
@@ -20,7 +20,7 @@
* This is the authenticate middleware class.
*
* @author Joseph Cohen
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
*/
class Authenticate
diff --git a/app/Http/Middleware/CacheControl.php b/app/Http/Middleware/CacheControl.php
new file mode 100644
index 000000000000..fa54dfe094f0
--- /dev/null
+++ b/app/Http/Middleware/CacheControl.php
@@ -0,0 +1,37 @@
+header('Cache-Control', 'public,max-age='.$maxAge);
+
+ return $response;
+ }
+}
diff --git a/app/Http/Middleware/Localize.php b/app/Http/Middleware/Localize.php
index 2c65f82b2bc9..52469c41515b 100644
--- a/app/Http/Middleware/Localize.php
+++ b/app/Http/Middleware/Localize.php
@@ -22,7 +22,7 @@
*
* @author James Brooks
* @author Joseph Cohen
- * @author Graham Campbell
+ * @author Graham Campbell
*/
class Localize
{
diff --git a/app/Http/Middleware/ReadyForUse.php b/app/Http/Middleware/ReadyForUse.php
index 3acfe8d2ec36..11b1afbbb808 100644
--- a/app/Http/Middleware/ReadyForUse.php
+++ b/app/Http/Middleware/ReadyForUse.php
@@ -18,7 +18,7 @@
/**
* This is the ready for use middleware class.
*
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
* @author Joseph Cohen
*/
@@ -53,7 +53,7 @@ public function __construct(Repository $settings)
*/
public function handle(Request $request, Closure $next)
{
- if (!$this->settings->get('app_name')) {
+ if (!$request->is('setup*') && !$this->settings->get('app_name')) {
return cachet_redirect('setup');
}
diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php
index 7c85f6689cab..b8c956485445 100644
--- a/app/Http/Middleware/RedirectIfAuthenticated.php
+++ b/app/Http/Middleware/RedirectIfAuthenticated.php
@@ -18,7 +18,7 @@
/**
* This is the redirect if authenticated middleware class.
*
- * @author Graham Campbell
+ * @author Graham Campbell
* @author Joseph Cohen
* @author James Brooks
*/
diff --git a/app/Http/Middleware/RemoteUserAuthenticate.php b/app/Http/Middleware/RemoteUserAuthenticate.php
new file mode 100644
index 000000000000..075c0c4a13a7
--- /dev/null
+++ b/app/Http/Middleware/RemoteUserAuthenticate.php
@@ -0,0 +1,53 @@
+auth = $auth;
+ }
+
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ *
+ * @return mixed
+ */
+ public function handle(Request $request, Closure $next)
+ {
+ if ($remoteUser = $request->server('REMOTE_USER')) {
+ $user = User::where('email', '=', $remoteUser)->first();
+
+ if ($user instanceof User && $this->auth->guest()) {
+ $this->auth->login($user);
+ }
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/SetupAlreadyCompleted.php b/app/Http/Middleware/SetupAlreadyCompleted.php
index 83de0ad206a3..e0df0c8f5ed8 100644
--- a/app/Http/Middleware/SetupAlreadyCompleted.php
+++ b/app/Http/Middleware/SetupAlreadyCompleted.php
@@ -11,6 +11,7 @@
namespace CachetHQ\Cachet\Http\Middleware;
+use CachetHQ\Cachet\Settings\ReadException;
use CachetHQ\Cachet\Settings\Repository;
use Closure;
use Illuminate\Http\Request;
@@ -18,7 +19,7 @@
/**
* This is the setup already completed middelware class.
*
- * @author Graham Campbell
+ * @author Graham Campbell
* @author James Brooks
* @author Joseph Cohen
*/
@@ -53,8 +54,12 @@ public function __construct(Repository $settings)
*/
public function handle(Request $request, Closure $next)
{
- if ($this->settings->get('app_name')) {
- return cachet_redirect('dashboard');
+ try {
+ if ($this->settings->get('app_name')) {
+ return cachet_redirect('dashboard');
+ }
+ } catch (ReadException $e) {
+ // not setup then!
}
return $next($request);
diff --git a/app/Http/Middleware/SubscribersConfigured.php b/app/Http/Middleware/SubscribersConfigured.php
index a8bc4056fb3c..116b20a57177 100644
--- a/app/Http/Middleware/SubscribersConfigured.php
+++ b/app/Http/Middleware/SubscribersConfigured.php
@@ -19,7 +19,7 @@
* This is the subscribers configured middleware class.
*
* @author James Brooks
- * @author Graham Campbell
+ * @author Graham Campbell
*/
class SubscribersConfigured
{
@@ -52,10 +52,6 @@ public function __construct(Repository $config)
*/
public function handle(Request $request, Closure $next)
{
- if (!$this->config->get('setting.enable_subscribers')) {
- return cachet_redirect('status-page');
- }
-
return $next($request);
}
}
diff --git a/app/Http/Middleware/Throttler.php b/app/Http/Middleware/Throttler.php
new file mode 100644
index 000000000000..c83149633883
--- /dev/null
+++ b/app/Http/Middleware/Throttler.php
@@ -0,0 +1,125 @@
+
+ */
+class Throttler
+{
+ /**
+ * The rate limiter instance.
+ *
+ * @var \Illuminate\Cache\RateLimiter
+ */
+ protected $limiter;
+
+ /**
+ * Create a new throttler middleware instance.
+ *
+ * @param \Illuminate\Cache\RateLimiter $limiter
+ *
+ * @return void
+ */
+ public function __construct(RateLimiter $limiter)
+ {
+ $this->limiter = $limiter;
+ }
+
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @param int|string $limit
+ * @param int|string $decay
+ *
+ * @throws \Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
+ *
+ * @return mixed
+ */
+ public function handle(Request $request, Closure $next, $limit = 60, $decay = 1)
+ {
+ return $this->safeHandle($request, $next, (int) $limit, (int) $decay);
+ }
+
+ /**
+ * Handle an incoming request, with correct types.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @param int $limit
+ * @param int $decay
+ *
+ * @throws \Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
+ *
+ * @return mixed
+ */
+ protected function safeHandle(Request $request, Closure $next, int $limit, int $decay)
+ {
+ $key = $request->fingerprint();
+
+ if ($this->limiter->tooManyAttempts($key, $limit, $decay)) {
+ throw $this->buildException($key, $limit);
+ }
+
+ $this->limiter->hit($key, $decay);
+
+ $response = $next($request);
+
+ $response->headers->add($this->getHeaders($key, $limit));
+
+ return $response;
+ }
+
+ /**
+ * Create a too many requests http exception.
+ *
+ * @param string $key
+ * @param int $limit
+ *
+ * @return \Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
+ */
+ protected function buildException(string $key, int $limit)
+ {
+ $after = $this->limiter->availableIn($key);
+ $exception = new TooManyRequestsHttpException($after, 'Rate limit exceeded.');
+ $exception->setHeaders($this->getHeaders($key, $limit, $after, $exception->getHeaders()));
+
+ return $exception;
+ }
+
+ /**
+ * Get the limit header information.
+ *
+ * @param string $key
+ * @param int $limit
+ * @param int|null $after
+ * @param array $merge
+ *
+ * @return array
+ */
+ protected function getHeaders(string $key, int $limit, int $after = null, array $merge = [])
+ {
+ $remaining = $after === null ? $this->limiter->retriesLeft($key, $limit) : 0;
+ $headers = ['X-RateLimit-Limit' => $limit, 'X-RateLimit-Remaining' => $remaining];
+
+ return array_merge($headers, $merge);
+ }
+}
diff --git a/app/Http/Middleware/Timezone.php b/app/Http/Middleware/Timezone.php
index 40afe9e066a7..e0700714af92 100644
--- a/app/Http/Middleware/Timezone.php
+++ b/app/Http/Middleware/Timezone.php
@@ -19,7 +19,7 @@
* This is the timezone middleware class.
*
* @author James Brooks
- * @author Graham Campbell
+ * @author Graham Campbell
*/
class Timezone
{
diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php
new file mode 100644
index 000000000000..83a86c5e6ff3
--- /dev/null
+++ b/app/Http/Middleware/TrustProxies.php
@@ -0,0 +1,50 @@
+
+ */
+class TrustProxies extends Middleware
+{
+ /**
+ * The trusted proxies for this application.
+ *
+ * @var array
+ */
+ protected $proxies;
+
+ /**
+ * The headers that should be used to detect proxies.
+ *
+ * @var int
+ */
+ protected $headers = Request::HEADER_X_FORWARDED_ALL;
+
+ /**
+ * Create new trust proxies instance.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ $proxies = Config::get('trustedproxies.proxies');
+
+ $this->proxies = empty($proxies) ? '*' : explode(',', trim($proxies));
+ }
+}
diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php
new file mode 100644
index 000000000000..cfd2fc055a5d
--- /dev/null
+++ b/app/Http/Middleware/VerifyCsrfToken.php
@@ -0,0 +1,38 @@
+
+ */
+class VerifyCsrfToken extends Middleware
+{
+ /**
+ * Indicates whether the XSRF-TOKEN cookie should be set on the response.
+ *
+ * @var bool
+ */
+ protected $addHttpCookie = true;
+
+ /**
+ * The URIs that should be excluded from CSRF verification.
+ *
+ * @var array
+ */
+ protected $except = [
+ '/api/*',
+ ];
+}
diff --git a/app/Http/Routes/ApiRoutes.php b/app/Http/Routes/ApiRoutes.php
index 9ec12e58015e..b56902d3635b 100644
--- a/app/Http/Routes/ApiRoutes.php
+++ b/app/Http/Routes/ApiRoutes.php
@@ -40,59 +40,58 @@ public function map(Registrar $router)
'namespace' => 'Api',
'prefix' => 'api/v1',
], function (Registrar $router) {
- $router->group(['middleware' => ['auth.api']], function (Registrar $router) {
- $router->get('ping', 'GeneralController@ping');
- $router->get('version', 'GeneralController@version');
- $router->get('status', 'GeneralController@status');
+ $router->group(['middleware' => ['auth.api', 'cors']], function (Registrar $router) {
+ $router->get('components', 'ComponentController@index');
+ $router->get('components/groups', 'ComponentGroupController@index');
+ $router->get('components/groups/{component_group}', 'ComponentGroupController@show');
+ $router->get('components/{component}', 'ComponentController@show');
- $router->get('components', 'ComponentController@getComponents');
- $router->get('components/groups', 'ComponentGroupController@getGroups');
- $router->get('components/groups/{component_group}', 'ComponentGroupController@getGroup');
- $router->get('components/{component}', 'ComponentController@getComponent');
+ $router->get('incidents', 'IncidentController@index');
- $router->get('incidents', 'IncidentController@getIncidents');
- $router->get('incidents/{incident}', 'IncidentController@getIncident');
+ $router->get('incidents/templates', 'IncidentTemplateController@index');
+ $router->get('incidents/templates/{incident_template}', 'IncidentTemplateController@show');
- $router->get('incidents/{incident}/updates', 'IncidentUpdateController@getIncidentUpdates');
- $router->get('incidents/{incident}/updates/{update}', 'IncidentUpdateController@getIncidentUpdate');
+ $router->get('incidents/{incident}', 'IncidentController@show');
+ $router->get('incidents/{incident}/updates', 'IncidentUpdateController@index');
+ $router->get('incidents/{incident}/updates/{update}', 'IncidentUpdateController@show');
- $router->get('metrics', 'MetricController@getMetrics');
- $router->get('metrics/{metric}', 'MetricController@getMetric');
- $router->get('metrics/{metric}/points', 'MetricController@getMetricPoints');
+ $router->get('metrics', 'MetricController@index');
+ $router->get('metrics/{metric}', 'MetricController@show');
+ $router->get('metrics/{metric}/points', 'MetricPointController@index');
- $router->get('schedules', 'ScheduleController@getSchedules');
- $router->get('schedules/{schedule}', 'ScheduleController@getSchedule');
+ $router->get('schedules', 'ScheduleController@index');
+ $router->get('schedules/{schedule}', 'ScheduleController@show');
});
$router->group(['middleware' => ['auth.api:true']], function (Registrar $router) {
- $router->get('subscribers', 'SubscriberController@getSubscribers');
+ $router->get('subscribers', 'SubscriberController@index');
- $router->post('components', 'ComponentController@postComponents');
- $router->post('components/groups', 'ComponentGroupController@postGroups');
- $router->post('incidents', 'IncidentController@postIncidents');
- $router->post('incidents/{incident}/updates', 'IncidentUpdateController@postIncidentUpdate');
- $router->post('metrics', 'MetricController@postMetrics');
- $router->post('metrics/{metric}/points', 'MetricPointController@postMetricPoints');
- $router->post('schedules', 'ScheduleController@postSchedule');
- $router->post('subscribers', 'SubscriberController@postSubscribers');
+ $router->post('components', 'ComponentController@store');
+ $router->post('components/groups', 'ComponentGroupController@store');
+ $router->post('incidents', 'IncidentController@store');
+ $router->post('incidents/{incident}/updates', 'IncidentUpdateController@store');
+ $router->post('metrics', 'MetricController@store');
+ $router->post('metrics/{metric}/points', 'MetricPointController@store');
+ $router->post('schedules', 'ScheduleController@store');
+ $router->post('subscribers', 'SubscriberController@store');
- $router->put('components/groups/{component_group}', 'ComponentGroupController@putGroup');
- $router->put('components/{component}', 'ComponentController@putComponent');
- $router->put('incidents/{incident}', 'IncidentController@putIncident');
- $router->put('incidents/{incident}/updates/{update}', 'IncidentUpdateController@putIncidentUpdate');
- $router->put('metrics/{metric}', 'MetricController@putMetric');
- $router->put('metrics/{metric}/points/{metric_point}', 'MetricPointController@putMetricPoint');
- $router->put('schedules/{schedule}', 'ScheduleController@putSchedule');
+ $router->put('components/groups/{component_group}', 'ComponentGroupController@update');
+ $router->put('components/{component}', 'ComponentController@update');
+ $router->put('incidents/{incident}', 'IncidentController@update');
+ $router->put('incidents/{incident}/updates/{update}', 'IncidentUpdateController@update');
+ $router->put('metrics/{metric}', 'MetricController@update');
+ $router->put('metrics/{metric}/points/{metric_point}', 'MetricPointController@update');
+ $router->put('schedules/{schedule}', 'ScheduleController@update');
- $router->delete('components/groups/{component_group}', 'ComponentGroupController@deleteGroup');
- $router->delete('components/{component}', 'ComponentController@deleteComponent');
- $router->delete('incidents/{incident}', 'IncidentController@deleteIncident');
- $router->delete('incidents/{incident}/updates/{update}', 'IncidentUpdateController@deleteIncidentUpdate');
- $router->delete('metrics/{metric}', 'MetricController@deleteMetric');
- $router->delete('metrics/{metric}/points/{metric_point}', 'MetricPointController@deleteMetricPoint');
- $router->delete('schedules/{schedule}', 'ScheduleController@deleteSchedule');
- $router->delete('subscribers/{subscriber}', 'SubscriberController@deleteSubscriber');
- $router->delete('subscriptions/{subscription}', 'SubscriberController@deleteSubscription');
+ $router->delete('components/groups/{component_group}', 'ComponentGroupController@destroy');
+ $router->delete('components/{component}', 'ComponentController@destroy');
+ $router->delete('incidents/{incident}', 'IncidentController@destroy');
+ $router->delete('incidents/{incident}/updates/{update}', 'IncidentUpdateController@destroy');
+ $router->delete('metrics/{metric}', 'MetricController@destroy');
+ $router->delete('metrics/{metric}/points/{metric_point}', 'MetricPointController@destroy');
+ $router->delete('schedules/{schedule}', 'ScheduleController@destroy');
+ $router->delete('subscribers/{subscriber}', 'SubscriberController@destroy');
+ $router->delete('subscriptions/{subscription}', 'SubscriptionController@destroy');
});
});
}
diff --git a/app/Http/Routes/FeedRoutes.php b/app/Http/Routes/ApiSystemRoutes.php
similarity index 54%
rename from app/Http/Routes/FeedRoutes.php
rename to app/Http/Routes/ApiSystemRoutes.php
index 2a4f930efd7f..92a7aa2e31a8 100644
--- a/app/Http/Routes/FeedRoutes.php
+++ b/app/Http/Routes/ApiSystemRoutes.php
@@ -14,21 +14,21 @@
use Illuminate\Contracts\Routing\Registrar;
/**
- * This is the feed routes class.
+ * This is the api routes class.
*
* @author James Brooks
*/
-class FeedRoutes
+class ApiSystemRoutes
{
/**
* Defines if these routes are for the browser.
*
* @var bool
*/
- public static $browser = true;
+ public static $browser = false;
/**
- * Define the status page routes.
+ * Define the api routes for the system status, ping and version.
*
* @param \Illuminate\Contracts\Routing\Registrar $router
*
@@ -37,17 +37,14 @@ class FeedRoutes
public function map(Registrar $router)
{
$router->group([
- 'middleware' => ['ready'],
+ 'namespace' => 'Api',
+ 'prefix' => 'api/v1',
], function (Registrar $router) {
- $router->get('/atom/{component_group?}', [
- 'as' => 'get:feed.atom',
- 'uses' => 'FeedController@atomAction',
- ]);
-
- $router->get('/rss/{component_group?}', [
- 'as' => 'get:feed.rss',
- 'uses' => 'FeedController@rssAction',
- ]);
+ $router->group(['middleware' => ['auth.api']], function (Registrar $router) {
+ $router->get('ping', 'GeneralController@ping');
+ $router->get('version', 'GeneralController@version');
+ $router->get('status', ['uses' => 'GeneralController@status', 'middleware' => ['cache']]);
+ });
});
}
}
diff --git a/app/Http/Routes/Dashboard/ComponentRoutes.php b/app/Http/Routes/Dashboard/ComponentRoutes.php
index ed14f1e1af8b..aa7852f827e2 100644
--- a/app/Http/Routes/Dashboard/ComponentRoutes.php
+++ b/app/Http/Routes/Dashboard/ComponentRoutes.php
@@ -58,29 +58,29 @@ public function map(Registrar $router)
$router->get('groups', [
'as' => 'get:dashboard.components.groups',
- 'uses' => 'ComponentController@showComponentGroups',
+ 'uses' => 'ComponentGroupController@showComponentGroups',
]);
$router->get('groups/create', [
'as' => 'get:dashboard.components.groups.create',
- 'uses' => 'ComponentController@showAddComponentGroup',
+ 'uses' => 'ComponentGroupController@showAddComponentGroup',
]);
$router->post('groups/create', [
'as' => 'post:dashboard.components.groups.create',
- 'uses' => 'ComponentController@postAddComponentGroup',
+ 'uses' => 'ComponentGroupController@postAddComponentGroup',
]);
$router->get('groups/{component_group}', [
'as' => 'get:dashboard.components.groups.edit',
- 'uses' => 'ComponentController@showEditComponentGroup',
+ 'uses' => 'ComponentGroupController@showEditComponentGroup',
]);
$router->post('groups/{component_group}', [
'as' => 'post:dashboard.components.groups.edit',
- 'uses' => 'ComponentController@updateComponentGroupAction',
+ 'uses' => 'ComponentGroupController@updateComponentGroupAction',
]);
$router->delete('groups/{component_group}', [
'as' => 'delete:dashboard.components.groups.delete',
- 'uses' => 'ComponentController@deleteComponentGroupAction',
+ 'uses' => 'ComponentGroupController@deleteComponentGroupAction',
]);
$router->get('{component}', [
diff --git a/app/Http/Routes/Dashboard/IncidentRoutes.php b/app/Http/Routes/Dashboard/IncidentRoutes.php
index c312bc0862cf..4eee1e5e8e7e 100644
--- a/app/Http/Routes/Dashboard/IncidentRoutes.php
+++ b/app/Http/Routes/Dashboard/IncidentRoutes.php
@@ -71,11 +71,23 @@ public function map(Registrar $router)
$router->get('{incident}/updates', [
'as' => 'get:dashboard.incidents.updates',
- 'uses' => 'IncidentController@showIncidentUpdateAction',
+ 'uses' => 'IncidentUpdateController@showIncidentUpdates',
]);
- $router->post('{incident}/updates', [
- 'as' => 'post:dashboard.incidents.updates',
- 'uses' => 'IncidentController@createIncidentUpdateAction',
+ $router->get('{incident}/updates/create', [
+ 'as' => 'get:dashboard.incidents.updates.create',
+ 'uses' => 'IncidentUpdateController@showCreateIncidentUpdateAction',
+ ]);
+ $router->post('{incident}/updates/create', [
+ 'as' => 'post:dashboard.incidents.updates.create',
+ 'uses' => 'IncidentUpdateController@createIncidentUpdateAction',
+ ]);
+ $router->get('{incident}/updates/{incident_update}', [
+ 'as' => 'get:dashboard.incidents.updates.edit',
+ 'uses' => 'IncidentUpdateController@showEditIncidentUpdateAction',
+ ]);
+ $router->post('{incident}/updates/{incident_update}', [
+ 'as' => 'post:dashboard.incidents.updates.edit',
+ 'uses' => 'IncidentUpdateController@editIncidentUpdateAction',
]);
});
}
diff --git a/app/Http/Routes/Dashboard/TemplateRoutes.php b/app/Http/Routes/Dashboard/TemplateRoutes.php
index 289f975229be..ee4ed5df2699 100644
--- a/app/Http/Routes/Dashboard/TemplateRoutes.php
+++ b/app/Http/Routes/Dashboard/TemplateRoutes.php
@@ -44,29 +44,29 @@ public function map(Registrar $router)
], function (Registrar $router) {
$router->get('/', [
'as' => 'get:dashboard.templates',
- 'uses' => 'IncidentController@showTemplates',
+ 'uses' => 'IncidentTemplateController@showTemplates',
]);
$router->get('create', [
'as' => 'get:dashboard.templates.create',
- 'uses' => 'IncidentController@showAddIncidentTemplate',
+ 'uses' => 'IncidentTemplateController@showAddIncidentTemplate',
]);
$router->post('create', [
'as' => 'post:dashboard.templates.create',
- 'uses' => 'IncidentController@createIncidentTemplateAction',
+ 'uses' => 'IncidentTemplateController@createIncidentTemplateAction',
]);
$router->get('{incident_template}', [
'as' => 'get:dashboard.templates.edit',
- 'uses' => 'IncidentController@showEditTemplateAction',
+ 'uses' => 'IncidentTemplateController@showEditTemplateAction',
]);
$router->post('{incident_template}', [
'as' => 'post:dashboard.templates.edit',
- 'uses' => 'IncidentController@editTemplateAction',
+ 'uses' => 'IncidentTemplateController@editTemplateAction',
]);
$router->delete('{incident_template}', [
'as' => 'delete:dashboard.templates.delete',
- 'uses' => 'IncidentController@deleteTemplateAction',
+ 'uses' => 'IncidentTemplateController@deleteTemplateAction',
]);
});
}
diff --git a/app/Http/Routes/Setup/ApiRoutes.php b/app/Http/Routes/Setup/ApiRoutes.php
new file mode 100644
index 000000000000..8a3a3897779c
--- /dev/null
+++ b/app/Http/Routes/Setup/ApiRoutes.php
@@ -0,0 +1,59 @@
+
+ */
+class ApiRoutes
+{
+ /**
+ * Defines if these routes are for the browser.
+ *
+ * @var bool
+ */
+ public static $browser = false;
+
+ /**
+ * Define the setup routes.
+ *
+ * @param \Illuminate\Contracts\Routing\Registrar $router
+ *
+ * @return void
+ */
+ public function map(Registrar $router)
+ {
+ $router->group([
+ 'middleware' => ['setup'],
+ 'prefix' => 'setup',
+ ], function (Registrar $router) {
+ $router->post('step1', [
+ 'as' => 'post:setup.step1',
+ 'uses' => 'SetupController@postStep1',
+ ]);
+
+ $router->post('step2', [
+ 'as' => 'post:setup.step2',
+ 'uses' => 'SetupController@postStep2',
+ ]);
+
+ $router->post('step3', [
+ 'as' => 'post:setup.step3',
+ 'uses' => 'SetupController@postStep3',
+ ]);
+ });
+ }
+}
diff --git a/app/Http/Routes/SetupRoutes.php b/app/Http/Routes/SetupRoutes.php
index 2558237ce5c3..eb1319546bda 100644
--- a/app/Http/Routes/SetupRoutes.php
+++ b/app/Http/Routes/SetupRoutes.php
@@ -45,21 +45,6 @@ public function map(Registrar $router)
'as' => 'get:setup',
'uses' => 'SetupController@getIndex',
]);
-
- $router->post('step1', [
- 'as' => 'post:setup.step1',
- 'uses' => 'SetupController@postStep1',
- ]);
-
- $router->post('step2', [
- 'as' => 'post:setup.step2',
- 'uses' => 'SetupController@postStep2',
- ]);
-
- $router->post('step3', [
- 'as' => 'post:setup.step3',
- 'uses' => 'SetupController@postStep3',
- ]);
});
}
}
diff --git a/app/Http/Routes/SubscribeRoutes.php b/app/Http/Routes/SubscribeRoutes.php
index e844ba182364..8c5279d43e98 100644
--- a/app/Http/Routes/SubscribeRoutes.php
+++ b/app/Http/Routes/SubscribeRoutes.php
@@ -49,8 +49,9 @@ public function map(Registrar $router)
]);
$router->get('subscribe/manage/{code}', [
- 'as' => 'get:subscribe.manage',
- 'uses' => 'SubscribeController@showManage',
+ 'as' => 'get:subscribe.manage',
+ 'middleware' => ['signed'],
+ 'uses' => 'SubscribeController@showManage',
]);
$router->post('subscribe/manage/{code}', [
'as' => 'post:subscribe.manage',
@@ -58,8 +59,9 @@ public function map(Registrar $router)
]);
$router->get('subscribe/verify/{code}', [
- 'as' => 'get:subscribe.verify',
- 'uses' => 'SubscribeController@getVerify',
+ 'as' => 'get:subscribe.verify',
+ 'middleware' => ['signed'],
+ 'uses' => 'SubscribeController@getVerify',
]);
$router->get('unsubscribe/{code}/{subscription?}', [
diff --git a/app/Integrations/Contracts/System.php b/app/Integrations/Contracts/System.php
index 385ad5015b9a..a064e71065f1 100644
--- a/app/Integrations/Contracts/System.php
+++ b/app/Integrations/Contracts/System.php
@@ -25,6 +25,13 @@ interface System
*/
public function getStatus();
+ /**
+ * Determine if Cachet is allowed to send notifications to users, subscribers or third party tools.
+ *
+ * @return bool
+ */
+ public function canNotifySubscribers();
+
/**
* Get the cachet version.
*
diff --git a/app/Integrations/Core/Beacon.php b/app/Integrations/Core/Beacon.php
index 44f141d9e258..f4a283ab8354 100644
--- a/app/Integrations/Core/Beacon.php
+++ b/app/Integrations/Core/Beacon.php
@@ -14,14 +14,18 @@
use CachetHQ\Cachet\Bus\Events\Beacon\BeaconFailedToSendEvent;
use CachetHQ\Cachet\Bus\Events\Beacon\BeaconWasSentEvent;
use CachetHQ\Cachet\Integrations\Contracts\Beacon as BeaconContract;
+use CachetHQ\Cachet\Models\Action;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\Metric;
+use CachetHQ\Cachet\Models\Schedule;
+use CachetHQ\Cachet\Models\Tag;
use CachetHQ\Cachet\Models\User;
use CachetHQ\Cachet\Settings\Repository as Setting;
use Exception;
use GuzzleHttp\Client;
use Illuminate\Contracts\Config\Repository;
+use Illuminate\Support\Str;
/**
* This is the beacon class.
@@ -78,29 +82,27 @@ public function send()
return;
}
- if (!($contactEmail = User::admins()->active()->first()->email)) {
- $contactEmail = null;
- }
-
$setting = app(Setting::class);
if (!$installId = $setting->get('install_id', null)) {
- $installId = sha1(str_random(20));
+ $installId = sha1(Str::random(20));
$setting->set('install_id', $installId);
}
$payload = [
- 'install_id' => $installId,
- 'version' => CACHET_VERSION,
- 'docker' => $this->config->get('cachet.is_docker'),
- 'database' => $this->config->get('database.default'),
- 'contact_email' => $contactEmail,
- 'data' => [
+ 'install_id' => $installId,
+ 'version' => CACHET_VERSION,
+ 'docker' => $this->config->get('cachet.is_docker'),
+ 'database' => $this->config->get('database.default'),
+ 'data' => [
'components' => Component::all()->count(),
'incidents' => Incident::all()->count(),
'metrics' => Metric::all()->count(),
'users' => User::all()->count(),
+ 'actions' => Action::all()->count(),
+ 'tags' => Tag::all()->count(),
+ 'schedules' => Schedule::all()->count(),
],
];
diff --git a/app/Integrations/Core/Credits.php b/app/Integrations/Core/Credits.php
index f962606244d0..e821c3b6f29b 100644
--- a/app/Integrations/Core/Credits.php
+++ b/app/Integrations/Core/Credits.php
@@ -16,6 +16,12 @@
use GuzzleHttp\Client;
use Illuminate\Contracts\Cache\Repository;
+/**
+ * This is the credits class.
+ *
+ * @author Graham Campbell
+ * @author James Brooks
+ */
class Credits implements CreditsContract
{
/**
diff --git a/app/Integrations/Core/Feed.php b/app/Integrations/Core/Feed.php
index 824bdb20f052..1ab93c4d02d4 100644
--- a/app/Integrations/Core/Feed.php
+++ b/app/Integrations/Core/Feed.php
@@ -28,7 +28,7 @@ class Feed implements FeedContract
*
* @var string
*/
- const URL = 'https://blog.alt-three.com/tag/cachet/rss';
+ const URL = 'https://alt-three.com/tag/cachet/rss';
/**
* The failed status indicator.
diff --git a/app/Integrations/Core/System.php b/app/Integrations/Core/System.php
index 072b166ce444..b1f7183c1e70 100644
--- a/app/Integrations/Core/System.php
+++ b/app/Integrations/Core/System.php
@@ -14,6 +14,8 @@
use CachetHQ\Cachet\Integrations\Contracts\System as SystemContract;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\Incident;
+use CachetHQ\Cachet\Models\Schedule;
+use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Config\Repository;
/**
@@ -30,16 +32,25 @@ class System implements SystemContract
*/
protected $config;
+ /**
+ * The illuminate guard instance.
+ *
+ * @var \Illuminate\Contracts\Auth\Guard
+ */
+ protected $auth;
+
/**
* Create a new system instance.
*
* @param \Illuminate\Contracts\Config\Repository $config
+ * @param \Illuminate\Contracts\Auth\Guard $auth
*
* @return void
*/
- public function __construct(Repository $config)
+ public function __construct(Repository $config, Guard $auth)
{
$this->config = $config;
+ $this->auth = $auth;
}
/**
@@ -49,9 +60,12 @@ public function __construct(Repository $config)
*/
public function getStatus()
{
- $totalComponents = Component::enabled()->count();
- $majorOutages = Component::enabled()->status(4)->count();
- $isMajorOutage = $totalComponents ? ($majorOutages / $totalComponents) >= 0.5 : false;
+ $includePrivate = $this->auth->check();
+
+ $totalComponents = Component::enabled()->authenticated($includePrivate)->count();
+ $majorOutages = Component::enabled()->authenticated($includePrivate)->status(4)->count();
+ $majorOutageRate = (int) $this->config->get('setting.major_outage_rate', '50');
+ $isMajorOutage = $totalComponents ? ($majorOutages / $totalComponents) * 100 >= $majorOutageRate : false;
// Default data
$status = [
@@ -66,7 +80,7 @@ public function getStatus()
'system_message' => trans_choice('cachet.service.major', $totalComponents),
'favicon' => 'favicon-high-alert',
];
- } elseif (Component::enabled()->notStatus(1)->count() === 0) {
+ } elseif (Component::enabled()->authenticated($includePrivate)->notStatus(1)->count() === 0) {
// If all our components are ok, do we have any non-fixed incidents?
$incidents = Incident::orderBy('occurred_at', 'desc')->get()->filter(function ($incident) {
return $incident->status !== Incident::FIXED;
@@ -83,13 +97,28 @@ public function getStatus()
'favicon' => 'favicon',
];
}
- } elseif (Component::enabled()->whereIn('status', [2, 3])->count() > 0) {
+ } elseif (Component::enabled()->authenticated($includePrivate)->whereIn('status', [2, 3])->count() > 0) {
$status['favicon'] = 'favicon-medium-alert';
}
return $status;
}
+ /**
+ * Determine if Cachet is allowed to send notifications to users, subscribers or third party tools.
+ *
+ * @return bool
+ */
+ public function canNotifySubscribers()
+ {
+ $maintenancePeriods = Schedule::inProgress()->count();
+ if ($maintenancePeriods === 0) {
+ return true;
+ }
+
+ return !$this->config->get('setting.suppress_notifications_in_maintenance');
+ }
+
/**
* Get the cachet version.
*
diff --git a/app/Models/Action.php b/app/Models/Action.php
index 5ff0a3103e86..be9cfcc1de63 100644
--- a/app/Models/Action.php
+++ b/app/Models/Action.php
@@ -24,20 +24,6 @@ class Action extends Model
{
use ValidatingTrait;
- /**
- * A list of methods protected from mass assignment.
- *
- * @var string[]
- */
- protected $guarded = ['_token', '_method'];
-
- /**
- * The relations to eager load on every query.
- *
- * @var string[]
- */
- protected $with = ['user'];
-
/**
* The attributes that should be casted to native types.
*
@@ -52,6 +38,13 @@ class Action extends Model
'description' => 'string',
];
+ /**
+ * A list of methods protected from mass assignment.
+ *
+ * @var string[]
+ */
+ protected $guarded = ['_token', '_method'];
+
/**
* The validation rules.
*
@@ -66,6 +59,13 @@ class Action extends Model
'description' => 'required|string',
];
+ /**
+ * The relations to eager load on every query.
+ *
+ * @var string[]
+ */
+ protected $with = ['user'];
+
/**
* Get the user relation.
*
diff --git a/app/Models/Component.php b/app/Models/Component.php
index 783d426d70b5..08da71576620 100644
--- a/app/Models/Component.php
+++ b/app/Models/Component.php
@@ -12,6 +12,8 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
+use CachetHQ\Cachet\Models\Traits\HasMeta;
+use CachetHQ\Cachet\Models\Traits\HasTags;
use CachetHQ\Cachet\Models\Traits\SearchableTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\ComponentPresenter;
@@ -22,7 +24,12 @@
class Component extends Model implements HasPresenter
{
- use SearchableTrait, SoftDeletes, SortableTrait, ValidatingTrait;
+ use HasTags;
+ use HasMeta;
+ use SearchableTrait;
+ use SoftDeletes;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* List of attributes that have default values.
@@ -64,7 +71,6 @@ class Component extends Model implements HasPresenter
'name',
'description',
'status',
- 'tags',
'link',
'order',
'group_id',
@@ -134,16 +140,6 @@ public function incidents()
return $this->hasMany(Incident::class, 'component_id', 'id');
}
- /**
- * Get the tags relation.
- *
- * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
- */
- public function tags()
- {
- return $this->belongsToMany(Tag::class);
- }
-
/**
* Finds all components by status.
*
@@ -182,6 +178,23 @@ public function scopeEnabled(Builder $query)
return $query->where('enabled', '=', true);
}
+ /**
+ * Find all components which are within visible groups.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param bool $authenticated
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeAuthenticated(Builder $query, $authenticated)
+ {
+ return $query->when(!$authenticated, function (Builder $query) {
+ return $query->whereDoesntHave('group', function (Builder $query) {
+ $query->where('visible', ComponentGroup::VISIBLE_AUTHENTICATED);
+ });
+ });
+ }
+
/**
* Finds all components which are disabled.
*
@@ -223,20 +236,6 @@ public function scopeGrouped(Builder $query)
->groupBy('group_id');
}
- /**
- * Returns all of the tags on this component.
- *
- * @return string
- */
- public function getTagsListAttribute()
- {
- $tags = $this->tags->map(function ($tag) {
- return $tag->name;
- });
-
- return implode(', ', $tags->toArray());
- }
-
/**
* Get the presenter class.
*
diff --git a/app/Models/ComponentGroup.php b/app/Models/ComponentGroup.php
index 6aebc82ccadf..f5a8af8ded56 100644
--- a/app/Models/ComponentGroup.php
+++ b/app/Models/ComponentGroup.php
@@ -27,8 +27,9 @@
*/
class ComponentGroup extends Model implements HasPresenter
{
- use SearchableTrait, SortableTrait, ValidatingTrait;
-
+ use SearchableTrait;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* Viewable only authenticated users.
*
diff --git a/app/Models/Incident.php b/app/Models/Incident.php
index 1816f850a60b..b1ddb58c06a9 100644
--- a/app/Models/Incident.php
+++ b/app/Models/Incident.php
@@ -12,6 +12,8 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
+use CachetHQ\Cachet\Models\Traits\HasMeta;
+use CachetHQ\Cachet\Models\Traits\HasTags;
use CachetHQ\Cachet\Models\Traits\SearchableTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\IncidentPresenter;
@@ -29,7 +31,12 @@
*/
class Incident extends Model implements HasPresenter
{
- use SearchableTrait, SoftDeletes, SortableTrait, ValidatingTrait;
+ use HasMeta;
+ use HasTags;
+ use SearchableTrait;
+ use SoftDeletes;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* Status for incident being investigated.
@@ -68,16 +75,30 @@ class Incident extends Model implements HasPresenter
'is_resolved',
];
+ /**
+ * The model's attributes.
+ *
+ * @var string[]
+ */
+ protected $attributes = [
+ 'stickied' => false,
+ 'notifications' => false,
+ ];
+
/**
* The attributes that should be casted to native types.
*
* @var string[]
*/
protected $casts = [
- 'visible' => 'int',
- 'stickied' => 'bool',
- 'occurred_at' => 'date',
- 'deleted_at' => 'date',
+ 'component_id' => 'int',
+ 'status' => 'int',
+ 'user_id' => 'int',
+ 'visible' => 'int',
+ 'stickied' => 'bool',
+ 'notifications' => 'bool',
+ 'occurred_at' => 'datetime',
+ 'deleted_at' => 'date',
];
/**
@@ -86,11 +107,13 @@ class Incident extends Model implements HasPresenter
* @var string[]
*/
protected $fillable = [
+ 'user_id',
'component_id',
'name',
'status',
'visible',
'stickied',
+ 'notifications',
'message',
'occurred_at',
'created_at',
@@ -103,12 +126,14 @@ class Incident extends Model implements HasPresenter
* @var string[]
*/
public $rules = [
- 'component_id' => 'nullable|int',
- 'name' => 'required|string',
- 'status' => 'required|int',
- 'visible' => 'required|bool',
- 'stickied' => 'required|bool',
- 'message' => 'required|string',
+ 'user_id' => 'nullable|int',
+ 'component_id' => 'nullable|int',
+ 'name' => 'required|string',
+ 'status' => 'required|int',
+ 'visible' => 'required|bool',
+ 'stickied' => 'required|bool',
+ 'notifications' => 'nullable|bool',
+ 'message' => 'required|string',
];
/**
@@ -118,6 +143,7 @@ class Incident extends Model implements HasPresenter
*/
protected $searchable = [
'id',
+ 'user_id',
'component_id',
'name',
'status',
@@ -132,6 +158,7 @@ class Incident extends Model implements HasPresenter
*/
protected $sortable = [
'id',
+ 'user_id',
'name',
'status',
'visible',
@@ -145,7 +172,10 @@ class Incident extends Model implements HasPresenter
*
* @var string[]
*/
- protected $with = ['updates'];
+ protected $with = [
+ 'meta',
+ 'updates',
+ ];
/**
* Get the component relation.
@@ -167,6 +197,16 @@ public function updates()
return $this->hasMany(IncidentUpdate::class)->orderBy('created_at', 'desc');
}
+ /**
+ * Get the user relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function user()
+ {
+ return $this->belongsTo(User::class);
+ }
+
/**
* Finds all visible incidents.
*
diff --git a/app/Models/IncidentComponent.php b/app/Models/IncidentComponent.php
new file mode 100644
index 000000000000..13218d152062
--- /dev/null
+++ b/app/Models/IncidentComponent.php
@@ -0,0 +1,78 @@
+
+ */
+class IncidentComponent extends Model
+{
+ use ValidatingTrait;
+
+ /**
+ * The attributes that should be casted to native types.
+ *
+ * @var string[]
+ */
+ protected $casts = [
+ 'incident_id' => 'int',
+ 'component_id' => 'int',
+ 'status_id' => 'int',
+ ];
+
+ /**
+ * The fillable properties.
+ *
+ * @var string[]
+ */
+ protected $fillable = [
+ 'incident_id',
+ 'component_id',
+ 'status_id',
+ ];
+
+ /**
+ * The validation rules.
+ *
+ * @var string[]
+ */
+ public $rules = [
+ 'incident_id' => 'required|int',
+ 'component_id' => 'required|int',
+ 'status_id' => 'required|int',
+ ];
+
+ /**
+ * Get the incident relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function incident()
+ {
+ return $this->belongsTo(Incident::class);
+ }
+
+ /**
+ * Get the component relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function component()
+ {
+ return $this->belongsTo(Component::class);
+ }
+}
diff --git a/app/Models/IncidentUpdate.php b/app/Models/IncidentUpdate.php
index 207e129edc28..0591a248562a 100644
--- a/app/Models/IncidentUpdate.php
+++ b/app/Models/IncidentUpdate.php
@@ -24,7 +24,8 @@
*/
class IncidentUpdate extends Model implements HasPresenter
{
- use SortableTrait, ValidatingTrait;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* The attributes that should be casted to native types.
@@ -83,6 +84,16 @@ public function incident()
return $this->belongsTo(Incident::class);
}
+ /**
+ * Get the user relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function user()
+ {
+ return $this->belongsTo(User::class);
+ }
+
/**
* Get the presenter class.
*
diff --git a/app/Models/Invite.php b/app/Models/Invite.php
index b917b3f1a044..292735c58495 100644
--- a/app/Models/Invite.php
+++ b/app/Models/Invite.php
@@ -13,6 +13,7 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
+use Illuminate\Support\Str;
/**
* This is the invite class.
@@ -51,7 +52,7 @@ public static function boot()
self::creating(function ($invite) {
if (!$invite->code) {
- $invite->code = str_random(20);
+ $invite->code = Str::random(20);
}
});
}
diff --git a/app/Models/Meta.php b/app/Models/Meta.php
new file mode 100644
index 000000000000..6c391d200ee2
--- /dev/null
+++ b/app/Models/Meta.php
@@ -0,0 +1,80 @@
+
+ */
+class Meta extends Model
+{
+ use ValidatingTrait;
+
+ /**
+ * The attributes that should be casted to native types.
+ *
+ * @var string[]
+ */
+ protected $casts = [
+ 'id' => 'int',
+ 'key' => 'string',
+ 'value' => 'json',
+ 'meta_id' => 'int',
+ 'meta_type' => 'string',
+ ];
+
+ /**
+ * The fillable properties.
+ *
+ * @var string[]
+ */
+ protected $fillable = [
+ 'key',
+ 'value',
+ 'meta_id',
+ 'meta_type',
+ ];
+
+ /**
+ * The validation rules.
+ *
+ * @var string[]
+ */
+ public $rules = [
+ 'id' => 'nullable|int|min:1',
+ 'key' => 'required|string',
+ 'value' => 'nullable',
+ 'meta_id' => 'required|int',
+ 'meta_type' => 'required|string',
+ ];
+
+ /**
+ * The table associated with the model.
+ *
+ * @var string
+ */
+ protected $table = 'meta';
+
+ /**
+ * Get all of the owning meta models.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\MorphTo
+ */
+ public function meta()
+ {
+ return $this->morphTo();
+ }
+}
diff --git a/app/Models/Metric.php b/app/Models/Metric.php
index 5ddeafc5ae9e..c3e6483ecfbd 100644
--- a/app/Models/Metric.php
+++ b/app/Models/Metric.php
@@ -12,15 +12,20 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
+use AltThree\Validator\ValidationException;
+use CachetHQ\Cachet\Models\Traits\HasMeta;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\MetricPresenter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\MessageBag;
use McCool\LaravelAutoPresenter\HasPresenter;
class Metric extends Model implements HasPresenter
{
- use SortableTrait, ValidatingTrait;
+ use HasMeta;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* The calculation type of sum.
@@ -122,7 +127,6 @@ class Metric extends Model implements HasPresenter
'default_value' => 'required|numeric',
'places' => 'required|numeric|between:0,4',
'default_view' => 'required|numeric|between:0,3',
- 'threshold' => 'required|numeric|between:0,10',
'visible' => 'required|numeric|between:0,2',
];
@@ -163,7 +167,7 @@ public static function boot()
*/
public function points()
{
- return $this->hasMany(MetricPoint::class, 'metric_id', 'id');
+ return $this->hasMany(MetricPoint::class, 'metric_id', 'id')->latest();
}
/**
@@ -175,7 +179,7 @@ public function points()
*/
public function scopeDisplayable(Builder $query)
{
- return $query->where('display_chart', '=', true)->where('visible', '!=', self::VISIBLE_HIDDEN);
+ return $query->where('display_chart', '=', true)->where('visible', '<>', self::VISIBLE_HIDDEN);
}
/**
@@ -200,6 +204,26 @@ public function getShouldDisplayAttribute()
return $this->display_chart;
}
+ /**
+ * Validate the model before save.
+ *
+ * @throws \AltThree\Validator\ValidationException
+ *
+ * @return void
+ */
+ public function validate()
+ {
+ $messages = [];
+
+ if (60 % $this->threshold !== 0) {
+ $messages[] = 'Threshold must divide by 60.';
+ }
+
+ if ($messages) {
+ throw new ValidationException(new MessageBag($messages));
+ }
+ }
+
/**
* Get the presenter class.
*
diff --git a/app/Models/MetricPoint.php b/app/Models/MetricPoint.php
index 89d531013cf0..6e64940036ab 100644
--- a/app/Models/MetricPoint.php
+++ b/app/Models/MetricPoint.php
@@ -13,13 +13,31 @@
use AltThree\Validator\ValidatingTrait;
use CachetHQ\Cachet\Presenters\MetricPointPresenter;
+use Carbon\Carbon;
+use DateTime;
use Illuminate\Database\Eloquent\Model;
use McCool\LaravelAutoPresenter\HasPresenter;
+/**
+ * This is the metric point model class.
+ *
+ * @author James Brooks
+ * @author Joseph Cohen
+ * @author Graham Campbell
+ */
class MetricPoint extends Model implements HasPresenter
{
use ValidatingTrait;
+ /**
+ * The accessors to append to the model's array form.
+ *
+ * @var string[]
+ */
+ protected $appends = [
+ 'calculated_value',
+ ];
+
/**
* The model's attributes.
*
@@ -73,19 +91,40 @@ public function metric()
}
/**
- * Override the value attribute.
+ * Show the actual calculated value; as per (value * counter).
*
- * @param mixed $value
+ * @return int
+ */
+ public function getCalculatedValueAttribute()
+ {
+ return $this->value * $this->counter;
+ }
+
+ /**
+ * Round the created at value into intervals of 30 seconds.
*
- * @return float
+ * @param string $createdAt
+ *
+ * @return string|void
*/
- public function getActiveValueAttribute($value)
+ public function setCreatedAtAttribute($createdAt)
{
- if ($this->metric->calc_type === Metric::CALC_SUM) {
- return round((float) $value * $this->counter, $this->metric->places);
+ if (!$createdAt) {
+ return;
}
- return round((float) $value, $this->metric->places);
+ if (!$createdAt instanceof DateTime) {
+ $createdAt = Carbon::parse($createdAt);
+ }
+
+ $timestamp = $createdAt->format('U');
+ $timestamp = 30 * round($timestamp / 30);
+
+ $date = Carbon::createFromFormat('U', $timestamp)->toDateTimeString();
+
+ $this->attributes['created_at'] = $date;
+
+ return $date;
}
/**
diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php
index 47b6d56a4862..93a7e3bbdf05 100644
--- a/app/Models/Schedule.php
+++ b/app/Models/Schedule.php
@@ -12,16 +12,23 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
+use CachetHQ\Cachet\Models\Traits\HasMeta;
use CachetHQ\Cachet\Models\Traits\SearchableTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\SchedulePresenter;
use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
use McCool\LaravelAutoPresenter\HasPresenter;
class Schedule extends Model implements HasPresenter
{
- use SearchableTrait, SortableTrait, ValidatingTrait;
+ use HasMeta;
+ use SearchableTrait;
+ use SoftDeletes;
+ use SortableTrait;
+ use ValidatingTrait;
/**
* The upcoming status.
@@ -44,6 +51,16 @@ class Schedule extends Model implements HasPresenter
*/
const COMPLETE = 2;
+ /**
+ * The model's attributes.
+ *
+ * @var string[]
+ */
+ protected $attributes = [
+ 'status' => self::UPCOMING,
+ 'completed_at' => null,
+ ];
+
/**
* The attributes that should be casted to native types.
*
@@ -53,8 +70,8 @@ class Schedule extends Model implements HasPresenter
'name' => 'string',
'message' => 'string',
'status' => 'int',
- 'scheduled_at' => 'date',
- 'completed_at' => 'date',
+ 'scheduled_at' => 'datetime',
+ 'completed_at' => 'datetime',
];
/**
@@ -116,6 +133,44 @@ class Schedule extends Model implements HasPresenter
*/
protected $with = ['components'];
+ /**
+ * Get the components relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function components()
+ {
+ return $this->hasMany(ScheduleComponent::class);
+ }
+
+ /**
+ * Scope schedules that are uncompleted.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeUncompleted(Builder $query)
+ {
+ return $query->whereIn('status', [self::UPCOMING, self::IN_PROGRESS])->where(function (Builder $query) {
+ return $query->whereNull('completed_at');
+ });
+ }
+
+ /**
+ * Scope schedules that are in progress.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeInProgress(Builder $query)
+ {
+ return $query->where('scheduled_at', '<=', Carbon::now())->where('status', '<>', self::COMPLETE)->where(function ($query) {
+ $query->whereNull('completed_at');
+ });
+ }
+
/**
* Scopes schedules to those in the future.
*
@@ -123,31 +178,33 @@ class Schedule extends Model implements HasPresenter
*
* @return \Illuminate\Database\Eloquent\Builder
*/
- public function scopeFutureSchedules($query)
+ public function scopeScheduledInFuture($query)
{
return $query->whereIn('status', [self::UPCOMING, self::IN_PROGRESS])->where('scheduled_at', '>=', Carbon::now());
}
/**
- * Scopes schedules to those in the past.
+ * Scopes schedules to those scheduled in the past.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
- public function scopePastSchedules($query)
+ public function scopeScheduledInPast($query)
{
- return $query->where('status', '<', self::COMPLETE)->where('scheduled_at', '<=', Carbon::now());
+ return $query->whereIn('status', [self::UPCOMING, self::IN_PROGRESS])->where('scheduled_at', '<=', Carbon::now());
}
/**
- * Get the components relation.
+ * Scopes schedules to those completed in the past.
*
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
*/
- public function components()
+ public function scopeCompletedInPast($query)
{
- return $this->hasMany(ScheduleComponent::class);
+ return $query->where('status', '=', self::COMPLETE)->where('completed_at', '<=', Carbon::now());
}
/**
diff --git a/app/Models/Setting.php b/app/Models/Setting.php
index 0ea02148e129..54ea2b77a139 100644
--- a/app/Models/Setting.php
+++ b/app/Models/Setting.php
@@ -15,6 +15,13 @@
class Setting extends Model
{
+ /**
+ * List of attributes that have default values.
+ *
+ * @var string[]
+ */
+ protected $attributes = ['value' => ''];
+
/**
* The attributes that should be casted to native types.
*
@@ -31,11 +38,4 @@ class Setting extends Model
* @var string[]
*/
protected $fillable = ['name', 'value'];
-
- /**
- * List of attributes that have default values.
- *
- * @var string[]
- */
- protected $attributes = ['value' => ''];
}
diff --git a/app/Models/Subscriber.php b/app/Models/Subscriber.php
index de3e3838c105..e10a093b16a1 100644
--- a/app/Models/Subscriber.php
+++ b/app/Models/Subscriber.php
@@ -12,10 +12,12 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
+use CachetHQ\Cachet\Models\Traits\HasMeta;
use CachetHQ\Cachet\Presenters\SubscriberPresenter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
+use Illuminate\Support\Str;
use McCool\LaravelAutoPresenter\HasPresenter;
/**
@@ -27,7 +29,9 @@
*/
class Subscriber extends Model implements HasPresenter
{
- use Notifiable, ValidatingTrait;
+ use HasMeta;
+ use Notifiable;
+ use ValidatingTrait;
/**
* The attributes that should be casted to native types.
@@ -156,7 +160,7 @@ public function getIsVerifiedAttribute()
*/
public static function generateVerifyCode()
{
- return str_random(42);
+ return Str::random(42);
}
/**
diff --git a/app/Models/Tag.php b/app/Models/Tag.php
index f0a18eece275..022ceb8c528f 100644
--- a/app/Models/Tag.php
+++ b/app/Models/Tag.php
@@ -55,4 +55,31 @@ public function components()
{
return $this->belongsToMany(Component::class);
}
+
+ /**
+ * @param array|\ArrayAccess $values
+ *
+ * @return \CachetHQ\Cachet\Models\Tag|static
+ */
+ public static function findOrCreate($values)
+ {
+ $tags = collect($values)->map(function ($value) {
+ if ($value instanceof self) {
+ return $value;
+ }
+
+ $tag = static::where('name', '=', $value)->first();
+
+ if (!$tag instanceof self) {
+ $tag = static::create([
+ 'name' => $value,
+ 'slug' => Str::slug($value),
+ ]);
+ }
+
+ return $tag;
+ });
+
+ return is_string($values) ? $tags->first() : $tags;
+ }
}
diff --git a/app/Models/Traits/HasMeta.php b/app/Models/Traits/HasMeta.php
new file mode 100644
index 000000000000..3571cf0a7e65
--- /dev/null
+++ b/app/Models/Traits/HasMeta.php
@@ -0,0 +1,32 @@
+
+ */
+trait HasMeta
+{
+ /**
+ * Get the meta relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\MorphMany
+ */
+ public function meta()
+ {
+ return $this->morphMany(Meta::class, 'meta');
+ }
+}
diff --git a/app/Models/Traits/HasTags.php b/app/Models/Traits/HasTags.php
new file mode 100644
index 000000000000..b707e050ff79
--- /dev/null
+++ b/app/Models/Traits/HasTags.php
@@ -0,0 +1,196 @@
+
+ */
+trait HasTags
+{
+ /**
+ * @var array
+ */
+ protected $queuedTags = [];
+
+ /**
+ * Boot the trait.
+ *
+ * @return void
+ */
+ public static function bootHasTags()
+ {
+ static::created(function (Model $taggableModel) {
+ if (count($taggableModel->queuedTags) > 0) {
+ $taggableModel->attachTags($taggableModel->queuedTags);
+
+ $taggableModel->queuedTags = [];
+ }
+ });
+
+ static::deleted(function (Model $deletedModel) {
+ $tags = $deletedModel->tags()->get();
+
+ $deletedModel->detachTags($tags);
+ });
+ }
+
+ /**
+ * Get the tags relation.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
+ */
+ public function tags()
+ {
+ return $this->morphToMany(Tag::class, 'taggable');
+ }
+
+ /**
+ * @param string|array|\ArrayAccess|\CachetHQ\Cachet\Models\Tag $tags
+ */
+ public function setTagsAttribute($tags)
+ {
+ if (!$this->exists) {
+ $this->queuedTags = $tags;
+
+ return;
+ }
+
+ $this->attachTags($tags);
+ }
+
+ /**
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param array|\ArrayAccess $tags
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeWithAllTags(Builder $query, $tags)
+ {
+ $tags = static::convertToTags($tags);
+
+ $tags->each(function ($tag) use ($query) {
+ $query->whereHas('tags', function (Builder $query) use ($tag) {
+ return $query->where('tags.id', $tag ? $tag->id : 0);
+ });
+ });
+
+ return $query;
+ }
+
+ /**
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param array|\ArrayAccess $tags
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeWithAnyTags(Builder $query, $tags)
+ {
+ $tags = static::convertToTags($tags);
+
+ return $query->whereHas('tags', function (Builder $query) use ($tags) {
+ $tagIds = collect($tags)->pluck('id');
+
+ $query->whereIn('tags.id', $tagIds);
+ });
+ }
+
+ /**
+ * @param array|\ArrayAccess|\CachetHQ\Cachet\Models\Tag $tags
+ *
+ * @return $this
+ */
+ public function attachTags($tags)
+ {
+ $tags = collect(Tag::findOrCreate($tags));
+
+ $this->tags()->syncWithoutDetaching($tags->pluck('id')->toArray());
+
+ return $this;
+ }
+
+ /**
+ * @param string|\CachetHQ\Cachet\Models\Tag $tag
+ *
+ * @return $this
+ */
+ public function attachTag($tag)
+ {
+ return $this->attachTags([$tag]);
+ }
+
+ /**
+ * @param array|\ArrayAccess $tags
+ *
+ * @return $this
+ */
+ public function detachTags($tags)
+ {
+ $tags = static::convertToTags($tags);
+
+ collect($tags)
+ ->filter()
+ ->each(function (Tag $tag) {
+ $this->tags()->detach($tag);
+ });
+
+ return $this;
+ }
+
+ /**
+ * @param string|\CachetHQ\Cachet\Models\Tag $tag
+ *
+ * @return $this
+ */
+ public function detachTag($tag)
+ {
+ return $this->detachTags([$tag]);
+ }
+
+ /**
+ * @param array|\ArrayAccess $tags
+ *
+ * @return $this
+ */
+ public function syncTags($tags)
+ {
+ $tags = collect(Tag::findOrCreate($tags));
+
+ $this->tags()->sync($tags->pluck('id')->toArray());
+
+ return $this;
+ }
+
+ /**
+ * Convert a list of tags into a collection of \CachetHQ\Cachet\Models\Tag.
+ *
+ * @param array|\ArrayAccess $values
+ *
+ * @return \Illuminate\Support\Collection
+ */
+ protected static function convertToTags($values)
+ {
+ return collect($values)->map(function ($value) {
+ if ($value instanceof Tag) {
+ return $value;
+ }
+
+ return Tag::where('slug', '=', $value)->first();
+ });
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
index 3be0e867b149..7e568bd05108 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -17,6 +17,7 @@
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Str;
/**
* This is the user model.
@@ -25,8 +26,8 @@
*/
class User extends Authenticatable
{
- use Notifiable, ValidatingTrait;
-
+ use Notifiable;
+ use ValidatingTrait;
/**
* The admin level of user.
*
@@ -162,18 +163,6 @@ public function setPasswordAttribute($password)
return $this;
}
- /**
- * Returns a Gravatar URL for the users email address.
- *
- * @param int $size
- *
- * @return string
- */
- public function getGravatarAttribute($size = 200)
- {
- return sprintf('https://www.gravatar.com/avatar/%s?size=%d', md5(strtolower($this->email)), $size);
- }
-
/**
* Find by api_key, or throw an exception.
*
@@ -198,7 +187,7 @@ public static function findByApiToken($token, $columns = ['*'])
*/
public static function generateApiKey()
{
- return str_random(20);
+ return Str::random(20);
}
/**
diff --git a/app/Notifications/Component/ComponentStatusChangedNotification.php b/app/Notifications/Component/ComponentStatusChangedNotification.php
index dfe5ad8d1edc..02d02d4ac3a4 100644
--- a/app/Notifications/Component/ComponentStatusChangedNotification.php
+++ b/app/Notifications/Component/ComponentStatusChangedNotification.php
@@ -84,11 +84,15 @@ public function toMail($notifiable)
]);
return (new MailMessage())
- ->subject(trans('notifications.component.status_update.mail.subject'))
- ->greeting(trans('notifications.component.status_update.mail.subject'))
- ->line($content)
- ->action(trans('notifications.component.status_update.mail.action'), cachet_route('status-page'))
- ->line(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ ->subject(trans('notifications.component.status_update.mail.subject'))
+ ->markdown('notifications.component.update', [
+ 'componentName' => $this->component->name,
+ 'content' => $content,
+ 'unsubscribeText' => trans('cachet.subscriber.unsubscribe'),
+ 'unsubscribeUrl' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code),
+ 'manageSubscriptionText' => trans('cachet.subscriber.manage_subscription'),
+ 'manageSubscriptionUrl' => cachet_route('subscribe.manage', $notifiable->verify_code),
+ ]);
}
/**
@@ -136,15 +140,15 @@ public function toSlack($notifiable)
return (new SlackMessage())
->$status()
- ->content(trans('notifications.component.status_update.slack.subject'))
+ ->content(trans('notifications.component.status_update.slack.title'))
->attachment(function ($attachment) use ($content, $notifiable) {
$attachment->title($content, cachet_route('status-page'))
->fields(array_filter([
- 'Component' => $this->component->name,
- 'Old Status' => $this->component->human_status,
- 'New Status' => trans("cachet.components.status.{$this->status}"),
- 'Link' => $this->component->link,
- ]))
+ 'Component' => $this->component->name,
+ 'Old Status' => $this->component->human_status,
+ 'New Status' => trans("cachet.components.status.{$this->status}"),
+ 'Link' => $this->component->link,
+ ]))
->footer(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
});
}
diff --git a/app/Notifications/Incident/NewIncidentNotification.php b/app/Notifications/Incident/NewIncidentNotification.php
index 0700f7924183..ac56c9dea95a 100644
--- a/app/Notifications/Incident/NewIncidentNotification.php
+++ b/app/Notifications/Incident/NewIncidentNotification.php
@@ -75,11 +75,16 @@ public function toMail($notifiable)
return (new MailMessage())
->subject(trans('notifications.incident.new.mail.subject'))
- ->greeting(trans('notifications.incident.new.mail.greeting', ['app_name' => Config::get('setting.app_name')]))
- ->line($content)
- ->action(trans('notifications.incident.new.mail.action'), cachet_route('incident', [$this->incident]))
- ->line($this->incident->message)
- ->line(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ ->markdown('notifications.incident.new', [
+ 'incident' => $this->incident,
+ 'content' => $content,
+ 'actionText' => trans('notifications.incident.new.mail.action'),
+ 'actionUrl' => cachet_route('incident', [$this->incident]),
+ 'unsubscribeText' => trans('cachet.subscriber.unsubscribe'),
+ 'unsubscribeUrl' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code),
+ 'manageSubscriptionText' => trans('cachet.subscriber.manage_subscription'),
+ 'manageSubscriptionUrl' => cachet_route('subscribe.manage', $notifiable->verify_code),
+ ]);
}
/**
@@ -122,14 +127,13 @@ public function toSlack($notifiable)
return (new SlackMessage())
->$status()
->content($content)
- ->attachment(function ($attachment) use ($content, $notifiable) {
- $attachment->title(trans('notifications.incident.new.slack.title', [$this->incident->name]))
+ ->attachment(function ($attachment) {
+ $attachment->title(trans('notifications.incident.new.slack.title', ['name' => $this->incident->name]))
->timestamp($this->incident->getWrappedObject()->occurred_at)
->fields(array_filter([
- 'ID' => "#{$this->incident->id}",
- 'Link' => $this->incident->permalink,
- ]))
- ->footer(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ 'ID' => "#{$this->incident->id}",
+ 'Link' => $this->incident->permalink,
+ ]));
});
}
}
diff --git a/app/Notifications/IncidentUpdate/IncidentUpdatedNotification.php b/app/Notifications/IncidentUpdate/IncidentUpdatedNotification.php
index 8d7c50f3c6ab..6c88b40370cb 100644
--- a/app/Notifications/IncidentUpdate/IncidentUpdatedNotification.php
+++ b/app/Notifications/IncidentUpdate/IncidentUpdatedNotification.php
@@ -32,7 +32,7 @@ class IncidentUpdatedNotification extends Notification
/**
* The incident update.
*
- * @var \CachetHQ\Cachet\Models\Incident
+ * @var \CachetHQ\Cachet\Models\IncidentUpdate
*/
protected $update;
@@ -75,15 +75,20 @@ public function toMail($notifiable)
]);
return (new MailMessage())
- ->subject(trans('notifications.incident.update.mail.subject'))
- ->greeting(trans('notifications.incident.update.mail.title', [
- 'name' => $this->update->incident->name,
- 'new_status' => $this->update->human_status,
- ]))
- ->line($content)
- ->action(trans('notifications.incident.update.mail.action'), cachet_route('incident', [$this->update->incident]))
- ->line($this->update->message)
- ->line(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ ->subject(trans('notifications.incident.update.mail.subject'))
+ ->markdown('notifications.incident.update', [
+ 'incident' => $this->update->incident,
+ 'update' => $this->update,
+ 'content' => $content,
+ 'actionText' => trans('notifications.incident.new.mail.action'),
+ 'actionUrl' => cachet_route('incident', [$this->update->incident]),
+ 'incidentName' => $this->update->incident->name,
+ 'newStatus' => $this->update->human_status,
+ 'unsubscribeText' => trans('cachet.subscriber.unsubscribe'),
+ 'unsubscribeUrl' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code),
+ 'manageSubscriptionText' => trans('cachet.subscriber.manage_subscription'),
+ 'manageSubscriptionUrl' => cachet_route('subscribe.manage', $notifiable->verify_code),
+ ]);
}
/**
@@ -129,16 +134,16 @@ public function toSlack($notifiable)
return (new SlackMessage())
->$status()
->content($content)
- ->attachment(function ($attachment) use ($content, $notifiable) {
+ ->attachment(function ($attachment) use ($notifiable) {
$attachment->title(trans('notifications.incident.update.slack.title', [
- 'name' => $this->update->incident->name,
- 'new_status' => $this->update->human_status,
- ]))
+ 'name' => $this->update->incident->name,
+ 'new_status' => $this->update->human_status,
+ ]))
->timestamp($this->update->getWrappedObject()->created_at)
->fields(array_filter([
- 'ID' => "#{$this->update->id}",
- 'Link' => $this->update->permalink,
- ]))
+ 'ID' => "#{$this->update->id}",
+ 'Link' => $this->update->permalink,
+ ]))
->footer(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
});
}
diff --git a/app/Notifications/Schedule/NewScheduleNotification.php b/app/Notifications/Schedule/NewScheduleNotification.php
index fa7bfd98adc0..3b04bc679f6c 100644
--- a/app/Notifications/Schedule/NewScheduleNotification.php
+++ b/app/Notifications/Schedule/NewScheduleNotification.php
@@ -13,6 +13,7 @@
use CachetHQ\Cachet\Models\Schedule;
use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\NexmoMessage;
use Illuminate\Notifications\Messages\SlackMessage;
@@ -24,7 +25,7 @@
*
* @author James Brooks
*/
-class NewScheduleNotification extends Notification
+class NewScheduleNotification extends Notification implements ShouldQueue
{
use Queueable;
@@ -74,11 +75,14 @@ public function toMail($notifiable)
]);
return (new MailMessage())
- ->subject(trans('notifications.schedule.new.mail.subject'))
- ->greeting(trans('notifications.schedule.new.mail.title'))
- ->line($content)
- ->action(trans('notifications.schedule.new.mail.action'), cachet_route('schedule', [$this->schedule]))
- ->line(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ ->subject(trans('notifications.schedule.new.mail.subject'))
+ ->markdown('notifications.schedule.new', [
+ 'content' => $content,
+ 'unsubscribeText' => trans('cachet.subscriber.unsubscribe'),
+ 'unsubscribeUrl' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code),
+ 'manageSubscriptionText' => trans('cachet.subscriber.manage_subscription'),
+ 'manageSubscriptionUrl' => cachet_route('subscribe.manage', $notifiable->verify_code),
+ ]);
}
/**
@@ -118,10 +122,9 @@ public function toSlack($notifiable)
$attachment->title($content)
->timestamp($this->schedule->getWrappedObject()->scheduled_at)
->fields(array_filter([
- 'ID' => "#{$this->schedule->id}",
- 'Status' => $this->schedule->human_status,
- ]))
- ->footer(trans('cachet.subscriber.unsubscribe', ['link' => cachet_route('subscribe.unsubscribe', $notifiable->verify_code)]));
+ 'ID' => "#{$this->schedule->id}",
+ 'Status' => $this->schedule->human_status,
+ ]));
});
}
}
diff --git a/app/Notifications/Subscriber/ManageSubscriptionNotification.php b/app/Notifications/Subscriber/ManageSubscriptionNotification.php
new file mode 100644
index 000000000000..e8f883980f69
--- /dev/null
+++ b/app/Notifications/Subscriber/ManageSubscriptionNotification.php
@@ -0,0 +1,52 @@
+ $notifiable->verify_code]);
+
+ return (new MailMessage())
+ ->subject(trans('notifications.subscriber.manage.mail.subject'))
+ ->greeting(trans('notifications.subscriber.manage.mail.title', ['app_name' => setting('app_name')]))
+ ->action(trans('notifications.subscriber.manage.mail.action'), $route)
+ ->line(trans('notifications.subscriber.manage.mail.content', ['app_name' => setting('app_name')]));
+ }
+}
diff --git a/app/Notifications/Subscriber/VerifySubscriptionNotification.php b/app/Notifications/Subscriber/VerifySubscriptionNotification.php
index 102263a3ea3c..76da5dab2368 100644
--- a/app/Notifications/Subscriber/VerifySubscriptionNotification.php
+++ b/app/Notifications/Subscriber/VerifySubscriptionNotification.php
@@ -15,6 +15,7 @@
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\URL;
/**
* This is the verify subscription notification class.
@@ -46,10 +47,12 @@ public function via($notifiable)
*/
public function toMail($notifiable)
{
+ $route = URL::signedRoute(cachet_route_generator('subscribe.verify'), ['code' => $notifiable->verify_code]);
+
return (new MailMessage())
->subject(trans('notifications.subscriber.verify.mail.subject'))
->greeting(trans('notifications.subscriber.verify.mail.title', ['app_name' => Config::get('setting.app_name')]))
- ->action(trans('notifications.subscriber.verify.mail.action'), cachet_route('subscribe.verify', ['code' => $notifiable->verify_code]))
+ ->action(trans('notifications.subscriber.verify.mail.action'), $route)
->line(trans('notifications.subscriber.verify.mail.content', ['app_name' => Config::get('setting.app_name')]));
}
}
diff --git a/app/Presenters/ComponentGroupPresenter.php b/app/Presenters/ComponentGroupPresenter.php
index 597563940bde..456831a4ddd7 100644
--- a/app/Presenters/ComponentGroupPresenter.php
+++ b/app/Presenters/ComponentGroupPresenter.php
@@ -20,6 +20,13 @@ class ComponentGroupPresenter extends BasePresenter implements Arrayable
{
use TimestampsTrait;
+ /**
+ * Flag for the enabled_components_lowest function.
+ *
+ * @var bool
+ */
+ protected $enabledComponentsLowest = false;
+
/**
* Returns the lowest component status.
*
@@ -27,7 +34,7 @@ class ComponentGroupPresenter extends BasePresenter implements Arrayable
*/
public function lowest_status()
{
- if ($component = $this->wrappedObject->enabled_components_lowest()->first()) {
+ if ($component = $this->enabled_components_lowest()) {
return AutoPresenter::decorate($component)->status;
}
}
@@ -39,7 +46,7 @@ public function lowest_status()
*/
public function lowest_human_status()
{
- if ($component = $this->wrappedObject->enabled_components_lowest()->first()) {
+ if ($component = $this->enabled_components_lowest()) {
return AutoPresenter::decorate($component)->human_status;
}
}
@@ -51,11 +58,25 @@ public function lowest_human_status()
*/
public function lowest_status_color()
{
- if ($component = $this->wrappedObject->enabled_components_lowest()->first()) {
+ if ($component = $this->enabled_components_lowest()) {
return AutoPresenter::decorate($component)->status_color;
}
}
+ /**
+ * Return the enabled components from the wrapped object, and cache it if need be.
+ *
+ * @return bool
+ */
+ public function enabled_components_lowest()
+ {
+ if (is_bool($this->enabledComponentsLowest)) {
+ $this->enabledComponentsLowest = $this->wrappedObject->enabled_components_lowest()->first();
+ }
+
+ return $this->enabledComponentsLowest;
+ }
+
/**
* Determine the class for collapsed/uncollapsed groups.
*
diff --git a/app/Presenters/IncidentPresenter.php b/app/Presenters/IncidentPresenter.php
index 227acb1bdaed..0a8e8a65df98 100644
--- a/app/Presenters/IncidentPresenter.php
+++ b/app/Presenters/IncidentPresenter.php
@@ -29,6 +29,13 @@ class IncidentPresenter extends BasePresenter implements Arrayable
*/
protected $dates;
+ /**
+ * Flag for the latest function.
+ *
+ * @var bool
+ */
+ protected $latest = false;
+
/**
* Incident icon lookup.
*
@@ -53,8 +60,6 @@ class IncidentPresenter extends BasePresenter implements Arrayable
public function __construct(DateFactory $dates, Incident $resource)
{
$this->dates = $dates;
-
- parent::__construct($resource);
}
/**
@@ -250,9 +255,11 @@ public function latest_icon()
*/
public function latest()
{
- if ($update = $this->wrappedObject->updates()->orderBy('created_at', 'desc')->first()) {
- return $update;
+ if (is_bool($this->latest)) {
+ $this->latest = $this->wrappedObject->updates()->first();
}
+
+ return $this->latest;
}
/**
@@ -279,6 +286,16 @@ public function duration()
return 0;
}
+ /**
+ * Return the meta in a key value pair.
+ *
+ * @return array
+ */
+ public function meta()
+ {
+ return $this->wrappedObject->meta->pluck('value', 'key')->all();
+ }
+
/**
* Convert the presenter instance to an array.
*
@@ -294,6 +311,7 @@ public function toArray()
'latest_icon' => $this->latest_icon(),
'permalink' => $this->permalink(),
'duration' => $this->duration(),
+ 'meta' => $this->meta(),
'occurred_at' => $this->occurred_at(),
'created_at' => $this->created_at(),
'updated_at' => $this->updated_at(),
diff --git a/app/Presenters/IncidentUpdatePresenter.php b/app/Presenters/IncidentUpdatePresenter.php
index 5e1d3502cf4b..abbcbbc8d173 100644
--- a/app/Presenters/IncidentUpdatePresenter.php
+++ b/app/Presenters/IncidentUpdatePresenter.php
@@ -123,14 +123,19 @@ public function icon()
{
switch ($this->wrappedObject->status) {
case 1: // Investigating
+
return 'icon ion-flag oranges';
case 2: // Identified
+
return 'icon ion-alert yellows';
case 3: // Watching
+
return 'icon ion-eye blues';
case 4: // Fixed
+
return 'icon ion-checkmark greens';
default: // Something actually broke, this shouldn't happen.
+
return '';
}
}
diff --git a/app/Presenters/MetricPointPresenter.php b/app/Presenters/MetricPointPresenter.php
index 388ef816d390..5cbfdd60817a 100644
--- a/app/Presenters/MetricPointPresenter.php
+++ b/app/Presenters/MetricPointPresenter.php
@@ -19,16 +19,6 @@ class MetricPointPresenter extends BasePresenter implements Arrayable
{
use TimestampsTrait;
- /**
- * Show the actual calculated value; as per (value * counter).
- *
- * @return int
- */
- public function calculated_value()
- {
- return $this->wrappedObject->value * $this->wrappedObject->counter;
- }
-
/**
* Convert the presenter instance to an array.
*
@@ -37,9 +27,8 @@ public function calculated_value()
public function toArray()
{
return array_merge($this->wrappedObject->toArray(), [
- 'created_at' => $this->created_at(),
- 'updated_at' => $this->updated_at(),
- 'calculated_value' => $this->calculated_value(),
+ 'created_at' => $this->created_at(),
+ 'updated_at' => $this->updated_at(),
]);
}
}
diff --git a/app/Presenters/MetricPresenter.php b/app/Presenters/MetricPresenter.php
index 3a76abdd9ca6..4a4ef6607e90 100644
--- a/app/Presenters/MetricPresenter.php
+++ b/app/Presenters/MetricPresenter.php
@@ -13,9 +13,10 @@
use CachetHQ\Cachet\Presenters\Traits\TimestampsTrait;
use Illuminate\Contracts\Support\Arrayable;
+use Illuminate\Contracts\Support\Jsonable;
use McCool\LaravelAutoPresenter\BasePresenter;
-class MetricPresenter extends BasePresenter implements Arrayable
+class MetricPresenter extends BasePresenter implements Arrayable, Jsonable
{
use TimestampsTrait;
@@ -72,4 +73,18 @@ public function toArray()
'default_view_name' => $this->default_view_name(),
]);
}
+
+ /**
+ * Convert the object to its JSON representation.
+ *
+ * @param int $options
+ *
+ * @return string
+ */
+ public function toJson($options = 0)
+ {
+ $json = json_encode($this->toArray(), $options);
+
+ return $json;
+ }
}
diff --git a/app/Presenters/SchedulePresenter.php b/app/Presenters/SchedulePresenter.php
index d1c7549c52cd..ddf0c04ffd1e 100644
--- a/app/Presenters/SchedulePresenter.php
+++ b/app/Presenters/SchedulePresenter.php
@@ -45,8 +45,6 @@ class SchedulePresenter extends BasePresenter implements Arrayable
public function __construct(DateFactory $dates, Schedule $resource)
{
$this->dates = $dates;
-
- parent::__construct($resource);
}
/**
@@ -206,11 +204,13 @@ public function completed_at_iso()
/**
* Formats the completed_at time ready to be used by bootstrap-datetimepicker.
*
- * @return string
+ * @return string|void
*/
public function completed_at_datetimepicker()
{
- return $this->dates->make($this->wrappedObject->completed_at)->format('Y-m-d H:i');
+ if ($this->wrappedObject->completed_at) {
+ return $this->dates->make($this->wrappedObject->completed_at)->format('Y-m-d H:i');
+ }
}
/**
diff --git a/app/Foundation/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
similarity index 70%
rename from app/Foundation/Providers/AppServiceProvider.php
rename to app/Providers/AppServiceProvider.php
index 77bf2906e8e2..007a271ca4fe 100644
--- a/app/Foundation/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -9,11 +9,14 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use AltThree\Bus\Dispatcher;
+use AltThree\Validator\ValidatingMiddleware;
use CachetHQ\Cachet\Bus\Middleware\UseDatabaseTransactions;
use CachetHQ\Cachet\Services\Dates\DateFactory;
+use Illuminate\Database\Eloquent\Relations\Relation;
+use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
@@ -30,18 +33,31 @@ class AppServiceProvider extends ServiceProvider
* Boot the service provider.
*
* @param \AltThree\Bus\Dispatcher $dispatcher
+ *
+ * @return void
*/
public function boot(Dispatcher $dispatcher)
{
+ Schema::defaultStringLength(191);
+
$dispatcher->mapUsing(function ($command) {
return Dispatcher::simpleMapping($command, 'CachetHQ\Cachet\Bus', 'CachetHQ\Cachet\Bus\Handlers');
});
- $dispatcher->pipeThrough([UseDatabaseTransactions::class]);
+ $dispatcher->pipeThrough([UseDatabaseTransactions::class, ValidatingMiddleware::class]);
Str::macro('canonicalize', function ($url) {
return preg_replace('/([^\/])$/', '$1/', $url);
});
+
+ Relation::morphMap([
+ 'components' => \CachetHQ\Cachet\Models\Component::class,
+ 'incidents' => \CachetHQ\Cachet\Models\Incident::class,
+ 'metrics' => \CachetHQ\Cachet\Models\Metric::class,
+ 'schedules' => \CachetHQ\Cachet\Models\Schedule::class,
+ 'subscriber' => \CachetHQ\Cachet\Models\Subscriber::class,
+ 'tags' => \CachetHQ\Cachet\Models\Tag::class,
+ ]);
}
/**
diff --git a/app/Foundation/Providers/ComposerServiceProvider.php b/app/Providers/ComposerServiceProvider.php
similarity index 63%
rename from app/Foundation/Providers/ComposerServiceProvider.php
rename to app/Providers/ComposerServiceProvider.php
index b1cc0844b336..d3a23d62c4c1 100644
--- a/app/Foundation/Providers/ComposerServiceProvider.php
+++ b/app/Providers/ComposerServiceProvider.php
@@ -9,20 +9,19 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use CachetHQ\Cachet\Composers\AppComposer;
+use CachetHQ\Cachet\Composers\ComponentsComposer;
use CachetHQ\Cachet\Composers\CurrentUserComposer;
use CachetHQ\Cachet\Composers\DashboardComposer;
-use CachetHQ\Cachet\Composers\ModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\ComponentsComposer as ComponentsModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\MetricsComposer as MetricsModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\ScheduledComposer as ScheduledModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\StatusComposer as StatusModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\StickiedComposer as StickiedModuleComposer;
-use CachetHQ\Cachet\Composers\Modules\TimelineComposer as TimelineModuleComposer;
+use CachetHQ\Cachet\Composers\MetricsComposer;
+use CachetHQ\Cachet\Composers\ScheduledComposer;
use CachetHQ\Cachet\Composers\SettingsComposer;
+use CachetHQ\Cachet\Composers\StatusComposer;
+use CachetHQ\Cachet\Composers\StickiedComposer;
use CachetHQ\Cachet\Composers\ThemeComposer;
+use CachetHQ\Cachet\Composers\TimelineComposer;
use CachetHQ\Cachet\Composers\TimezoneLocaleComposer;
use Illuminate\Contracts\View\Factory;
use Illuminate\Support\ServiceProvider;
@@ -38,17 +37,16 @@ public function boot(Factory $factory)
{
$factory->composer('*', AppComposer::class);
$factory->composer('*', CurrentUserComposer::class);
- $factory->composer(['index', 'single-incident', 'subscribe.*', 'signup', 'dashboard.settings.theme', 'notifications::email', 'single-schedule'], ThemeComposer::class);
+ $factory->composer(['index', 'single-incident', 'subscribe.*', 'signup', 'dashboard.settings.theme', 'notifications::email', 'single-schedule', 'errors.*'], ThemeComposer::class);
$factory->composer('dashboard.*', DashboardComposer::class);
$factory->composer(['setup.*', 'dashboard.settings.localization'], TimezoneLocaleComposer::class);
- $factory->composer('*', ModuleComposer::class);
- $factory->composer('partials.modules.components', ComponentsModuleComposer::class);
- $factory->composer('partials.modules.metrics', MetricsModuleComposer::class);
- $factory->composer('partials.modules.stickied', StickiedModuleComposer::class);
- $factory->composer('partials.modules.scheduled', ScheduledModuleComposer::class);
- $factory->composer('partials.modules.status', StatusModuleComposer::class);
- $factory->composer('partials.modules.timeline', TimelineModuleComposer::class);
+ $factory->composer('partials.modules.components', ComponentsComposer::class);
+ $factory->composer('partials.modules.metrics', MetricsComposer::class);
+ $factory->composer('partials.modules.stickied', StickiedComposer::class);
+ $factory->composer('partials.modules.scheduled', ScheduledComposer::class);
+ $factory->composer('partials.modules.status', StatusComposer::class);
+ $factory->composer('partials.modules.timeline', TimelineComposer::class);
$factory->composer(['dashboard.settings.mail', 'setup.*'], SettingsComposer::class);
}
@@ -59,6 +57,6 @@ public function boot(Factory $factory)
*/
public function register()
{
- //
+ $this->app->singleton(DashboardComposer::class);
}
}
diff --git a/app/Foundation/Providers/ConfigServiceProvider.php b/app/Providers/ConfigServiceProvider.php
similarity index 98%
rename from app/Foundation/Providers/ConfigServiceProvider.php
rename to app/Providers/ConfigServiceProvider.php
index 42d6c330413c..7390f720d778 100644
--- a/app/Foundation/Providers/ConfigServiceProvider.php
+++ b/app/Providers/ConfigServiceProvider.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use CachetHQ\Cachet\Models\Setting as SettingModel;
use CachetHQ\Cachet\Settings\Cache;
diff --git a/app/Foundation/Providers/ConsoleServiceProvider.php b/app/Providers/ConsoleServiceProvider.php
similarity index 94%
rename from app/Foundation/Providers/ConsoleServiceProvider.php
rename to app/Providers/ConsoleServiceProvider.php
index 54d2b92b9835..6976453b5c82 100644
--- a/app/Foundation/Providers/ConsoleServiceProvider.php
+++ b/app/Providers/ConsoleServiceProvider.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use CachetHQ\Cachet\Subscribers\CommandSubscriber;
use Illuminate\Support\ServiceProvider;
diff --git a/app/Foundation/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
similarity index 97%
rename from app/Foundation/Providers/EventServiceProvider.php
rename to app/Providers/EventServiceProvider.php
index 2543300b0f6f..792e2b8bbf7c 100644
--- a/app/Foundation/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
@@ -69,9 +69,6 @@ class EventServiceProvider extends ServiceProvider
'CachetHQ\Cachet\Bus\Events\Incident\IncidentWasUpdatedEvent' => [
//
],
- 'CachetHQ\Cachet\Bus\Events\Incident\IncidentWasRemovedEvent' => [
- //
- ],
'CachetHQ\Cachet\Bus\Events\Invite\InviteWasClaimedEvent' => [
//
],
diff --git a/app/Foundation/Providers/IntegrationServiceProvider.php b/app/Providers/IntegrationServiceProvider.php
similarity index 95%
rename from app/Foundation/Providers/IntegrationServiceProvider.php
rename to app/Providers/IntegrationServiceProvider.php
index 6b53dc15b96d..57d27523cdab 100644
--- a/app/Foundation/Providers/IntegrationServiceProvider.php
+++ b/app/Providers/IntegrationServiceProvider.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use CachetHQ\Cachet\Integrations\Contracts\Beacon as BeaconContract;
use CachetHQ\Cachet\Integrations\Contracts\Credits as CreditsContract;
@@ -97,8 +97,9 @@ protected function registerSystem()
{
$this->app->singleton(SystemContract::class, function (Container $app) {
$config = $app['config'];
+ $auth = $app['auth.driver'];
- return new System($config);
+ return new System($config, $auth);
});
}
diff --git a/app/Foundation/Providers/RepositoryServiceProvider.php b/app/Providers/RepositoryServiceProvider.php
similarity index 91%
rename from app/Foundation/Providers/RepositoryServiceProvider.php
rename to app/Providers/RepositoryServiceProvider.php
index ed75c14d5107..550aa17f1b35 100644
--- a/app/Foundation/Providers/RepositoryServiceProvider.php
+++ b/app/Providers/RepositoryServiceProvider.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
use CachetHQ\Cachet\Repositories\Metric\MetricRepository;
use CachetHQ\Cachet\Repositories\Metric\MySqlRepository;
@@ -48,9 +48,12 @@ protected function registerMetricRepository()
$config = $app->make(ConfigRepository::class);
switch ($config->get('database.default')) {
- case 'mysql': $repository = new MySqlRepository($config); break;
- case 'pgsql': $repository = new PgSqlRepository($config); break;
- case 'sqlite': $repository = new SqliteRepository($config); break;
+ case 'mysql': $repository = new MySqlRepository($config);
+ break;
+ case 'pgsql': $repository = new PgSqlRepository($config);
+ break;
+ case 'sqlite': $repository = new SqliteRepository($config);
+ break;
}
$dates = $app->make(DateFactory::class);
diff --git a/app/Foundation/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
similarity index 62%
rename from app/Foundation/Providers/RouteServiceProvider.php
rename to app/Providers/RouteServiceProvider.php
index d0982587bf25..f23d7a023da4 100644
--- a/app/Foundation/Providers/RouteServiceProvider.php
+++ b/app/Providers/RouteServiceProvider.php
@@ -9,14 +9,20 @@
* file that was distributed with this source code.
*/
-namespace CachetHQ\Cachet\Foundation\Providers;
+namespace CachetHQ\Cachet\Providers;
-use Barryvdh\Cors\HandleCors;
use CachetHQ\Cachet\Http\Middleware\Acceptable;
+use CachetHQ\Cachet\Http\Middleware\Authenticate;
+use CachetHQ\Cachet\Http\Middleware\RemoteUserAuthenticate;
use CachetHQ\Cachet\Http\Middleware\Timezone;
+use CachetHQ\Cachet\Http\Middleware\VerifyCsrfToken;
+use CachetHQ\Cachet\Http\Routes\ApiSystemRoutes;
+use CachetHQ\Cachet\Http\Routes\AuthRoutes;
+use CachetHQ\Cachet\Http\Routes\Setup\ApiRoutes as ApiSetupRoutes;
+use CachetHQ\Cachet\Http\Routes\SetupRoutes;
+use CachetHQ\Cachet\Http\Routes\SignupRoutes;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
-use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Routing\Router;
@@ -41,6 +47,21 @@ class RouteServiceProvider extends ServiceProvider
*/
protected $namespace = 'CachetHQ\Cachet\Http\Controllers';
+ /**
+ * These are the route files that should always be available anonymously.
+ *
+ * When applying the always_authenticate feature, these routes will be skipped.
+ *
+ * @var string[]
+ */
+ protected $whitelistedAuthRoutes = [
+ AuthRoutes::class,
+ SetupRoutes::class,
+ SignupRoutes::class,
+ ApiSystemRoutes::class,
+ ApiSetupRoutes::class,
+ ];
+
/**
* Define the route model bindings, pattern filters, etc.
*
@@ -89,7 +110,11 @@ public function map(Router $router)
$router->group(['namespace' => $this->namespace, 'as' => 'core::'], function (Router $router) {
$path = app_path('Http/Routes');
- foreach (glob("{$path}/*{,/*}.php", GLOB_BRACE) as $file) {
+ $applyAlwaysAuthenticate = $this->app['config']->get('setting.always_authenticate', false);
+ $AllFileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
+ $PhpFileIterator = new \RegexIterator($AllFileIterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH);
+
+ foreach ($PhpFileIterator as $file => $object) {
$class = substr($file, strlen($path));
$class = str_replace('/', '\\', $class);
$class = substr($class, 0, -4);
@@ -97,9 +122,9 @@ public function map(Router $router)
$routes = $this->app->make("CachetHQ\\Cachet\\Http\\Routes${class}");
if ($routes::$browser) {
- $this->mapForBrowser($router, $routes);
+ $this->mapForBrowser($router, $routes, $applyAlwaysAuthenticate);
} else {
- $this->mapOtherwise($router, $routes);
+ $this->mapOtherwise($router, $routes, $applyAlwaysAuthenticate);
}
}
});
@@ -110,10 +135,11 @@ public function map(Router $router)
*
* @param \Illuminate\Routing\Router $router
* @param object $routes
+ * @param bool $applyAlwaysAuthenticate
*
* @return void
*/
- protected function mapForBrowser(Router $router, $routes)
+ protected function mapForBrowser(Router $router, $routes, $applyAlwaysAuthenticate)
{
$middleware = [
EncryptCookies::class,
@@ -124,6 +150,11 @@ protected function mapForBrowser(Router $router, $routes)
SubstituteBindings::class,
];
+ if ($applyAlwaysAuthenticate && !$this->isWhiteListedAuthRoute($routes)) {
+ $middleware[] = RemoteUserAuthenticate::class;
+ $middleware[] = Authenticate::class;
+ }
+
$router->group(['middleware' => $middleware], function (Router $router) use ($routes) {
$routes->map($router);
});
@@ -134,20 +165,43 @@ protected function mapForBrowser(Router $router, $routes)
*
* @param \Illuminate\Routing\Router $router
* @param object $routes
+ * @param bool $applyAlwaysAuthenticate
*
* @return void
*/
- protected function mapOtherwise(Router $router, $routes)
+ protected function mapOtherwise(Router $router, $routes, $applyAlwaysAuthenticate)
{
$middleware = [
- HandleCors::class,
SubstituteBindings::class,
Acceptable::class,
Timezone::class,
];
+ if ($applyAlwaysAuthenticate && !$this->isWhiteListedAuthRoute($routes)) {
+ $middleware[] = 'auth.api:true';
+ }
+
$router->group(['middleware' => $middleware], function (Router $router) use ($routes) {
$routes->map($router);
});
}
+
+ /**
+ * Validates if the route object is an instance of the whitelisted routes.
+ * A small workaround since we cant use multiple classes in a `instanceof` comparison.
+ *
+ * @param object $routes
+ *
+ * @return bool
+ */
+ private function isWhiteListedAuthRoute($routes)
+ {
+ foreach ($this->whitelistedAuthRoutes as $whitelistedRoute) {
+ if (is_a($routes, $whitelistedRoute)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
}
diff --git a/app/Repositories/Metric/AbstractMetricRepository.php b/app/Repositories/Metric/AbstractMetricRepository.php
index 4c14cc6b6888..566827e66619 100644
--- a/app/Repositories/Metric/AbstractMetricRepository.php
+++ b/app/Repositories/Metric/AbstractMetricRepository.php
@@ -108,7 +108,7 @@ protected function mapResults(Metric $metric, array $results)
$point->value = $metric->default_value;
}
- if ($point->value === 0 && $metric->default_value != $value) {
+ if ($point->value === 0 && $metric->default_value != $point->value) {
$point->value = $metric->default_value;
}
diff --git a/app/Repositories/Metric/MetricRepository.php b/app/Repositories/Metric/MetricRepository.php
index 6f83a1842867..c424336b19cd 100644
--- a/app/Repositories/Metric/MetricRepository.php
+++ b/app/Repositories/Metric/MetricRepository.php
@@ -60,18 +60,34 @@ public function __construct(MetricInterface $repository, DateFactory $dates)
public function listPointsLastHour(Metric $metric)
{
$dateTime = $this->dates->make();
- $pointKey = $dateTime->format('H:i');
- $points = $this->repository->getPointsSinceMinutes($metric, 60)->pluck('value', 'key');
+ $pointKey = $dateTime->format('Y-m-d H:i');
+ $nrOfMinutes = 61;
+ $points = $this->repository->getPointsSinceMinutes($metric, $nrOfMinutes + $metric->threshold)->pluck('value', 'key')->take(-$nrOfMinutes);
- for ($i = 0; $i <= 60; $i++) {
+ $timeframe = $nrOfMinutes;
+
+ //Settings counter for minutes without data
+ $minutesWithNoData = 0;
+
+ for ($i = 0; $i < $timeframe; $i++) {
if (!$points->has($pointKey)) {
- $points->put($pointKey, $metric->default_value);
+ if ($i >= $metric->threshold) {
+ $points->put($pointKey, $metric->default_value);
+ //We put default value as metric, so we can reset counter for minutes without data
+ $minutesWithNoData = 0;
+ } else {
+ //We didn't find any data, but threshold is not meet yet so we just adding to counter
+ $minutesWithNoData++;
+ }
+ } else {
+ //We found data within this threshold, zeroing counter
+ $minutesWithNoData = 0;
}
- $pointKey = $dateTime->sub(new DateInterval('PT1M'))->format('H:i');
+ $pointKey = $dateTime->sub(new DateInterval('PT1M'))->format('Y-m-d H:i');
}
- return $points->sortBy(function ($point, $key) use ($points) {
+ return $points->sortBy(function ($point, $key) {
return $key;
});
}
@@ -87,18 +103,18 @@ public function listPointsLastHour(Metric $metric)
public function listPointsToday(Metric $metric, $hours = 12)
{
$dateTime = $this->dates->make();
- $pointKey = $dateTime->format('H:00');
+ $pointKey = $dateTime->format('Y-m-d H:00');
$points = $this->repository->getPointsSinceHour($metric, $hours)->pluck('value', 'key');
- for ($i = 0; $i <= $hours; $i++) {
+ for ($i = 0; $i < $hours; $i++) {
if (!$points->has($pointKey)) {
$points->put($pointKey, $metric->default_value);
}
- $pointKey = $dateTime->sub(new DateInterval('PT1H'))->format('H:00');
+ $pointKey = $dateTime->sub(new DateInterval('PT1H'))->format('Y-m-d H:00');
}
- return $points->sortBy(function ($point, $key) use ($points) {
+ return $points->sortBy(function ($point, $key) {
return $key;
});
}
@@ -124,7 +140,7 @@ public function listPointsForWeek(Metric $metric)
$pointKey = $dateTime->sub(new DateInterval('P1D'))->format('Y-m-d');
}
- return $points->sortBy(function ($point, $key) use ($points) {
+ return $points->sortBy(function ($point, $key) {
return $key;
});
}
@@ -151,7 +167,7 @@ public function listPointsForMonth(Metric $metric)
$pointKey = $dateTime->sub(new DateInterval('P1D'))->format('Y-m-d');
}
- return $points->sortBy(function ($point, $key) use ($points) {
+ return $points->sortBy(function ($point, $key) {
return $key;
});
}
diff --git a/app/Repositories/Metric/MySqlRepository.php b/app/Repositories/Metric/MySqlRepository.php
index d3439236362c..3d5e37159dd8 100644
--- a/app/Repositories/Metric/MySqlRepository.php
+++ b/app/Repositories/Metric/MySqlRepository.php
@@ -32,10 +32,16 @@ class MySqlRepository extends AbstractMetricRepository implements MetricInterfac
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%H:%i') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :minutes MINUTE) GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`), MINUTE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- 'minutes' => $minutes,
- ]);
+
+ $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d %H:%i') AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :minutes MINUTE) ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= NOW() ".
+ "GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`), MINUTE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ 'minutes' => $minutes,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -51,10 +57,16 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%H:00') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :hour HOUR) GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- 'hour' => $hour,
- ]);
+ $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d %H:00') AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :hour HOUR) ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= NOW() ".
+ "GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`) ".
+ "ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ 'hour' => $hour,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -70,10 +82,15 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :day DAY) GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- 'day' => $day,
- ]);
+ $points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d') AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :day DAY) ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= NOW() ".
+ "GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ 'day' => $day,
+ ]);
return $this->mapResults($metric, $points);
}
diff --git a/app/Repositories/Metric/PgSqlRepository.php b/app/Repositories/Metric/PgSqlRepository.php
index feec9d84042f..c8d135c63170 100644
--- a/app/Repositories/Metric/PgSqlRepository.php
+++ b/app/Repositories/Metric/PgSqlRepository.php
@@ -13,7 +13,6 @@
use CachetHQ\Cachet\Models\Metric;
use Illuminate\Support\Facades\DB;
-use Jenssegers\Date\Date;
/**
* This is the pgsql repository class.
@@ -33,9 +32,15 @@ class PgSqlRepository extends AbstractMetricRepository implements MetricInterfac
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI') AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$minutes}' MINUTE) GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI') ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI')", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:MI') AS key, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$minutes}' MINUTE) ".
+ "AND {$this->getMetricPointsTable()}.created_at <= NOW() ".
+ "GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:MI') ".
+ "ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:MI')", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -51,9 +56,15 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00') AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$hour}' HOUR) GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00') ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00')", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00') AS key, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$hour}' HOUR) ".
+ "AND {$this->getMetricPointsTable()}.created_at <= NOW() ".
+ "GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00') ".
+ "ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00')", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -69,9 +80,15 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT DATE({$this->getMetricPointsTable()}.created_at) AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (DATE(NOW()) - INTERVAL '{$day}' DAY) GROUP BY DATE({$this->getMetricPointsTable()}.created_at) ORDER BY DATE({$this->getMetricPointsTable()}.created_at)", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00') AS key, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.created_at >= (DATE(NOW()) - INTERVAL '{$day}' DAY) ".
+ "AND {$this->getMetricPointsTable()}.created_at <= DATE(NOW()) ".
+ "GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00')".
+ "ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00')", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
diff --git a/app/Repositories/Metric/SqliteRepository.php b/app/Repositories/Metric/SqliteRepository.php
index 5d9c751d637c..d979e084ac66 100644
--- a/app/Repositories/Metric/SqliteRepository.php
+++ b/app/Repositories/Metric/SqliteRepository.php
@@ -13,7 +13,6 @@
use CachetHQ\Cachet\Models\Metric;
use Illuminate\Support\Facades\DB;
-use Jenssegers\Date\Date;
/**
* This is the sqlite repository class.
@@ -33,9 +32,16 @@ class SqliteRepository extends AbstractMetricRepository implements MetricInterfa
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT strftime('%H:%M', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$minutes} minutes') GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`), strftime('%M', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT strftime('%Y-%m-%d %H:%M', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} ".
+ "INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', 'localtime', '-{$minutes} minutes') ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now', 'localtime') ".
+ "GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`), strftime('%M', {$this->getMetricPointsTable()}.`created_at`) ".
+ "ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -51,9 +57,14 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT strftime('%H:00', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$hour} hours') GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT strftime('%Y-%m-%d %H:00', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', 'localtime', '-{$hour} hours') ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now', 'localtime') ".
+ "GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
@@ -69,9 +80,15 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
- $points = DB::select("SELECT strftime('%Y-%m-%d', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$day} days') GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
- 'metricId' => $metric->id,
- ]);
+ $points = DB::select("SELECT strftime('%Y-%m-%d', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} ".
+ "FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id ".
+ "WHERE {$this->getMetricsTable()}.id = :metricId ".
+ "AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', 'localtime', '-{$day} days') ".
+ "AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now', 'localtime') ".
+ "GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ".
+ "ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
+ 'metricId' => $metric->id,
+ ]);
return $this->mapResults($metric, $points);
}
diff --git a/app/Services/Modules/Manager.php b/app/Services/Modules/Manager.php
deleted file mode 100644
index 61a276c68a2d..000000000000
--- a/app/Services/Modules/Manager.php
+++ /dev/null
@@ -1,80 +0,0 @@
-
- */
-class Manager
-{
- /**
- * Groups the modules.
- *
- * @param array $modules
- * @param array $groups
- *
- * @return array
- */
- public function groupModules(array $modules, array $groups = [])
- {
- $grouped = [];
- $length = count($modules);
- foreach ($modules as $order => $module) {
- if (!is_array($module) || empty($module['group'])) {
- $order = array_get($module, 'order', PHP_INT_MAX - $length + $order);
-
- $grouped[] = [$module, 'order' => $order];
-
- continue;
- }
-
- $group = $module['group'];
- if (empty($grouped[$group])) {
- $grouped[$group] = [$module];
-
- continue;
- }
-
- $grouped[$group][] = $module;
- }
-
- foreach ($groups as $group => $order) {
- if (empty($grouped[$group])) {
- continue;
- }
-
- $grouped[$group]['order'] = $order;
- }
-
- return $grouped;
- }
-
- /**
- * Orders the modules.
- *
- * @param array $modules
- *
- * @return array
- */
- public function orderModules($modules)
- {
- $modules = array_numeric_sort($modules);
-
- foreach ($modules as $group => $subModules) {
- $modules[$group] = array_numeric_sort($subModules);
- }
-
- return $modules;
- }
-}
diff --git a/app/Services/Modules/Renderer.php b/app/Services/Modules/Renderer.php
deleted file mode 100644
index b8fe3df339b9..000000000000
--- a/app/Services/Modules/Renderer.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- */
-class Renderer
-{
- /**
- * Render the modules.
- *
- * @param \Illuminate\Contracts\View\Factory $factory
- * @param array $data
- * @param array $modules
- * @param string|null $group
- *
- * @return string
- */
- public function renderModules(Factory $factory, array $data, array $modules, $group = null)
- {
- if ($group !== null) {
- if (empty($modules[$group])) {
- return '';
- }
-
- return $this->renderModulesGroup($factory, $data, $modules[$group]);
- }
-
- return array_reduce(
- array_numeric_sort($modules),
- function ($reduce, $module) use ($factory, $data) {
- return $reduce.$this->renderModulesGroup($factory, $data, $module);
- },
- ''
- );
- }
-
- /**
- * Render a group of modules.
- *
- * @param \Illuminate\Contracts\View\Factory $factory
- * @param array $data
- * @param array $modules
- *
- * @return string
- */
- protected function renderModulesGroup(Factory $factory, array $data, array $modules)
- {
- return array_reduce(
- array_numeric_sort($modules),
- function ($reduce, $module) use ($factory, $data) {
- if (empty($module['partial'])) {
- return $reduce;
- }
-
- return $reduce.$factory->make($module['partial'], $data)->render();
- },
- ''
- );
- }
-}
diff --git a/app/Settings/ReadException.php b/app/Settings/ReadException.php
new file mode 100644
index 000000000000..86de0ae3f9e1
--- /dev/null
+++ b/app/Settings/ReadException.php
@@ -0,0 +1,34 @@
+
+ */
+class ReadException extends SettingsException
+{
+ /**
+ * Create a new read exception instance.
+ *
+ * @param \Exception $e
+ *
+ * @return void
+ */
+ public function __construct(Exception $e)
+ {
+ parent::__construct('Unable to read Cachet settings', $e);
+ }
+}
diff --git a/app/Settings/Repository.php b/app/Settings/Repository.php
index 35cf79e914b3..e6d54038ee3f 100644
--- a/app/Settings/Repository.php
+++ b/app/Settings/Repository.php
@@ -12,6 +12,7 @@
namespace CachetHQ\Cachet\Settings;
use CachetHQ\Cachet\Models\Setting;
+use Exception;
/**
* This is the settings repository class.
@@ -59,13 +60,19 @@ public function __construct(Setting $model)
/**
* Returns a setting from the database.
*
+ * @throws \CachetHQ\Cachet\Settings\ReadException
+ *
* @return array
*/
public function all()
{
- return $this->model->all(['name', 'value'])->pluck('value', 'name')->map(function ($value, $name) {
- return $this->castSetting($name, $value);
- })->toArray();
+ try {
+ return $this->model->all(['name', 'value'])->pluck('value', 'name')->map(function ($value, $name) {
+ return $this->castSetting($name, $value);
+ })->toArray();
+ } catch (Exception $e) {
+ throw new ReadException($e);
+ }
}
/**
@@ -74,16 +81,22 @@ public function all()
* @param string $name
* @param string|null $value
*
+ * @throws \CachetHQ\Cachet\Settings\WriteException
+ *
* @return void
*/
public function set($name, $value)
{
$this->stale = true;
- if ($value === null) {
- $this->model->where('name', '=', $name)->delete();
- } else {
- $this->model->updateOrCreate(compact('name'), compact('value'));
+ try {
+ if ($value === null) {
+ $this->model->where('name', '=', $name)->delete();
+ } else {
+ $this->model->updateOrCreate(compact('name'), compact('value'));
+ }
+ } catch (Exception $e) {
+ throw new WriteException($e);
}
}
@@ -93,15 +106,21 @@ public function set($name, $value)
* @param string $name
* @param mixed $default
*
+ * @throws \CachetHQ\Cachet\Settings\ReadException
+ *
* @return mixed
*/
public function get($name, $default = null)
{
- if ($setting = $this->model->where('name', '=', $name)->first()) {
- return $this->castSetting($name, $setting->value);
+ try {
+ if ($setting = $this->model->where('name', '=', $name)->first()) {
+ return $this->castSetting($name, $setting->value);
+ }
+
+ return $default;
+ } catch (Exception $e) {
+ throw new ReadException($e);
}
-
- return $default;
}
/**
@@ -109,25 +128,37 @@ public function get($name, $default = null)
*
* @param string $name
*
+ * @throws \CachetHQ\Cachet\Settings\WriteException
+ *
* @return void
*/
public function delete($name)
{
$this->stale = true;
- $this->model->where('name', '=', $name)->delete();
+ try {
+ $this->model->where('name', '=', $name)->delete();
+ } catch (Exception $e) {
+ throw new WriteException($e);
+ }
}
/**
* Clear all settings.
*
+ * @throws \CachetHQ\Cachet\Settings\WriteException
+ *
* @return void
*/
public function clear()
{
$this->stale = true;
- $this->model->query()->delete();
+ try {
+ $this->model->query()->delete();
+ } catch (Exception $e) {
+ throw new WriteException($e);
+ }
}
/**
diff --git a/app/Settings/SettingsException.php b/app/Settings/SettingsException.php
new file mode 100644
index 000000000000..1716ea366d9d
--- /dev/null
+++ b/app/Settings/SettingsException.php
@@ -0,0 +1,35 @@
+
+ */
+class SettingsException extends Exception
+{
+ /**
+ * Create a new write exception instance.
+ *
+ * @param string $m
+ * @param \Exception $e
+ *
+ * @return void
+ */
+ public function __construct(string $m, Exception $e)
+ {
+ parent::__construct($m, 0, $e);
+ }
+}
diff --git a/app/Settings/WriteException.php b/app/Settings/WriteException.php
new file mode 100644
index 000000000000..baa41ff7ac1d
--- /dev/null
+++ b/app/Settings/WriteException.php
@@ -0,0 +1,34 @@
+
+ */
+class WriteException extends SettingsException
+{
+ /**
+ * Create a new write exception instance.
+ *
+ * @param \Exception $e
+ *
+ * @return void
+ */
+ public function __construct(Exception $e)
+ {
+ parent::__construct('Unable to write Cachet settings', $e);
+ }
+}
diff --git a/app/Subscribers/CommandSubscriber.php b/app/Subscribers/CommandSubscriber.php
index 7b7acb6ff664..a879361999a7 100644
--- a/app/Subscribers/CommandSubscriber.php
+++ b/app/Subscribers/CommandSubscriber.php
@@ -15,10 +15,7 @@
use CachetHQ\Cachet\Bus\Events\System\SystemWasResetEvent;
use CachetHQ\Cachet\Bus\Events\System\SystemWasUpdatedEvent;
use CachetHQ\Cachet\Settings\Cache;
-use Carbon\Carbon;
-use Exception;
use Illuminate\Console\Command;
-use Illuminate\Contracts\Config\Repository;
use Illuminate\Contracts\Events\Dispatcher;
/**
@@ -36,25 +33,16 @@ class CommandSubscriber
*/
protected $cache;
- /**
- * The config repository instance.
- *
- * @var \Illuminate\Contracts\Config\Repository
- */
- protected $config;
-
/**
* Create a new command subscriber instance.
*
- * @param \CachetHQ\Cachet\Settings\Cache $cache
- * @param \Illuminate\Contracts\Config\Repository $config
+ * @param \CachetHQ\Cachet\Settings\Cache $cache
*
* @return void
*/
- public function __construct(Cache $cache, Repository $config)
+ public function __construct(Cache $cache)
{
$this->cache = $cache;
- $this->config = $config;
}
/**
@@ -69,6 +57,15 @@ public function subscribe(Dispatcher $events)
$events->listen('command.installing', __CLASS__.'@fireInstallingCommand', 5);
$events->listen('command.updating', __CLASS__.'@fireUpdatingCommand', 5);
$events->listen('command.resetting', __CLASS__.'@fireResettingCommand', 5);
+ $events->listen('command.generatekey', __CLASS__.'@onGenerateKey');
+ $events->listen('command.cacheconfig', __CLASS__.'@onCacheConfig');
+ $events->listen('command.cacheroutes', __CLASS__.'@onCacheRoutes');
+ $events->listen('command.publishvendors', __CLASS__.'@onPublishVendors');
+ $events->listen('command.resetmigrations', __CLASS__.'@onResetMigrations');
+ $events->listen('command.runmigrations', __CLASS__.'@onRunMigrations');
+ $events->listen('command.runseeding', __CLASS__.'@onRunSeeding');
+ $events->listen('command.linkstorage', __CLASS__.'@onLinkStorage');
+ $events->listen('command.updatecache', __CLASS__.'@onUpdateCache');
}
/**
@@ -120,7 +117,7 @@ public function fireResettingCommand(Command $command)
}
/**
- * Handle the main bulk of the command, clear the settings and backup the database.
+ * Handle the main bulk of the command, clear the settings.
*
* @param \Illuminate\Console\Command $command
*
@@ -133,29 +130,117 @@ protected function handleMainCommand(Command $command)
$this->cache->clear();
$command->line('Settings cache cleared!');
+ }
- // SQLite does not backup.
- if ($this->config->get('database.default') === 'sqlite') {
- $command->line('Backup skipped: SQLite is not supported.');
+ /**
+ * Handle a command.generatekey event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onGenerateKey(Command $command)
+ {
+ $command->call('key:generate');
+ }
- return;
- }
+ /**
+ * Handle a command.cacheconfig event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onCacheConfig(Command $command)
+ {
+ $command->call('config:cache');
+ }
+
+ /**
+ * Handle a command.cacheroutes event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onCacheRoutes(Command $command)
+ {
+ $command->call('route:cache');
+ }
+
+ /**
+ * Handle a command.publishvendors event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onPublishVendors(Command $command)
+ {
+ $command->call('vendor:publish', ['--all' => true]);
+ }
+
+ /**
+ * Handle a command.resetmigrations event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onResetMigrations(Command $command)
+ {
+ $command->call('migrate:reset', ['--force' => true]);
+ }
- $command->line('Backing up database...');
-
- try {
- $command->call('db:backup', [
- '--compression' => 'gzip',
- '--database' => $this->config->get('database.default'),
- '--destination' => 'local',
- '--destinationPath' => Carbon::now()->format('Y-m-d H.i.s'),
- '--no-interaction' => true,
- ]);
- } catch (Exception $e) {
- $command->error($e->getMessage());
- $command->line('Backup skipped!');
+ /**
+ * Handle a command.runmigrations event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onRunMigrations(Command $command)
+ {
+ $command->call('migrate', ['--force' => true]);
+ }
+
+ /**
+ * Handle a command.runseeding event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onRunSeeding(Command $command)
+ {
+ $command->call('db:seed', ['--force' => true]);
+ }
+
+ /**
+ * Handle a command.linkstorage event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onLinkStorage(Command $command)
+ {
+ if ($command->getApplication()->has('storage:link')) {
+ $command->call('storage:link');
}
+ }
- $command->line('Backup completed!');
+ /**
+ * Handle a command.updatecache event.
+ *
+ * @param \Illuminate\Console\Command $command
+ *
+ * @return void
+ */
+ public function onUpdateCache(Command $command)
+ {
+ $command->line('Clearing cache...');
+ $command->call('cache:clear');
+ $command->info('Cache cleared!');
}
}
diff --git a/app/helpers.php b/app/helpers.php
index 6a43f146115d..d1f032545d48 100644
--- a/app/helpers.php
+++ b/app/helpers.php
@@ -10,6 +10,7 @@
*/
use CachetHQ\Cachet\Settings\Repository;
+use Illuminate\Contracts\Bus\Dispatcher;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Request;
use Jenssegers\Date\Date;
@@ -25,7 +26,13 @@
*/
function setting($name, $default = null)
{
- return app(Repository::class)->get($name, $default);
+ static $settings = [];
+
+ if (isset($settings[$name])) {
+ return $settings[$name];
+ }
+
+ return $settings[$name] = app(Repository::class)->get($name, $default);
}
}
@@ -107,36 +114,28 @@ function color_darken($hex, $percent)
*/
function color_contrast($hexcolor)
{
- $r = hexdec(substr($hexcolor, 0, 2));
- $g = hexdec(substr($hexcolor, 2, 2));
- $b = hexdec(substr($hexcolor, 4, 2));
+ $r = ctype_xdigit(substr($hexcolor, 0, 2));
+ $g = ctype_xdigit(substr($hexcolor, 2, 2));
+ $b = ctype_xdigit(substr($hexcolor, 4, 2));
$yiq = (($r * 100) + ($g * 400) + ($b * 114)) / 1000;
return ($yiq >= 128) ? 'black' : 'white';
}
}
-if (!function_exists('array_numeric_sort')) {
+if (!function_exists('cachet_route_generator')) {
/**
- * Numerically sort an array based on a specific key.
+ * Generate the route string.
*
- * @param array $array
- * @param string $key
+ * @param string $name
+ * @param string $method
+ * @param string $domain
*
- * @return array
+ * @return string
*/
- function array_numeric_sort(array $array = [], $key = 'order')
+ function cachet_route_generator($name, $method = 'get', $domain = 'core')
{
- uasort($array, function ($a, $b) use ($key) {
- $a = array_get($a, $key, PHP_INT_MAX);
- $b = array_get($b, $key, PHP_INT_MAX);
-
- $default = PHP_MAJOR_VERSION < 7 ? 1 : 0;
-
- return $a < $b ? -1 : ($a === $b ? $default : 1);
- });
-
- return $array;
+ return "{$domain}::{$method}:{$name}";
}
}
@@ -153,7 +152,11 @@ function array_numeric_sort(array $array = [], $key = 'order')
*/
function cachet_route($name, $parameters = [], $method = 'get', $domain = 'core')
{
- return app('url')->route("{$domain}::{$method}:{$name}", $parameters, true);
+ return app('url')->route(
+ cachet_route_generator($name, $method, $domain),
+ $parameters,
+ true
+ );
}
}
@@ -177,3 +180,17 @@ function cachet_redirect($name, $parameters = [], $status = 302, $headers = [],
return app('redirect')->to($url, $status, $headers);
}
}
+
+if (!function_exists('execute')) {
+ /**
+ * Send the given command to the dispatcher for execution.
+ *
+ * @param object $command
+ *
+ * @return void
+ */
+ function execute($command)
+ {
+ return app(Dispatcher::class)->dispatchNow($command);
+ }
+}
diff --git a/artisan b/artisan
index d00c7161e88b..d294ad8bf35c 100644
--- a/artisan
+++ b/artisan
@@ -28,11 +28,11 @@ $app = require_once __DIR__.'/bootstrap/app.php';
|
*/
-$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
- $input = new Symfony\Component\Console\Input\ArgvInput(),
- new Symfony\Component\Console\Output\ConsoleOutput()
+ $input = new Symfony\Component\Console\Input\ArgvInput(),
+ new Symfony\Component\Console\Output\ConsoleOutput()
);
/*
@@ -40,7 +40,7 @@ $status = $kernel->handle(
| Shutdown The Application
|--------------------------------------------------------------------------
|
-| Once Artisan has finished running. We will fire off the shutdown events
+| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
diff --git a/bootstrap/app.php b/bootstrap/app.php
index 787b5db6e304..2b2ff8cb519f 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -26,7 +26,7 @@
$app->singleton(Illuminate\Contracts\Console\Kernel::class, CachetHQ\Cachet\Console\Kernel::class);
-$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class, GrahamCampbell\Exceptions\NewExceptionHandler::class);
+$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class, GrahamCampbell\Exceptions\ExceptionHandler::class);
/*
|--------------------------------------------------------------------------
diff --git a/composer.json b/composer.json
index bf47c44dc566..ea6814120e24 100644
--- a/composer.json
+++ b/composer.json
@@ -24,45 +24,52 @@
"email": "joe@alt-three.com"
}
],
+ "replace": {
+ "paragonie/random_compat": "*",
+ "symfony/polyfill-mbstring": "*"
+ },
"require": {
- "php": ">=5.6.4",
+ "php": "^7.1.3",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
"ext-xml": "*",
- "alt-three/badger": "^3.1",
- "alt-three/bus": "^2.0",
- "alt-three/emoji": "^4.1",
- "alt-three/logger": "^1.3",
- "alt-three/throttle": "^1.0",
- "alt-three/twitter": "^1.0",
- "alt-three/validator": "^1.5",
+ "alt-three/bus": "^4.1",
+ "cachethq/badger": "^2.0",
+ "cachethq/emoji": "^3.0",
+ "cachethq/twitter": "^3.0",
+ "alt-three/validator": "^4.1",
"aws/aws-sdk-php": "^3.7",
- "backup-manager/laravel": "^1.1",
- "barryvdh/laravel-cors": "^0.8",
- "doctrine/dbal": "^2.5",
- "fideloper/proxy": "^3.1",
- "graham-campbell/binput": "^3.5",
- "graham-campbell/core": "^5.1",
- "graham-campbell/exceptions": "^9.1",
- "graham-campbell/markdown": "^7.1",
- "guzzlehttp/guzzle": "^6.2.1",
- "jenssegers/date": "^3.2",
- "laravel/framework": "5.3.*",
- "mccool/laravel-auto-presenter": "^4.3",
- "nexmo/client": "@beta",
- "pragmarx/google2fa": "^0.7.1",
+ "barryvdh/laravel-cors": "^0.11.0",
+ "bugsnag/bugsnag-laravel": "^2.15",
+ "chillerlan/php-qrcode": "^2.0",
+ "doctrine/dbal": "2.9.*",
+ "fideloper/proxy": "^4.0",
+ "graham-campbell/binput": "^6.0",
+ "graham-campbell/exceptions": "^11.1",
+ "graham-campbell/markdown": "^11.2",
+ "guzzlehttp/guzzle": "^6.3.3",
+ "jenssegers/date": "^3.4",
+ "laravel/framework": "5.7.*",
+ "laravel/tinker": "^1.0",
+ "mccool/laravel-auto-presenter": "^7.1",
+ "nexmo/client": "^1.5",
+ "pragmarx/google2fa": "^5.0",
"predis/predis": "^1.1",
- "roumen/feed": "^2.10",
- "twig/twig": "^1.26.1"
+ "twig/twig": "^2.13"
},
"require-dev": {
- "alt-three/testbench": "^1.9",
- "filp/whoops": "^2.1",
- "fzaninotto/faker": "^1.6",
- "graham-campbell/testbench-core": "^1.1",
- "mockery/mockery": "0.9.5",
- "phpunit/phpunit": "~5.0",
- "symfony/css-selector": "^3.1",
- "symfony/dom-crawler": "^3.1",
- "tightenco/mailthief": "^0.3.2"
+ "ext-sqlite3": "*",
+ "alt-three/testbench": "5.0.x-dev",
+ "barryvdh/laravel-debugbar": "^3.2",
+ "filp/whoops": "^2.3",
+ "fzaninotto/faker": "^1.8",
+ "graham-campbell/analyzer": "^2.1",
+ "mockery/mockery": "^1.2",
+ "phpunit/phpunit": "^7.4",
+ "tightenco/mailthief": "^0.3.14"
+ },
+ "suggest": {
+ "ext-apc": "APC Support cache driver."
},
"autoload": {
"classmap": [
@@ -82,33 +89,40 @@
},
"scripts": {
"post-root-package-install": [
- "php -r \"copy('.env.example', '.env');\"",
- "php artisan key:generate"
+ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
- "php artisan key:generate"
+ "@php artisan key:generate"
+ ],
+ "post-autoload-dump": [
+ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+ "@php artisan package:discover"
],
- "post-install-cmd": [
- "Illuminate\\Foundation\\ComposerScripts::postInstall",
- "php artisan optimize --force",
- "php artisan config:cache",
- "php artisan route:cache"
+ "test": [
+ "@php artisan config:clear",
+ "vendor/bin/phpunit"
],
- "post-update-cmd": [
- "Illuminate\\Foundation\\ComposerScripts::postUpdate",
- "php artisan optimize --force",
- "php artisan config:cache",
- "php artisan route:cache"
+ "test-coverage": [
+ "@php artisan config:clear",
+ "vendor/bin/phpunit --coverage-clover=coverage.xml"
]
},
"config": {
- "preferred-install": "dist"
+ "platform": {
+ "php": "7.1.3"
+ },
+ "preferred-install": "dist",
+ "sort-packages": true,
+ "optimize-autoloader": true,
+ "allow-plugins": {
+ "kylekatarnls/update-helper": true
+ }
},
"extra": {
"branch-alias": {
"dev-master": "2.4-dev"
}
},
- "minimum-stability": "stable",
+ "minimum-stability": "dev",
"prefer-stable": true
}
diff --git a/composer.lock b/composer.lock
index 7dbcbf8bcf55..5694c9cc3939 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,43 +1,43 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "80db6a17bd6a19bfd296517f4dcc45b6",
+ "content-hash": "6ca7a749bbb1681ee57e72dd9387f9ec",
"packages": [
{
- "name": "alt-three/badger",
- "version": "v3.2.0",
+ "name": "alt-three/bus",
+ "version": "v4.5.0",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Badger.git",
- "reference": "c4cd7140aed3554ba4b8c44a877d400d6e5e3554"
+ "url": "https://github.com/AltThree/Bus.git",
+ "reference": "21d1623520c0ad48acb72420fd7f986cd23f349a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Badger/zipball/c4cd7140aed3554ba4b8c44a877d400d6e5e3554",
- "reference": "c4cd7140aed3554ba4b8c44a877d400d6e5e3554",
+ "url": "https://api.github.com/repos/AltThree/Bus/zipball/21d1623520c0ad48acb72420fd7f986cd23f349a",
+ "reference": "21d1623520c0ad48acb72420fd7f986cd23f349a",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9"
+ "illuminate/bus": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "illuminate/container": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "illuminate/pipeline": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "php": "^7.1.3 || ^8.0"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.4 || ^3.0",
+ "graham-campbell/testbench": "^5.5",
+ "mockery/mockery": "^1.3.1",
+ "phpunit/phpunit": "^6.5 || ^7.5 || ^8.4 || ^9.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.2-dev"
- }
- },
"autoload": {
"psr-4": {
- "AltThree\\Badger\\": "src/"
+ "AltThree\\Bus\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -46,64 +46,53 @@
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Alt Three",
+ "email": "support@alt-three.com"
}
],
- "description": "A Badge Generator For Laravel 5",
+ "description": "An improved command bus for Laravel",
"keywords": [
"Alt Three",
- "badge",
- "badger",
- "shield",
- "svg"
+ "bus",
+ "command",
+ "command bus",
+ "job"
],
- "time": "2017-01-01T12:36:28+00:00"
+ "support": {
+ "issues": "https://github.com/AltThree/Bus/issues",
+ "source": "https://github.com/AltThree/Bus/tree/4.5"
+ },
+ "abandoned": true,
+ "time": "2020-07-25T19:26:48+00:00"
},
{
- "name": "alt-three/bus",
- "version": "v2.1.0",
+ "name": "alt-three/validator",
+ "version": "v4.5.0",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Bus.git",
- "reference": "a71bafc3d56fd8e980ecd31447a75fd846494539"
+ "url": "https://github.com/AltThree/Validator.git",
+ "reference": "65ffc90cda5589052f0dac124d588946dfffd803"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Bus/zipball/a71bafc3d56fd8e980ecd31447a75fd846494539",
- "reference": "a71bafc3d56fd8e980ecd31447a75fd846494539",
+ "url": "https://api.github.com/repos/AltThree/Validator/zipball/65ffc90cda5589052f0dac124d588946dfffd803",
+ "reference": "65ffc90cda5589052f0dac124d588946dfffd803",
"shasum": ""
},
"require": {
- "illuminate/bus": "5.3.*|5.4.*",
- "illuminate/container": "5.3.*|5.4.*",
- "illuminate/contracts": "5.3.*|5.4.*",
- "illuminate/pipeline": "5.3.*|5.4.*",
- "illuminate/support": "5.3.*|5.4.*",
- "php": ">=5.6.4"
+ "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0",
+ "php": "^7.1.3 || ^8.0",
+ "psr/log": "^1.1"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^5.0"
+ "graham-campbell/analyzer": "^2.4 || ^3.0",
+ "phpunit/phpunit": "^6.5 || ^7.5 || ^8.4 || ^9.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- }
- },
"autoload": {
"psr-4": {
- "AltThree\\Bus\\": "src/"
+ "AltThree\\Validator\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -112,67 +101,55 @@
],
"authors": [
{
- "name": "Taylor Otwell",
- "email": "taylorotwell@gmail.com"
- },
- {
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Alt Three",
+ "email": "support@alt-three.com"
}
],
- "description": "An improved command bus for Laravel 5.2+",
+ "description": "A validation wrapper for Laravel",
"keywords": [
"Alt Three",
- "bus",
- "command",
- "command bus",
- "job"
+ "validation",
+ "validator"
],
- "time": "2017-01-01T12:37:11+00:00"
+ "support": {
+ "issues": "https://github.com/AltThree/Validator/issues",
+ "source": "https://github.com/AltThree/Validator/tree/4.5"
+ },
+ "abandoned": true,
+ "time": "2020-07-25T18:31:34+00:00"
},
{
- "name": "alt-three/emoji",
- "version": "v4.1.0",
+ "name": "asm89/stack-cors",
+ "version": "1.3.0",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Emoji.git",
- "reference": "3aa00f11d5a13f7fb43fc8f1e8d66c9788e626ec"
+ "url": "https://github.com/asm89/stack-cors.git",
+ "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Emoji/zipball/3aa00f11d5a13f7fb43fc8f1e8d66c9788e626ec",
- "reference": "3aa00f11d5a13f7fb43fc8f1e8d66c9788e626ec",
+ "url": "https://api.github.com/repos/asm89/stack-cors/zipball/b9c31def6a83f84b4d4a40d35996d375755f0e08",
+ "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08",
"shasum": ""
},
"require": {
- "guzzlehttp/guzzle": "^5.3|^6.0",
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "league/commonmark": "^0.15",
- "php": ">=5.5.9"
+ "php": ">=5.5.9",
+ "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
+ "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
},
"require-dev": {
- "graham-campbell/markdown": "^7.0",
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "phpunit/phpunit": "^5.0 || ^4.8.10",
+ "squizlabs/php_codesniffer": "^2.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
"psr-4": {
- "AltThree\\Emoji\\": "src/"
+ "Asm89\\Stack\\": "src/Asm89/Stack/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -181,183 +158,212 @@
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
}
],
- "description": "An Emoji Parser For Laravel 5",
+ "description": "Cross-origin resource sharing library and stack middleware",
+ "homepage": "https://github.com/asm89/stack-cors",
"keywords": [
- "Alt Three",
- "emoji",
- "parser"
+ "cors",
+ "stack"
],
- "time": "2017-01-01T12:37:40+00:00"
+ "support": {
+ "issues": "https://github.com/asm89/stack-cors/issues",
+ "source": "https://github.com/asm89/stack-cors/tree/1.3.0"
+ },
+ "time": "2019-12-24T22:41:47+00:00"
},
{
- "name": "alt-three/logger",
- "version": "v1.3.0",
+ "name": "aws/aws-crt-php",
+ "version": "v1.2.3",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Logger.git",
- "reference": "2136162549b6ec99e3eae9f8cfff84e41caafe15"
+ "url": "https://github.com/awslabs/aws-crt-php.git",
+ "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Logger/zipball/2136162549b6ec99e3eae9f8cfff84e41caafe15",
- "reference": "2136162549b6ec99e3eae9f8cfff84e41caafe15",
+ "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/5545a4fa310aec39f54279fdacebcce33b3ff382",
+ "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9",
- "psr/log": "^1.0"
+ "php": ">=5.5"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
+ "yoast/phpunit-polyfills": "^1.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
+ "suggest": {
+ "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
},
+ "type": "library",
"autoload": {
- "psr-4": {
- "AltThree\\Logger\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "Apache-2.0"
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "AWS SDK Common Runtime Team",
+ "email": "aws-sdk-common-runtime@amazon.com"
}
],
- "description": "A Logger Wrapper For Laravel 5",
+ "description": "AWS Common Runtime for PHP",
+ "homepage": "https://github.com/awslabs/aws-crt-php",
"keywords": [
- "Alt Three",
- "logger",
- "logging"
+ "amazon",
+ "aws",
+ "crt",
+ "sdk"
],
- "time": "2017-01-01T12:36:39+00:00"
+ "support": {
+ "issues": "https://github.com/awslabs/aws-crt-php/issues",
+ "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.3"
+ },
+ "time": "2023-10-16T20:10:06+00:00"
},
{
- "name": "alt-three/throttle",
- "version": "v1.2.0",
+ "name": "aws/aws-sdk-php",
+ "version": "3.278.3",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Throttle.git",
- "reference": "bda58993b1818b943f1738661af692a639c4aa5e"
+ "url": "https://github.com/aws/aws-sdk-php.git",
+ "reference": "596534c0627d8b38597061341e99b460437d1a16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Throttle/zipball/bda58993b1818b943f1738661af692a639c4aa5e",
- "reference": "bda58993b1818b943f1738661af692a639c4aa5e",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/596534c0627d8b38597061341e99b460437d1a16",
+ "reference": "596534c0627d8b38597061341e99b460437d1a16",
"shasum": ""
},
"require": {
- "illuminate/cache": "5.2.*|5.3.*|5.4.*",
- "illuminate/http": "5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9"
+ "aws/aws-crt-php": "^1.0.4",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+ "guzzlehttp/promises": "^1.4.0",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+ "mtdowling/jmespath.php": "^2.6",
+ "php": ">=5.5",
+ "psr/http-message": "^1.0"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "andrewsville/php-token-reflection": "^1.4",
+ "aws/aws-php-sns-message-validator": "~1.0",
+ "behat/behat": "~3.0",
+ "composer/composer": "^1.10.22",
+ "dms/phpunit-arraysubset-asserts": "^0.4.0",
+ "doctrine/cache": "~1.4",
+ "ext-dom": "*",
+ "ext-openssl": "*",
+ "ext-pcntl": "*",
+ "ext-sockets": "*",
+ "nette/neon": "^2.3",
+ "paragonie/random_compat": ">= 2",
+ "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "sebastian/comparator": "^1.2.3 || ^4.0",
+ "yoast/phpunit-polyfills": "^1.0"
+ },
+ "suggest": {
+ "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
+ "doctrine/cache": "To use the DoctrineCacheAdapter",
+ "ext-curl": "To send requests using cURL",
+ "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
+ "ext-sockets": "To use client-side monitoring"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
+ "files": [
+ "src/functions.php"
+ ],
"psr-4": {
- "AltThree\\Throttle\\": "src/"
+ "Aws\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "Apache-2.0"
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Amazon Web Services",
+ "homepage": "http://aws.amazon.com"
}
],
- "description": "A request rate limiter for Laravel 5.2+",
+ "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
+ "homepage": "http://aws.amazon.com/sdkforphp",
"keywords": [
- "Alt Three",
- "http",
- "rate limit",
- "rate limiter",
- "throttle"
+ "amazon",
+ "aws",
+ "cloud",
+ "dynamodb",
+ "ec2",
+ "glacier",
+ "s3",
+ "sdk"
],
- "time": "2017-01-01T12:37:29+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.278.3"
+ },
+ "time": "2023-08-15T18:07:55+00:00"
},
{
- "name": "alt-three/twitter",
- "version": "v1.0.0",
+ "name": "barryvdh/laravel-cors",
+ "version": "v0.11.4",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Twitter.git",
- "reference": "b4e4a33bc76f8e444359fd772bb4f063a21a578f"
+ "url": "https://github.com/fruitcake/laravel-cors.git",
+ "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Twitter/zipball/b4e4a33bc76f8e444359fd772bb4f063a21a578f",
- "reference": "b4e4a33bc76f8e444359fd772bb4f063a21a578f",
+ "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/03492f1a3bc74a05de23f93b94ac7cc5c173eec9",
+ "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "league/commonmark": "^0.15",
- "php": ">=5.5.9"
+ "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": {
- "graham-campbell/markdown": "^7.0",
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "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": "1.0-dev"
+ "dev-master": "0.11-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Barryvdh\\Cors\\ServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "AltThree\\Twitter\\": "src/"
+ "Barryvdh\\Cors\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -366,59 +372,59 @@
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
}
],
- "description": "A Twitter handle parser for Laravel 5",
+ "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
"keywords": [
- "Alt Three",
- "markdown",
- "parser",
- "twitter"
+ "api",
+ "cors",
+ "crossdomain",
+ "laravel"
],
- "time": "2017-03-03T21:19:20+00:00"
+ "support": {
+ "issues": "https://github.com/fruitcake/laravel-cors/issues",
+ "source": "https://github.com/fruitcake/laravel-cors/tree/v0.11.4"
+ },
+ "abandoned": true,
+ "time": "2019-08-28T11:27:11+00:00"
},
{
- "name": "alt-three/validator",
- "version": "v1.6.0",
+ "name": "bugsnag/bugsnag",
+ "version": "v3.29.1",
"source": {
"type": "git",
- "url": "https://github.com/AltThree/Validator.git",
- "reference": "d61966e8f703643197f957816c765306bcf27664"
+ "url": "https://github.com/bugsnag/bugsnag-php.git",
+ "reference": "7fff8512b237a57323f600975ada6376e2b912c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/Validator/zipball/d61966e8f703643197f957816c765306bcf27664",
- "reference": "d61966e8f703643197f957816c765306bcf27664",
+ "url": "https://api.github.com/repos/bugsnag/bugsnag-php/zipball/7fff8512b237a57323f600975ada6376e2b912c1",
+ "reference": "7fff8512b237a57323f600975ada6376e2b912c1",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9",
- "psr/log": "^1.0"
+ "composer/ca-bundle": "^1.0",
+ "guzzlehttp/guzzle": "^5.0|^6.0|^7.0",
+ "php": ">=5.5"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.0"
+ "guzzlehttp/psr7": "^1.3",
+ "mtdowling/burgomaster": "dev-master#72151eddf5f0cf101502b94bf5031f9c53501a04",
+ "php-mock/php-mock-phpunit": "^1.1|^2.1",
+ "phpunit/phpunit": "^4.8.36|^7.5.15|^9.3.10",
+ "sebastian/version": ">=1.0.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6-dev"
+ "dev-master": "3.20-dev"
}
},
"autoload": {
"psr-4": {
- "AltThree\\Validator\\": "src/"
+ "Bugsnag\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -427,151 +433,122 @@
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "James Smith",
+ "email": "notifiers@bugsnag.com",
+ "homepage": "https://bugsnag.com"
}
],
- "description": "A Validation Wrapper For Laravel 5",
+ "description": "Official Bugsnag notifier for PHP applications.",
+ "homepage": "https://github.com/bugsnag/bugsnag-php",
"keywords": [
- "Alt Three",
+ "bugsnag",
+ "errors",
+ "exceptions",
"logging",
- "validator"
+ "tracking"
],
- "time": "2017-01-01T12:36:20+00:00"
+ "support": {
+ "issues": "https://github.com/bugsnag/bugsnag-php/issues",
+ "source": "https://github.com/bugsnag/bugsnag-php/tree/v3.29.1"
+ },
+ "time": "2023-05-10T11:07:22+00:00"
},
{
- "name": "aws/aws-sdk-php",
- "version": "3.24.7",
+ "name": "bugsnag/bugsnag-laravel",
+ "version": "v2.26.0",
"source": {
"type": "git",
- "url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "f062d7ea2123fe2aefef91da855c10ef8ff3af1c"
+ "url": "https://github.com/bugsnag/bugsnag-laravel.git",
+ "reference": "333a912e38ead3e02724381093778b271168c8a3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f062d7ea2123fe2aefef91da855c10ef8ff3af1c",
- "reference": "f062d7ea2123fe2aefef91da855c10ef8ff3af1c",
+ "url": "https://api.github.com/repos/bugsnag/bugsnag-laravel/zipball/333a912e38ead3e02724381093778b271168c8a3",
+ "reference": "333a912e38ead3e02724381093778b271168c8a3",
"shasum": ""
},
"require": {
- "guzzlehttp/guzzle": "^5.3.1|^6.2.1",
- "guzzlehttp/promises": "~1.0",
- "guzzlehttp/psr7": "^1.4.1",
- "mtdowling/jmespath.php": "~2.2",
+ "bugsnag/bugsnag": "^3.29.0",
+ "bugsnag/bugsnag-psr-logger": "^1.4|^2.0",
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0",
+ "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0",
+ "monolog/monolog": "^1.12|^2.0|^3.0",
"php": ">=5.5"
},
"require-dev": {
- "andrewsville/php-token-reflection": "^1.4",
- "aws/aws-php-sns-message-validator": "~1.0",
- "behat/behat": "~3.0",
- "doctrine/cache": "~1.4",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-openssl": "*",
- "ext-pcre": "*",
- "ext-simplexml": "*",
- "ext-spl": "*",
- "nette/neon": "^2.3",
- "phpunit/phpunit": "~4.0|~5.0",
- "psr/cache": "^1.0"
- },
- "suggest": {
- "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
- "doctrine/cache": "To use the DoctrineCacheAdapter",
- "ext-curl": "To send requests using cURL",
- "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages"
+ "orchestra/testbench": "^3.1|^4.0|^5.0|^6.0|^7.0|^8.0",
+ "phpunit/phpunit": "^4.8.36|^6.3.1|^7.5.15|^8.3.5|^9.3.10"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "2.18-dev"
}
},
"autoload": {
"psr-4": {
- "Aws\\": "src/"
- },
- "files": [
- "src/functions.php"
- ]
+ "Bugsnag\\BugsnagLaravel\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Amazon Web Services",
- "homepage": "http://aws.amazon.com"
+ "name": "James Smith",
+ "email": "notifiers@bugsnag.com"
}
],
- "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
- "homepage": "http://aws.amazon.com/sdkforphp",
+ "description": "Official Bugsnag notifier for Laravel applications.",
+ "homepage": "https://github.com/bugsnag/bugsnag-laravel",
"keywords": [
- "amazon",
- "aws",
- "cloud",
- "dynamodb",
- "ec2",
- "glacier",
- "s3",
- "sdk"
+ "bugsnag",
+ "errors",
+ "exceptions",
+ "laravel",
+ "logging",
+ "tracking"
],
- "time": "2017-03-23T22:17:20+00:00"
+ "support": {
+ "issues": "https://github.com/bugsnag/bugsnag-laravel/issues",
+ "source": "https://github.com/bugsnag/bugsnag-laravel/tree/v2.26.0"
+ },
+ "time": "2023-02-16T08:48:39+00:00"
},
{
- "name": "backup-manager/backup-manager",
- "version": "1.1.3",
+ "name": "bugsnag/bugsnag-psr-logger",
+ "version": "v1.4.5",
"source": {
"type": "git",
- "url": "https://github.com/backup-manager/backup-manager.git",
- "reference": "9e53714a993135f57fe2bff001203b6f75c2387c"
+ "url": "https://github.com/bugsnag/bugsnag-psr-logger.git",
+ "reference": "366430a94d983488d265c1068f47d78ebfbacd74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/backup-manager/backup-manager/zipball/9e53714a993135f57fe2bff001203b6f75c2387c",
- "reference": "9e53714a993135f57fe2bff001203b6f75c2387c",
+ "url": "https://api.github.com/repos/bugsnag/bugsnag-psr-logger/zipball/366430a94d983488d265c1068f47d78ebfbacd74",
+ "reference": "366430a94d983488d265c1068f47d78ebfbacd74",
"shasum": ""
},
"require": {
- "league/flysystem": "~1.0",
- "php": ">=5.5.9",
- "symfony/process": "~2.1|~3.0"
+ "bugsnag/bugsnag": "^3.10",
+ "php": ">=5.5",
+ "psr/log": "^1.0|^2.0"
},
"require-dev": {
- "aws/aws-sdk-php": "~3.0",
- "dropbox/dropbox-sdk": "~1.1",
- "league/flysystem-aws-s3-v3": "~1.0",
- "league/flysystem-dropbox": "~1.0",
- "league/flysystem-rackspace": "~1.0",
- "league/flysystem-sftp": "~1.0",
- "mockery/mockery": "~0.9",
- "phpspec/phpspec": "~2.1",
- "satooshi/php-coveralls": "~0.6"
- },
- "suggest": {
- "league/flysystem-aws-s3-v3": "AwsS3 and GoogleCS adapter support.",
- "league/flysystem-dropbox": "Dropbox adapter support.",
- "league/flysystem-rackspace": "Rackspace adapter support.",
- "league/flysystem-sftp": "Sftp adapter support."
+ "graham-campbell/testbench-core": "^1.1",
+ "mockery/mockery": "^0.9.4|^1.3.1",
+ "phpunit/phpunit": "^4.8.36|^7.5.15|^9.4.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.5-dev"
}
},
"autoload": {
"psr-4": {
- "BackupManager\\": "src/"
+ "Bugsnag\\PsrLogger\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -580,54 +557,65 @@
],
"authors": [
{
- "name": "Shawn McCool",
- "email": "shawn@heybigname.com",
- "homepage": "http://heybigname.com/"
- },
- {
- "name": "Mitchell van Wijngaarden",
- "email": "mitchell@kooding.nl",
- "homepage": "http://heybigname.com/"
+ "name": "James Smith",
+ "email": "notifiers@bugsnag.com",
+ "homepage": "https://bugsnag.com"
}
],
- "description": "A framework agnostic database backup manager with user-definable procedures and support for S3, Dropbox, FTP, SFTP, and more with drivers for popular frameworks.",
- "time": "2017-01-05T12:10:13+00:00"
+ "description": "Official Bugsnag PHP PSR Logger.",
+ "homepage": "https://github.com/bugsnag/bugsnag-psr",
+ "keywords": [
+ "bugsnag",
+ "errors",
+ "exceptions",
+ "logging",
+ "psr",
+ "tracking"
+ ],
+ "support": {
+ "issues": "https://github.com/bugsnag/bugsnag-psr-logger/issues",
+ "source": "https://github.com/bugsnag/bugsnag-psr-logger/tree/v1.4.5"
+ },
+ "time": "2021-12-13T09:52:57+00:00"
},
{
- "name": "backup-manager/laravel",
- "version": "1.1.2",
+ "name": "cachethq/badger",
+ "version": "v2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/backup-manager/laravel.git",
- "reference": "a94b98cd3033c8e5c5958dc3640bf05b0f2df636"
+ "url": "https://github.com/CachetHQ/Badger.git",
+ "reference": "9d7f9e8f8529d902f3a30ad120a403a7ba2da1e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/backup-manager/laravel/zipball/a94b98cd3033c8e5c5958dc3640bf05b0f2df636",
- "reference": "a94b98cd3033c8e5c5958dc3640bf05b0f2df636",
+ "url": "https://api.github.com/repos/CachetHQ/Badger/zipball/9d7f9e8f8529d902f3a30ad120a403a7ba2da1e3",
+ "reference": "9d7f9e8f8529d902f3a30ad120a403a7ba2da1e3",
"shasum": ""
},
"require": {
- "backup-manager/backup-manager": "^1.0",
- "illuminate/console": "^4.0||^5.0",
- "illuminate/container": "^4.0||^5.0",
- "illuminate/support": "^4.0||^5.0",
- "php": ">=5.5.0",
- "symfony/process": "^2.0||^3.0"
+ "illuminate/contracts": "^5.5|^6.0",
+ "illuminate/support": "^5.5|^6.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "mockery/mockery": "dev-master",
- "satooshi/php-coveralls": "~0.6"
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/testbench": "^5.1",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "CachetHQ\\Badger\\BadgerServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "BackupManager\\Laravel\\": "src/"
+ "CachetHQ\\Badger\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -636,93 +624,132 @@
],
"authors": [
{
- "name": "Shawn McCool",
- "email": "shawn@heybigname.com",
- "homepage": "http://heybigname.com/"
- },
- {
- "name": "Mitchell van Wijngaarden",
- "email": "mitchell@kooding.nl",
- "homepage": "http://heybigname.com/"
+ "name": "Cachet",
+ "email": "support@cachethq.io"
}
],
- "description": "Database backup manager seamlessly integrated with Laravel 4 or 5 with user-definable procedures and support for S3, Dropbox, FTP, SFTP, and more.",
- "time": "2016-11-15T11:11:05+00:00"
- },
- {
- "name": "bacon/bacon-qr-code",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/Bacon/BaconQrCode.git",
- "reference": "031a2ce68c5794064b49d11775b2daf45c96e21c"
- },
+ "description": "A Badge Generator For Laravel 5 and 6.",
+ "keywords": [
+ "CachetHQ",
+ "badge",
+ "badger",
+ "cachet",
+ "shield",
+ "svg"
+ ],
+ "support": {
+ "issues": "https://github.com/CachetHQ/Badger/issues",
+ "source": "https://github.com/CachetHQ/Badger/tree/v2.0.0"
+ },
+ "time": "2019-11-18T20:06:20+00:00"
+ },
+ {
+ "name": "cachethq/emoji",
+ "version": "v3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CachetHQ/Emoji.git",
+ "reference": "45227616c9b8077deeefe5561035e219b4118233"
+ },
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/031a2ce68c5794064b49d11775b2daf45c96e21c",
- "reference": "031a2ce68c5794064b49d11775b2daf45c96e21c",
+ "url": "https://api.github.com/repos/CachetHQ/Emoji/zipball/45227616c9b8077deeefe5561035e219b4118233",
+ "reference": "45227616c9b8077deeefe5561035e219b4118233",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "graham-campbell/guzzle-factory": "^3.0",
+ "illuminate/contracts": "^5.5|^6.0",
+ "illuminate/support": "^5.5|^6.0",
+ "league/commonmark": "^1.0",
+ "php": "^7.1.3"
},
- "suggest": {
- "ext-gd": "to generate QR code images"
+ "require-dev": {
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/markdown": "^11.0",
+ "graham-campbell/testbench": "^5.1",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "CachetHQ\\Emoji\\EmojiServiceProvider"
+ ]
+ }
+ },
"autoload": {
- "psr-0": {
- "BaconQrCode": "src/"
+ "psr-4": {
+ "CachetHQ\\Emoji\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-2-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Ben Scholzen 'DASPRiD'",
- "email": "mail@dasprids.de",
- "homepage": "http://www.dasprids.de",
- "role": "Developer"
+ "name": "Cachet",
+ "email": "support@cachethq.io"
}
],
- "description": "BaconQrCode is a QR code generator for PHP.",
- "homepage": "https://github.com/Bacon/BaconQrCode",
- "time": "2016-01-09T22:55:35+00:00"
+ "description": "An Emoji Parser For Laravel 5 and 6",
+ "keywords": [
+ "CachetHQ",
+ "cachet",
+ "emoji",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/CachetHQ/Emoji/issues",
+ "source": "https://github.com/CachetHQ/Emoji/tree/v3.0.0"
+ },
+ "time": "2019-11-19T17:04:13+00:00"
},
{
- "name": "barryvdh/laravel-cors",
- "version": "v0.8.6",
+ "name": "cachethq/twitter",
+ "version": "v3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/barryvdh/laravel-cors.git",
- "reference": "9bf14c1d5ebe46738e8c535e56e621f98779197d"
+ "url": "https://github.com/CachetHQ/Twitter.git",
+ "reference": "81216cbc3c1f1a32df70bfb73837f59a35a22b1c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-cors/zipball/9bf14c1d5ebe46738e8c535e56e621f98779197d",
- "reference": "9bf14c1d5ebe46738e8c535e56e621f98779197d",
+ "url": "https://api.github.com/repos/CachetHQ/Twitter/zipball/81216cbc3c1f1a32df70bfb73837f59a35a22b1c",
+ "reference": "81216cbc3c1f1a32df70bfb73837f59a35a22b1c",
"shasum": ""
},
"require": {
- "illuminate/support": "5.1.x|5.2.x|5.3.x|5.4.x",
- "php": ">=5.5.9",
- "symfony/http-foundation": "~2.7|~3.0",
- "symfony/http-kernel": "~2.7|~3.0"
+ "illuminate/contracts": "^5.5|^6.0",
+ "illuminate/support": "^5.5|^6.0",
+ "league/commonmark": "^1.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.2"
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/markdown": "^11.0",
+ "graham-campbell/testbench": "^5.1",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.8-dev"
+ "dev-master": "3.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "CachetHQ\\Twitter\\TwitterServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "Barryvdh\\Cors\\": "src/"
+ "CachetHQ\\Twitter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -731,49 +758,108 @@
],
"authors": [
{
- "name": "Barry vd. Heuvel",
- "email": "barryvdh@gmail.com"
+ "name": "Cachet",
+ "email": "support@cachethq.io"
}
],
- "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
+ "description": "A Twitter handle parser for Laravel 5 and 6",
"keywords": [
- "api",
- "cors",
- "crossdomain",
- "laravel"
+ "CachetHQ",
+ "cachet",
+ "markdown",
+ "parser",
+ "twitter"
],
- "time": "2017-02-15T21:21:33+00:00"
+ "support": {
+ "issues": "https://github.com/CachetHQ/Twitter/issues",
+ "source": "https://github.com/CachetHQ/Twitter/tree/v3.0.0"
+ },
+ "time": "2019-11-19T17:04:54+00:00"
},
{
- "name": "christian-riesen/base32",
- "version": "1.3.1",
+ "name": "chillerlan/php-qrcode",
+ "version": "2.0.8",
"source": {
"type": "git",
- "url": "https://github.com/ChristianRiesen/base32.git",
- "reference": "0a31e50c0fa9b1692d077c86ac188eecdcbaf7fa"
+ "url": "https://github.com/chillerlan/php-qrcode.git",
+ "reference": "bf0382aaf2f79fa41c2dcb0f216675f74d633fe7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/0a31e50c0fa9b1692d077c86ac188eecdcbaf7fa",
- "reference": "0a31e50c0fa9b1692d077c86ac188eecdcbaf7fa",
+ "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/bf0382aaf2f79fa41c2dcb0f216675f74d633fe7",
+ "reference": "bf0382aaf2f79fa41c2dcb0f216675f74d633fe7",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "chillerlan/php-traits": "^1.1",
+ "php": ">=7.0.3"
},
"require-dev": {
- "phpunit/phpunit": "4.*",
- "satooshi/php-coveralls": "0.*"
+ "chillerlan/php-authenticator": "^2.0",
+ "phpunit/phpunit": "^6.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
+ "autoload": {
+ "psr-4": {
+ "chillerlan\\QRCode\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kazuhiko Arase",
+ "homepage": "https://github.com/kazuhikoarase"
+ },
+ {
+ "name": "Smiley",
+ "email": "smiley@chillerlan.net",
+ "homepage": "https://github.com/codemasher"
+ }
+ ],
+ "description": "A QR code generator. PHP 7+",
+ "homepage": "https://github.com/chillerlan/php-qrcode",
+ "keywords": [
+ "qr code"
+ ],
+ "support": {
+ "issues": "https://github.com/chillerlan/php-qrcode/issues",
+ "source": "https://github.com/chillerlan/php-qrcode/tree/v2.0.x"
+ },
+ "funding": [
+ {
+ "url": "https://ko-fi.com/codemasher",
+ "type": "ko_fi"
}
+ ],
+ "time": "2020-04-12T07:38:35+00:00"
+ },
+ {
+ "name": "chillerlan/php-traits",
+ "version": "1.1.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/chillerlan/php-traits.git",
+ "reference": "264759946b6aaeb427346b749fc9639b790b8e7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/chillerlan/php-traits/zipball/264759946b6aaeb427346b749fc9639b790b8e7f",
+ "reference": "264759946b6aaeb427346b749fc9639b790b8e7f",
+ "shasum": ""
},
+ "require": {
+ "php": ">=7.0.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5"
+ },
+ "type": "library",
"autoload": {
"psr-4": {
- "Base32\\": "src/"
+ "chillerlan\\Traits\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -782,52 +868,61 @@
],
"authors": [
{
- "name": "Christian Riesen",
- "email": "chris.riesen@gmail.com",
- "homepage": "http://christianriesen.com",
- "role": "Developer"
+ "name": "Smiley",
+ "email": "smiley@chillerlan.net",
+ "homepage": "https://github.com/codemasher"
}
],
- "description": "Base32 encoder/decoder according to RFC 4648",
- "homepage": "https://github.com/ChristianRiesen/base32",
+ "description": "Some useful traits for PHP 7+",
+ "homepage": "https://github.com/chillerlan/php-traits",
"keywords": [
- "base32",
- "decode",
- "encode",
- "rfc4648"
+ "PHP7",
+ "container",
+ "dotenv",
+ "helper",
+ "trait"
],
- "time": "2016-05-05T11:49:03+00:00"
+ "support": {
+ "issues": "https://github.com/chillerlan/php-traits/issues",
+ "source": "https://github.com/chillerlan/php-traits"
+ },
+ "abandoned": true,
+ "time": "2018-06-22T00:30:47+00:00"
},
{
- "name": "classpreloader/classpreloader",
- "version": "3.1.0",
+ "name": "composer/ca-bundle",
+ "version": "1.3.7",
"source": {
"type": "git",
- "url": "https://github.com/ClassPreloader/ClassPreloader.git",
- "reference": "bc7206aa892b5a33f4680421b69b191efd32b096"
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "76e46335014860eec1aa5a724799a00a2e47cc85"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/bc7206aa892b5a33f4680421b69b191efd32b096",
- "reference": "bc7206aa892b5a33f4680421b69b191efd32b096",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85",
+ "reference": "76e46335014860eec1aa5a724799a00a2e47cc85",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^1.0|^2.0|^3.0",
- "php": ">=5.5.9"
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.0"
+ "phpstan/phpstan": "^0.12.55",
+ "psr/log": "^1.0",
+ "symfony/phpunit-bridge": "^4.2 || ^5",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "ClassPreloader\\": "src/"
+ "Composer\\CaBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -836,43 +931,61 @@
],
"authors": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
}
],
- "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case",
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
"keywords": [
- "autoload",
- "class",
- "preload"
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/ca-bundle/issues",
+ "source": "https://github.com/composer/ca-bundle/tree/1.3.7"
+ },
+ "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": "2016-09-16T12:50:15+00:00"
+ "time": "2023-08-30T09:31:38+00:00"
},
{
"name": "dnoegel/php-xdg-base-dir",
- "version": "0.1",
+ "version": "v0.1.1",
"source": {
"type": "git",
"url": "https://github.com/dnoegel/php-xdg-base-dir.git",
- "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a",
- "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
+ "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": "@stable"
+ "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
},
- "type": "project",
+ "type": "library",
"autoload": {
"psr-4": {
"XdgBaseDir\\": "src/"
@@ -883,39 +996,50 @@
"MIT"
],
"description": "implementation of xdg base directory specification for php",
- "time": "2014-10-24T07:27:01+00:00"
+ "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"
},
{
- "name": "doctrine/annotations",
- "version": "v1.4.0",
+ "name": "doctrine/cache",
+ "version": "1.13.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/annotations.git",
- "reference": "54cacc9b81758b14e3ce750f205a393d52339e97"
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "56cd022adb5514472cb144c087393c1821911d09"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97",
- "reference": "54cacc9b81758b14e3ce750f205a393d52339e97",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/56cd022adb5514472cb144c087393c1821911d09",
+ "reference": "56cd022adb5514472cb144c087393c1821911d09",
"shasum": ""
},
"require": {
- "doctrine/lexer": "1.*",
- "php": "^5.6 || ^7.0"
+ "php": "~7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
},
"require-dev": {
- "doctrine/cache": "1.*",
- "phpunit/phpunit": "^5.7"
+ "alcaeus/mongo-php-adapter": "^1.1",
+ "cache/integration-tests": "dev-master",
+ "doctrine/coding-standard": "^9",
+ "mongodb/mongodb": "^1.1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "predis/predis": "~1.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "symfony/cache": "^4.4 || ^5.4 || ^6",
+ "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.4.x-dev"
- }
+ "suggest": {
+ "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -923,6 +1047,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
@@ -931,10 +1059,6 @@
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
@@ -944,49 +1068,83 @@
"email": "schmittjoh@gmail.com"
}
],
- "description": "Docblock Annotations Parser",
- "homepage": "http://www.doctrine-project.org",
+ "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
+ "homepage": "https://www.doctrine-project.org/projects/cache.html",
"keywords": [
- "annotations",
- "docblock",
- "parser"
+ "abstraction",
+ "apcu",
+ "cache",
+ "caching",
+ "couchdb",
+ "memcached",
+ "php",
+ "redis",
+ "xcache"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/cache/issues",
+ "source": "https://github.com/doctrine/cache/tree/1.13.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
+ "type": "tidelift"
+ }
],
- "time": "2017-02-24T16:22:25+00:00"
+ "time": "2022-05-20T20:06:54+00:00"
},
{
- "name": "doctrine/cache",
- "version": "v1.6.1",
+ "name": "doctrine/dbal",
+ "version": "v2.9.3",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/cache.git",
- "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3"
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3",
- "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/7345cd59edfa2036eb0fa4264b77ae2576842035",
+ "reference": "7345cd59edfa2036eb0fa4264b77ae2576842035",
"shasum": ""
},
"require": {
- "php": "~5.5|~7.0"
- },
- "conflict": {
- "doctrine/common": ">2.2,<2.4"
+ "doctrine/cache": "^1.0",
+ "doctrine/event-manager": "^1.0",
+ "ext-pdo": "*",
+ "php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.8|~5.0",
- "predis/predis": "~1.0",
- "satooshi/php-coveralls": "~0.6"
+ "doctrine/coding-standard": "^5.0",
+ "jetbrains/phpstorm-stubs": "^2018.1.2",
+ "phpstan/phpstan": "^0.10.1",
+ "phpunit/phpunit": "^7.4",
+ "symfony/console": "^2.0.5|^3.0|^4.0",
+ "symfony/phpunit-bridge": "^3.4.5|^4.0.5"
+ },
+ "suggest": {
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
},
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6.x-dev"
+ "dev-master": "2.9.x-dev",
+ "dev-develop": "3.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+ "Doctrine\\DBAL\\": "lib/Doctrine/DBAL"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -994,6 +1152,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
@@ -1002,57 +1164,107 @@
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
}
],
- "description": "Caching library offering an object-oriented API for many cache backends",
- "homepage": "http://www.doctrine-project.org",
+ "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+ "homepage": "https://www.doctrine-project.org/projects/dbal.html",
"keywords": [
- "cache",
- "caching"
+ "abstraction",
+ "database",
+ "dbal",
+ "mysql",
+ "persistence",
+ "pgsql",
+ "php",
+ "queryobject"
],
- "time": "2016-10-29T11:16:17+00:00"
+ "support": {
+ "issues": "https://github.com/doctrine/dbal/issues",
+ "source": "https://github.com/doctrine/dbal/tree/2.9"
+ },
+ "time": "2019-11-02T22:19:34+00:00"
},
{
- "name": "doctrine/collections",
- "version": "v1.4.0",
+ "name": "doctrine/deprecations",
+ "version": "1.1.2",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/collections.git",
- "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba"
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba",
- "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
+ "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "~0.1@dev",
- "phpunit/phpunit": "^5.7"
+ "doctrine/coding-standard": "^9",
+ "phpstan/phpstan": "1.4.10 || 1.10.15",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psalm/plugin-phpunit": "0.18.4",
+ "psr/log": "^1 || ^2 || ^3",
+ "vimeo/psalm": "4.30.0 || 5.12.0"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3.x-dev"
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
}
},
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "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/1.1.2"
+ },
+ "time": "2023-09-27T20:04:15+00:00"
+ },
+ {
+ "name": "doctrine/event-manager",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520",
+ "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^10",
+ "phpstan/phpstan": "~1.4.10 || ^1.8.8",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.24"
+ },
+ "type": "library",
"autoload": {
- "psr-0": {
- "Doctrine\\Common\\Collections\\": "lib/"
+ "psr-4": {
+ "Doctrine\\Common\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1060,6 +1272,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
@@ -1068,10 +1284,6 @@
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
@@ -1079,51 +1291,75 @@
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
}
],
- "description": "Collections Abstraction library",
- "homepage": "http://www.doctrine-project.org",
+ "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
"keywords": [
- "array",
- "collections",
- "iterator"
+ "event",
+ "event dispatcher",
+ "event manager",
+ "event system",
+ "events"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/event-manager/issues",
+ "source": "https://github.com/doctrine/event-manager/tree/1.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
+ "type": "tidelift"
+ }
],
- "time": "2017-01-03T10:49:41+00:00"
+ "time": "2022-10-12T20:51:15+00:00"
},
{
- "name": "doctrine/common",
- "version": "v2.7.2",
+ "name": "doctrine/inflector",
+ "version": "1.4.4",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/common.git",
- "reference": "930297026c8009a567ac051fd545bf6124150347"
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347",
- "reference": "930297026c8009a567ac051fd545bf6124150347",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9",
+ "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9",
"shasum": ""
},
"require": {
- "doctrine/annotations": "1.*",
- "doctrine/cache": "1.*",
- "doctrine/collections": "1.*",
- "doctrine/inflector": "1.*",
- "doctrine/lexer": "1.*",
- "php": "~5.6|~7.0"
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.4.6"
+ "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",
"extra": {
"branch-alias": {
- "dev-master": "2.7.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Doctrine\\Common\\": "lib/Doctrine/Common"
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector",
+ "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1131,6 +1367,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
@@ -1139,10 +1379,6 @@
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
@@ -1152,54 +1388,67 @@
"email": "schmittjoh@gmail.com"
}
],
- "description": "Common Library for Doctrine projects",
- "homepage": "http://www.doctrine-project.org",
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
"keywords": [
- "annotations",
- "collections",
- "eventmanager",
- "persistence",
- "spl"
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/1.4.4"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
],
- "time": "2017-01-13T14:02:13+00:00"
+ "time": "2021-04-16T17:34:40+00:00"
},
{
- "name": "doctrine/dbal",
- "version": "v2.5.12",
+ "name": "doctrine/lexer",
+ "version": "1.2.3",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/dbal.git",
- "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44"
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/7b9e911f9d8b30d43b96853dab26898c710d8f44",
- "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+ "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
"shasum": ""
},
"require": {
- "doctrine/common": ">=2.4,<2.8-dev",
- "php": ">=5.3.2"
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*",
- "symfony/console": "2.*||^3.0"
+ "doctrine/coding-standard": "^9.0",
+ "phpstan/phpstan": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.11"
},
- "suggest": {
- "symfony/console": "For helpful console commands such as SQL execution and import of files."
- },
- "bin": [
- "bin/doctrine-dbal"
- ],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.5.x-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Doctrine\\DBAL\\": "lib/"
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1207,62 +1456,77 @@
"MIT"
],
"authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
},
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
},
{
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
}
],
- "description": "Database Abstraction Layer",
- "homepage": "http://www.doctrine-project.org",
- "keywords": [
- "database",
- "dbal",
- "persistence",
- "queryobject"
- ],
- "time": "2017-02-08T12:53:47+00:00"
+ "time": "2022-02-28T11:07:21+00:00"
},
{
- "name": "doctrine/inflector",
- "version": "v1.1.0",
+ "name": "dragonmantank/cron-expression",
+ "version": "v2.3.1",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/inflector.git",
- "reference": "90b2128806bfde671b6952ab8bea493942c1fdae"
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae",
- "reference": "90b2128806bfde671b6952ab8bea493942c1fdae",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2",
+ "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "php": "^7.0|^8.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*"
+ "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1.x-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
- "psr-0": {
- "Doctrine\\Common\\Inflector\\": "lib/"
+ "psr-4": {
+ "Cron\\": "src/Cron/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1271,62 +1535,69 @@
],
"authors": [
{
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
},
{
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
}
],
- "description": "Common String Manipulations with regard to casing and singular/plural rules.",
- "homepage": "http://www.doctrine-project.org",
+ "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
"keywords": [
- "inflection",
- "pluralize",
- "singularize",
- "string"
+ "cron",
+ "schedule"
+ ],
+ "support": {
+ "issues": "https://github.com/dragonmantank/cron-expression/issues",
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
],
- "time": "2015-11-06T14:35:42+00:00"
+ "time": "2020-10-13T00:52:37+00:00"
},
{
- "name": "doctrine/lexer",
- "version": "v1.0.1",
+ "name": "egulias/email-validator",
+ "version": "2.1.25",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/lexer.git",
- "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
- "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "doctrine/lexer": "^1.0.1",
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.10"
+ },
+ "require-dev": {
+ "dominicsayers/isemail": "^3.0.7",
+ "phpunit/phpunit": "^4.8.36|^7.5.15",
+ "satooshi/php-coveralls": "^1.0.1"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "2.1.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Doctrine\\Common\\Lexer\\": "lib/"
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1335,52 +1606,109 @@
],
"authors": [
{
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/egulias/EmailValidator/issues",
+ "source": "https://github.com/egulias/EmailValidator/tree/2.1.25"
+ },
+ "funding": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2020-12-29T14:50:06+00:00"
+ },
+ {
+ "name": "erusev/parsedown",
+ "version": "1.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/erusev/parsedown.git",
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Parsedown": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
{
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Emanuil Rusev",
+ "email": "hello@erusev.com",
+ "homepage": "http://erusev.com"
}
],
- "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
- "homepage": "http://www.doctrine-project.org",
+ "description": "Parser for Markdown.",
+ "homepage": "http://parsedown.org",
"keywords": [
- "lexer",
+ "markdown",
"parser"
],
- "time": "2014-09-09T13:34:57+00:00"
+ "support": {
+ "issues": "https://github.com/erusev/parsedown/issues",
+ "source": "https://github.com/erusev/parsedown/tree/1.7.x"
+ },
+ "time": "2019-12-30T22:54:17+00:00"
},
{
"name": "fideloper/proxy",
- "version": "3.3.0",
+ "version": "4.4.2",
"source": {
"type": "git",
"url": "https://github.com/fideloper/TrustedProxy.git",
- "reference": "4ac60dbd4bcd6636bf231ea0fd87c40ece4bdce0"
+ "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/4ac60dbd4bcd6636bf231ea0fd87c40ece4bdce0",
- "reference": "4ac60dbd4bcd6636bf231ea0fd87c40ece4bdce0",
+ "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/a751f2bc86dd8e6cfef12dc0cbdada82f5a18750",
+ "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750",
"shasum": ""
},
"require": {
- "illuminate/contracts": "~5.0",
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
"php": ">=5.4.0"
},
"require-dev": {
- "illuminate/http": "~5.0",
- "mockery/mockery": "~0.9.3"
+ "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.3-dev"
+ "laravel": {
+ "providers": [
+ "Fideloper\\Proxy\\TrustedProxyServiceProvider"
+ ]
}
},
"autoload": {
@@ -1404,38 +1732,48 @@
"proxy",
"trusted proxy"
],
- "time": "2017-03-23T23:17:29+00:00"
+ "support": {
+ "issues": "https://github.com/fideloper/TrustedProxy/issues",
+ "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.2"
+ },
+ "time": "2022-02-09T13:33:34+00:00"
},
{
"name": "graham-campbell/binput",
- "version": "v3.6.0",
+ "version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-Binput.git",
- "reference": "9b2873184bf77bb6ee478d79d0da21427b70164e"
+ "reference": "9c0df9c3d0481a495bdc0638ee67bc199d70e3b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Binput/zipball/9b2873184bf77bb6ee478d79d0da21427b70164e",
- "reference": "9b2873184bf77bb6ee478d79d0da21427b70164e",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Binput/zipball/9c0df9c3d0481a495bdc0638ee67bc199d70e3b4",
+ "reference": "9c0df9c3d0481a495bdc0638ee67bc199d70e3b4",
"shasum": ""
},
"require": {
- "graham-campbell/security": "^3.5",
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/http": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9"
+ "graham-campbell/security": "^6.2",
+ "illuminate/contracts": "^5.5|^6.0",
+ "illuminate/http": "^5.5|^6.0",
+ "illuminate/support": "^5.5|^6.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/testbench": "^5.2",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.6-dev"
+ "dev-master": "6.2-dev"
+ },
+ "laravel": {
+ "providers": [
+ "GrahamCampbell\\Binput\\BinputServiceProvider"
+ ]
}
},
"autoload": {
@@ -1467,42 +1805,59 @@
"laravel",
"security"
],
- "time": "2017-01-01T13:34:01+00:00"
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Laravel-Binput/issues",
+ "source": "https://github.com/GrahamCampbell/Laravel-Binput/tree/master"
+ },
+ "time": "2019-08-26T16:30:03+00:00"
},
{
- "name": "graham-campbell/core",
- "version": "v5.3.2",
+ "name": "graham-campbell/exceptions",
+ "version": "v11.3.0",
"source": {
"type": "git",
- "url": "https://github.com/GrahamCampbell/Laravel-Core.git",
- "reference": "27c0c9a0aa294dd06cfd2c6b15080c47f15bbb47"
+ "url": "https://github.com/GrahamCampbell/Laravel-Exceptions.git",
+ "reference": "c33548417cf9903a049c7311ab57352a7e720b33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Core/zipball/27c0c9a0aa294dd06cfd2c6b15080c47f15bbb47",
- "reference": "27c0c9a0aa294dd06cfd2c6b15080c47f15bbb47",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Exceptions/zipball/c33548417cf9903a049c7311ab57352a7e720b33",
+ "reference": "c33548417cf9903a049c7311ab57352a7e720b33",
"shasum": ""
},
"require": {
- "illuminate/console": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9"
+ "illuminate/contracts": "5.5.*|5.6.*|5.7.*|5.8.*",
+ "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*",
+ "php": "^7.1.3",
+ "psr/log": "^1.0",
+ "symfony/console": "^3.3|^4.0",
+ "symfony/debug": "^3.3|^4.0",
+ "symfony/http-foundation": "^3.3|^4.0"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.8|^5.0"
+ "filp/whoops": "^2.1.4",
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/testbench": "^5.2",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
+ },
+ "suggest": {
+ "filp/whoops": "Enables use of the debug displayer."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.3-dev"
+ "dev-master": "11.3-dev"
+ },
+ "laravel": {
+ "providers": [
+ "GrahamCampbell\\Exceptions\\ExceptionsServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "GrahamCampbell\\Core\\": "src/"
+ "GrahamCampbell\\Exceptions\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1515,61 +1870,57 @@
"email": "graham@alt-three.com"
}
],
- "description": "Core Provides Some Extra Functionality For Laravel 5",
+ "description": "Provides A Powerful Error Response System For Both Development And Production",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
- "Laravel Core",
- "Laravel-Core",
- "base",
- "core",
+ "Laravel Exceptions",
+ "Laravel-Exceptions",
+ "error",
+ "errors",
+ "exception",
+ "exceptions",
"framework",
"laravel",
- "starter"
+ "whoops"
],
- "time": "2017-02-03T22:03:48+00:00"
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Laravel-Exceptions/issues",
+ "source": "https://github.com/GrahamCampbell/Laravel-Exceptions/tree/v11.3.0"
+ },
+ "time": "2019-06-03T06:57:27+00:00"
},
{
- "name": "graham-campbell/exceptions",
- "version": "v9.3.0",
+ "name": "graham-campbell/guzzle-factory",
+ "version": "v3.0.4",
"source": {
"type": "git",
- "url": "https://github.com/GrahamCampbell/Laravel-Exceptions.git",
- "reference": "b2001ce4e992ca473af6f470cddfcf6e0a83430d"
+ "url": "https://github.com/GrahamCampbell/Guzzle-Factory.git",
+ "reference": "618cf7220b177c6d9939a36331df937739ffc596"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Exceptions/zipball/b2001ce4e992ca473af6f470cddfcf6e0a83430d",
- "reference": "b2001ce4e992ca473af6f470cddfcf6e0a83430d",
+ "url": "https://api.github.com/repos/GrahamCampbell/Guzzle-Factory/zipball/618cf7220b177c6d9939a36331df937739ffc596",
+ "reference": "618cf7220b177c6d9939a36331df937739ffc596",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "paragonie/random_compat": "^1.1|^2.0",
- "php": ">=5.5.9",
- "psr/log": "^1.0",
- "symfony/debug": "^2.7|^3.0",
- "symfony/http-foundation": "^2.7|^3.0"
+ "guzzlehttp/guzzle": "^6.2",
+ "php": "^7.0|^8.0"
},
"require-dev": {
- "filp/whoops": "^1.1|^2.0",
- "graham-campbell/testbench": "^3.1",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.8|^5.0"
- },
- "suggest": {
- "filp/whoops": "Enables use of the debug displayer."
+ "graham-campbell/analyzer": "^2.4",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.3-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
- "GrahamCampbell\\Exceptions\\": "src/"
+ "GrahamCampbell\\GuzzleFactory\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1582,53 +1933,67 @@
"email": "graham@alt-three.com"
}
],
- "description": "Provides A Powerful Error Response System For Both Development And Production",
+ "description": "Provides A Simple Guzzle Factory With Good Defaults",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
- "Laravel Exceptions",
- "Laravel-Exceptions",
- "error",
- "errors",
- "exception",
- "exceptions",
- "framework",
- "laravel",
- "whoops"
+ "Guzzle",
+ "Guzzle Factory",
+ "Guzzle-Factory",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Guzzle-Factory/issues",
+ "source": "https://github.com/GrahamCampbell/Guzzle-Factory/tree/3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/guzzle-factory",
+ "type": "tidelift"
+ }
],
- "time": "2017-01-21T16:49:20+00:00"
+ "time": "2020-05-02T14:45:48+00:00"
},
{
"name": "graham-campbell/markdown",
- "version": "v7.1.0",
+ "version": "v11.2.1",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-Markdown.git",
- "reference": "507783993b40f4b118f201e8a8bec9e908b3ab1d"
+ "reference": "7ead48c43098b562707a30650843d4279786b0d9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/507783993b40f4b118f201e8a8bec9e908b3ab1d",
- "reference": "507783993b40f4b118f201e8a8bec9e908b3ab1d",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/7ead48c43098b562707a30650843d4279786b0d9",
+ "reference": "7ead48c43098b562707a30650843d4279786b0d9",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/view": "5.1.*|5.2.*|5.3.*|5.4.*",
- "league/commonmark": "^0.15",
- "php": ">=5.5.9"
+ "illuminate/contracts": "^5.5|^6.0|^7.0",
+ "illuminate/support": "^5.5|^6.0|^7.0",
+ "illuminate/view": "^5.5|^6.0|^7.0",
+ "league/commonmark": "^1.3",
+ "php": "^7.1.3"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "league/commonmark-extras": "^0.1.2",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.4",
+ "graham-campbell/testbench": "^5.4",
+ "mockery/mockery": "^1.3.1",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "7.1-dev"
+ "dev-master": "11.2-dev"
+ },
+ "laravel": {
+ "providers": [
+ "GrahamCampbell\\Markdown\\MarkdownServiceProvider"
+ ]
}
},
"autoload": {
@@ -1646,7 +2011,7 @@
"email": "graham@alt-three.com"
}
],
- "description": "Markdown Is A CommonMark Wrapper For Laravel 5",
+ "description": "Markdown Is A CommonMark Wrapper For Laravel",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
@@ -1658,35 +2023,60 @@
"laravel",
"markdown"
],
- "time": "2017-01-01T13:30:44+00:00"
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Laravel-Markdown/issues",
+ "source": "https://github.com/GrahamCampbell/Laravel-Markdown/tree/11.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/GrahamJCampbell",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/markdown",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-04-14T14:11:12+00:00"
},
{
"name": "graham-campbell/security",
- "version": "v3.7.0",
+ "version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-Security.git",
- "reference": "48d92c56581142d776cf2c5a0185a4319c6eb063"
+ "reference": "93b3e09774987916f9a91071b2e53738180f2ba8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Security/zipball/48d92c56581142d776cf2c5a0185a4319c6eb063",
- "reference": "48d92c56581142d776cf2c5a0185a4319c6eb063",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Security/zipball/93b3e09774987916f9a91071b2e53738180f2ba8",
+ "reference": "93b3e09774987916f9a91071b2e53738180f2ba8",
"shasum": ""
},
"require": {
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*|5.4.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*",
- "php": ">=5.5.9"
+ "graham-campbell/security-core": "^1.0",
+ "illuminate/contracts": "^5.5|^6.0",
+ "illuminate/support": "^5.5|^6.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.1",
+ "graham-campbell/testbench": "^5.2",
+ "phpunit/phpunit": "^6.5|^7.0|^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.7-dev"
+ "dev-master": "6.2-dev"
+ },
+ "laravel": {
+ "providers": [
+ "GrahamCampbell\\Security\\SecurityServiceProvider"
+ ]
}
},
"autoload": {
@@ -1715,44 +2105,42 @@
"laravel",
"security"
],
- "time": "2017-01-01T13:20:49+00:00"
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Laravel-Security/issues",
+ "source": "https://github.com/GrahamCampbell/Laravel-Security/tree/master"
+ },
+ "time": "2019-08-26T16:30:00+00:00"
},
{
- "name": "guzzlehttp/guzzle",
- "version": "6.2.3",
+ "name": "graham-campbell/security-core",
+ "version": "v1.0.3",
"source": {
"type": "git",
- "url": "https://github.com/guzzle/guzzle.git",
- "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
+ "url": "https://github.com/GrahamCampbell/Security-Core.git",
+ "reference": "3b14e58dba84b0238a3409818d6f67acc5c00bf9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
- "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "url": "https://api.github.com/repos/GrahamCampbell/Security-Core/zipball/3b14e58dba84b0238a3409818d6f67acc5c00bf9",
+ "reference": "3b14e58dba84b0238a3409818d6f67acc5c00bf9",
"shasum": ""
},
"require": {
- "guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.4",
- "php": ">=5.5"
+ "php": "^7.0"
},
"require-dev": {
- "ext-curl": "*",
- "phpunit/phpunit": "^4.0",
- "psr/log": "^1.0"
+ "graham-campbell/analyzer": "^2.4",
+ "phpunit/phpunit": "^6.5|^7.5|^8.4|^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.2-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
- "files": [
- "src/functions_include.php"
- ],
"psr-4": {
- "GuzzleHttp\\": "src/"
+ "GrahamCampbell\\SecurityCore\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1761,125 +2149,306 @@
],
"authors": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
}
],
- "description": "Guzzle is a PHP HTTP client library",
- "homepage": "http://guzzlephp.org/",
+ "description": "Security Core Is A Port Of The Security Class From Codeigniter 3 For General Use",
"keywords": [
- "client",
- "curl",
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Security Core",
+ "Security-Core",
+ "codeigniter",
"framework",
- "http",
- "http client",
- "rest",
- "web service"
+ "laravel",
+ "security"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Security-Core/issues",
+ "source": "https://github.com/GrahamCampbell/Security-Core/tree/v1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/GrahamJCampbell",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/security-core",
+ "type": "tidelift"
+ }
],
- "time": "2017-02-28T22:50:30+00:00"
+ "time": "2020-04-13T13:30:49+00:00"
},
{
- "name": "guzzlehttp/promises",
- "version": "v1.3.1",
+ "name": "guzzlehttp/guzzle",
+ "version": "6.5.8",
"source": {
"type": "git",
- "url": "https://github.com/guzzle/promises.git",
- "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
- "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
+ "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
"shasum": ""
},
"require": {
- "php": ">=5.5.0"
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.9",
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.17"
},
"require-dev": {
- "phpunit/phpunit": "^4.0"
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+ "psr/log": "^1.1"
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "6.5-dev"
}
},
"autoload": {
- "psr-4": {
- "GuzzleHttp\\Promise\\": "src/"
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/6.5.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
},
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-06-20T22:16:07+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "1.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e",
+ "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
+ },
+ "type": "library",
+ "autoload": {
"files": [
"src/functions_include.php"
- ]
+ ],
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
],
- "time": "2016-12-20T10:07:11+00:00"
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/1.5.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-21T12:31:43+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "1.4.2",
+ "version": "1.9.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b",
+ "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
- "psr/http-message": "~1.0"
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "ext-zlib": "*",
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.4-dev"
- }
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
+ "type": "library",
"autoload": {
- "psr-4": {
- "GuzzleHttp\\Psr7\\": "src/"
- },
"files": [
"src/functions_include.php"
- ]
+ ],
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
{
"name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
@@ -1887,42 +2456,61 @@
"keywords": [
"http",
"message",
+ "psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
- "time": "2017-03-20T17:10:46+00:00"
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/1.9.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-04-17T16:00:37+00:00"
},
{
"name": "jakub-onderka/php-console-color",
- "version": "0.1",
+ "version": "v0.2",
"source": {
"type": "git",
"url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
- "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1"
+ "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1",
- "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
+ "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "php": ">=5.4.0"
},
"require-dev": {
"jakub-onderka/php-code-style": "1.0",
- "jakub-onderka/php-parallel-lint": "0.*",
+ "jakub-onderka/php-parallel-lint": "1.0",
"jakub-onderka/php-var-dump-check": "0.*",
- "phpunit/phpunit": "3.7.*",
+ "phpunit/phpunit": "~4.3",
"squizlabs/php_codesniffer": "1.*"
},
"type": "library",
"autoload": {
- "psr-0": {
- "JakubOnderka\\PhpConsoleColor": "src/"
+ "psr-4": {
+ "JakubOnderka\\PhpConsoleColor\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1932,41 +2520,46 @@
"authors": [
{
"name": "Jakub Onderka",
- "email": "jakub.onderka@gmail.com",
- "homepage": "http://www.acci.cz"
+ "email": "jakub.onderka@gmail.com"
}
],
- "time": "2014-04-08T15:00:19+00:00"
+ "support": {
+ "issues": "https://github.com/JakubOnderka/PHP-Console-Color/issues",
+ "source": "https://github.com/JakubOnderka/PHP-Console-Color/tree/master"
+ },
+ "abandoned": "php-parallel-lint/php-console-color",
+ "time": "2018-09-29T17:23:10+00:00"
},
{
"name": "jakub-onderka/php-console-highlighter",
- "version": "v0.3.2",
+ "version": "v0.4",
"source": {
"type": "git",
"url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
- "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5"
+ "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5",
- "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5",
+ "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
+ "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
"shasum": ""
},
"require": {
- "jakub-onderka/php-console-color": "~0.1",
- "php": ">=5.3.0"
+ "ext-tokenizer": "*",
+ "jakub-onderka/php-console-color": "~0.2",
+ "php": ">=5.4.0"
},
"require-dev": {
"jakub-onderka/php-code-style": "~1.0",
- "jakub-onderka/php-parallel-lint": "~0.5",
+ "jakub-onderka/php-parallel-lint": "~1.0",
"jakub-onderka/php-var-dump-check": "~0.1",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "~1.5"
},
"type": "library",
"autoload": {
- "psr-0": {
- "JakubOnderka\\PhpConsoleHighlighter": "src/"
+ "psr-4": {
+ "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1980,35 +2573,49 @@
"homepage": "http://www.acci.cz/"
}
],
- "time": "2015-04-20T18:58:01+00:00"
+ "description": "Highlight PHP code in terminal",
+ "support": {
+ "issues": "https://github.com/JakubOnderka/PHP-Console-Highlighter/issues",
+ "source": "https://github.com/JakubOnderka/PHP-Console-Highlighter/tree/master"
+ },
+ "abandoned": "php-parallel-lint/php-console-highlighter",
+ "time": "2018-09-29T18:48:56+00:00"
},
{
"name": "jenssegers/date",
- "version": "v3.2.9",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/jenssegers/date.git",
- "reference": "0b31adfc17a359e34ceff20964a9047bca7ea7d9"
+ "reference": "58393b0544fc2525b3fcd02aa4c989857107e05a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jenssegers/date/zipball/0b31adfc17a359e34ceff20964a9047bca7ea7d9",
- "reference": "0b31adfc17a359e34ceff20964a9047bca7ea7d9",
+ "url": "https://api.github.com/repos/jenssegers/date/zipball/58393b0544fc2525b3fcd02aa4c989857107e05a",
+ "reference": "58393b0544fc2525b3fcd02aa4c989857107e05a",
"shasum": ""
},
"require": {
- "nesbot/carbon": "^1.0",
- "php": ">=5.4",
- "symfony/translation": "^2.7|^3.0"
+ "nesbot/carbon": "^1.0|^2.0",
+ "php": ">=5.6",
+ "symfony/translation": "^2.7|^3.0|^4.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.0|^5.0|^6.0",
- "satooshi/php-coveralls": "^1.0"
+ "phpunit/phpunit": "^5.0|^6.0|^7.0",
+ "satooshi/php-coveralls": "^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Jenssegers\\Date\\DateServiceProvider"
+ ],
+ "aliases": {
+ "Date": "Jenssegers\\Date\\Date"
+ }
}
},
"autoload": {
@@ -2037,39 +2644,42 @@
"time",
"translation"
],
- "time": "2017-03-12T09:26:50+00:00"
+ "support": {
+ "issues": "https://github.com/jenssegers/date/issues",
+ "source": "https://github.com/jenssegers/date/tree/master"
+ },
+ "time": "2019-03-10T08:50:58+00:00"
},
{
- "name": "jeremeamia/SuperClosure",
- "version": "2.3.0",
+ "name": "kylekatarnls/update-helper",
+ "version": "1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/jeremeamia/super_closure.git",
- "reference": "443c3df3207f176a1b41576ee2a66968a507b3db"
+ "url": "https://github.com/kylekatarnls/update-helper.git",
+ "reference": "429be50660ed8a196e0798e5939760f168ec8ce9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/443c3df3207f176a1b41576ee2a66968a507b3db",
- "reference": "443c3df3207f176a1b41576ee2a66968a507b3db",
+ "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/429be50660ed8a196e0798e5939760f168ec8ce9",
+ "reference": "429be50660ed8a196e0798e5939760f168ec8ce9",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^1.2|^2.0|^3.0",
- "php": ">=5.4",
- "symfony/polyfill-php56": "^1.0"
+ "composer-plugin-api": "^1.1.0 || ^2.0.0",
+ "php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.0|^5.0"
+ "codeclimate/php-test-reporter": "dev-master",
+ "composer/composer": "2.0.x-dev || ^2.0.0-dev",
+ "phpunit/phpunit": ">=4.8.35 <6.0"
},
- "type": "library",
+ "type": "composer-plugin",
"extra": {
- "branch-alias": {
- "dev-master": "2.3-dev"
- }
+ "class": "UpdateHelper\\ComposerPlugin"
},
"autoload": {
- "psr-4": {
- "SuperClosure\\": "src/"
+ "psr-0": {
+ "UpdateHelper\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2078,64 +2688,75 @@
],
"authors": [
{
- "name": "Jeremy Lindblom",
- "email": "jeremeamia@gmail.com",
- "homepage": "https://github.com/jeremeamia",
- "role": "Developer"
+ "name": "Kyle",
+ "email": "kylekatarnls@gmail.com"
}
],
- "description": "Serialize Closure objects, including their context and binding",
- "homepage": "https://github.com/jeremeamia/super_closure",
- "keywords": [
- "closure",
- "function",
- "lambda",
- "parser",
- "serializable",
- "serialize",
- "tokenizer"
+ "description": "Update helper",
+ "support": {
+ "issues": "https://github.com/kylekatarnls/update-helper/issues",
+ "source": "https://github.com/kylekatarnls/update-helper/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
],
- "time": "2016-12-07T09:37:55+00:00"
+ "time": "2020-04-07T20:44:10+00:00"
},
{
"name": "laravel/framework",
- "version": "v5.3.31",
+ "version": "v5.7.29",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "e641e75fc5b26ad0ba8c19b7e83b08cad1d03b89"
+ "reference": "2555bf6ef6e6739e5f49f4a5d40f6264c57abd56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/e641e75fc5b26ad0ba8c19b7e83b08cad1d03b89",
- "reference": "e641e75fc5b26ad0ba8c19b7e83b08cad1d03b89",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/2555bf6ef6e6739e5f49f4a5d40f6264c57abd56",
+ "reference": "2555bf6ef6e6739e5f49f4a5d40f6264c57abd56",
"shasum": ""
},
"require": {
- "classpreloader/classpreloader": "~3.0",
- "doctrine/inflector": "~1.0",
+ "doctrine/inflector": "^1.1",
+ "dragonmantank/cron-expression": "^2.0",
+ "erusev/parsedown": "^1.7",
"ext-mbstring": "*",
"ext-openssl": "*",
- "jeremeamia/superclosure": "~2.2",
- "league/flysystem": "~1.0",
- "monolog/monolog": "~1.11",
- "mtdowling/cron-expression": "~1.0",
- "nesbot/carbon": "~1.20",
- "paragonie/random_compat": "~1.4|~2.0",
- "php": ">=5.6.4",
- "psy/psysh": "0.7.*|0.8.*",
- "ramsey/uuid": "~3.0",
- "swiftmailer/swiftmailer": "~5.4",
- "symfony/console": "3.1.*",
- "symfony/debug": "3.1.*",
- "symfony/finder": "3.1.*",
- "symfony/http-foundation": "3.1.*",
- "symfony/http-kernel": "3.1.*",
- "symfony/process": "3.1.*",
- "symfony/routing": "3.1.*",
- "symfony/translation": "3.1.*",
- "symfony/var-dumper": "3.1.*",
- "vlucas/phpdotenv": "~2.2"
+ "laravel/nexmo-notification-channel": "^1.0",
+ "laravel/slack-notification-channel": "^1.0",
+ "league/flysystem": "^1.0.8",
+ "monolog/monolog": "^1.12",
+ "nesbot/carbon": "^1.26.3",
+ "opis/closure": "^3.1",
+ "php": "^7.1.3",
+ "psr/container": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "ramsey/uuid": "^3.7",
+ "swiftmailer/swiftmailer": "^6.0",
+ "symfony/console": "^4.1",
+ "symfony/debug": "^4.1",
+ "symfony/finder": "^4.1",
+ "symfony/http-foundation": "^4.1",
+ "symfony/http-kernel": "^4.1",
+ "symfony/process": "^4.1",
+ "symfony/routing": "^4.1",
+ "symfony/var-dumper": "^4.1",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.1",
+ "vlucas/phpdotenv": "^2.2"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
},
"replace": {
"illuminate/auth": "self.version",
@@ -2150,7 +2771,6 @@
"illuminate/database": "self.version",
"illuminate/encryption": "self.version",
"illuminate/events": "self.version",
- "illuminate/exception": "self.version",
"illuminate/filesystem": "self.version",
"illuminate/hashing": "self.version",
"illuminate/http": "self.version",
@@ -2166,36 +2786,50 @@
"illuminate/support": "self.version",
"illuminate/translation": "self.version",
"illuminate/validation": "self.version",
- "illuminate/view": "self.version",
- "tightenco/collect": "self.version"
+ "illuminate/view": "self.version"
},
"require-dev": {
- "aws/aws-sdk-php": "~3.0",
- "mockery/mockery": "~0.9.4",
- "pda/pheanstalk": "~3.0",
- "phpunit/phpunit": "~5.4",
- "predis/predis": "~1.0",
- "symfony/css-selector": "3.1.*",
- "symfony/dom-crawler": "3.1.*"
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/dbal": "^2.6",
+ "filp/whoops": "^2.1.4",
+ "guzzlehttp/guzzle": "^6.3",
+ "league/flysystem-cached-adapter": "^1.0",
+ "mockery/mockery": "^1.0",
+ "moontoast/math": "^1.1",
+ "orchestra/testbench-core": "3.7.*",
+ "pda/pheanstalk": "^3.0|^4.0",
+ "phpunit/phpunit": "^7.5",
+ "predis/predis": "^1.1.1",
+ "symfony/css-selector": "^4.1",
+ "symfony/dom-crawler": "^4.1",
+ "true/punycode": "^2.1"
},
"suggest": {
- "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
- "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).",
- "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
- "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).",
- "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
- "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
- "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
- "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
- "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
- "symfony/css-selector": "Required to use some of the crawler integration testing tools (3.1.*).",
- "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (3.1.*).",
- "symfony/psr-http-message-bridge": "Required to use psr7 bridging features (0.2.*)."
+ "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (^3.0).",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).",
+ "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "filp/whoops": "Required for friendly error pages in development (^2.1.4).",
+ "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).",
+ "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (^6.0).",
+ "laravel/tinker": "Required to use the tinker console command (^1.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-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).",
+ "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
+ "moontoast/math": "Required to use ordered UUIDs (^1.1).",
+ "nexmo/client": "Required to use the Nexmo transport (^1.0).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^3.0|^4.0).",
+ "predis/predis": "Required to use the redis cache and queue drivers (^1.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^3.0).",
+ "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.1).",
+ "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.1).",
+ "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.0)."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.3-dev"
+ "dev-master": "5.7-dev"
}
},
"autoload": {
@@ -2223,179 +2857,417 @@
"framework",
"laravel"
],
- "time": "2017-03-24T16:31:06+00:00"
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2020-04-14T14:16:19+00:00"
},
{
- "name": "lcobucci/jwt",
- "version": "3.2.1",
+ "name": "laravel/nexmo-notification-channel",
+ "version": "v1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/lcobucci/jwt.git",
- "reference": "ddce703826f9c5229781933b1a39069e38e6a0f3"
+ "url": "https://github.com/laravel/vonage-notification-channel.git",
+ "reference": "03edd42a55b306ff980c9950899d5a2b03260d48"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ddce703826f9c5229781933b1a39069e38e6a0f3",
- "reference": "ddce703826f9c5229781933b1a39069e38e6a0f3",
+ "url": "https://api.github.com/repos/laravel/vonage-notification-channel/zipball/03edd42a55b306ff980c9950899d5a2b03260d48",
+ "reference": "03edd42a55b306ff980c9950899d5a2b03260d48",
"shasum": ""
},
"require": {
- "ext-openssl": "*",
- "php": ">=5.5"
+ "nexmo/client": "^1.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "mdanter/ecc": "~0.3.1",
- "mikey179/vfsstream": "~1.5",
- "phpmd/phpmd": "~2.2",
- "phpunit/php-invoker": "~1.1",
- "phpunit/phpunit": "~4.5",
- "squizlabs/php_codesniffer": "~2.3"
- },
- "suggest": {
- "mdanter/ecc": "Required to use Elliptic Curves based algorithms."
+ "illuminate/notifications": "~5.7",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-master": "1.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Illuminate\\Notifications\\NexmoChannelServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "Lcobucci\\JWT\\": "src"
+ "Illuminate\\Notifications\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Luís Otávio Cobucci Oblonczyk",
- "email": "lcobucci@gmail.com",
- "role": "Developer"
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
}
],
- "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "description": "Nexmo Notification Channel for laravel.",
"keywords": [
- "JWS",
- "jwt"
+ "laravel",
+ "nexmo",
+ "notifications"
],
- "time": "2016-10-31T20:09:32+00:00"
+ "support": {
+ "issues": "https://github.com/laravel/vonage-notification-channel/issues",
+ "source": "https://github.com/laravel/vonage-notification-channel/tree/v1.0.1"
+ },
+ "abandoned": "laravel/vonage-notification-channel",
+ "time": "2018-12-04T12:57:08+00:00"
},
{
- "name": "league/commonmark",
- "version": "0.15.3",
+ "name": "laravel/slack-notification-channel",
+ "version": "v1.0.3",
"source": {
"type": "git",
- "url": "https://github.com/thephpleague/commonmark.git",
- "reference": "c8b43ee5821362216f8e9ac684f0f59de164edcc"
+ "url": "https://github.com/laravel/slack-notification-channel.git",
+ "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c8b43ee5821362216f8e9ac684f0f59de164edcc",
- "reference": "c8b43ee5821362216f8e9ac684f0f59de164edcc",
+ "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/6e164293b754a95f246faf50ab2bbea3e4923cc9",
+ "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9",
"shasum": ""
},
"require": {
- "ext-mbstring": "*",
- "php": ">=5.4.8"
- },
- "replace": {
- "colinodell/commonmark-php": "*"
+ "guzzlehttp/guzzle": "^6.0",
+ "php": "^7.1.3"
},
"require-dev": {
- "cebe/markdown": "~1.0",
- "erusev/parsedown": "~1.0",
- "jgm/commonmark": "0.27",
- "michelf/php-markdown": "~1.4",
- "mikehaertl/php-shellcommand": "~1.2.0",
- "phpunit/phpunit": "~4.3|~5.0",
- "scrutinizer/ocular": "~1.1",
- "symfony/finder": "~2.3|~3.0"
+ "illuminate/notifications": "~5.7",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.0"
},
- "suggest": {
- "league/commonmark-extras": "Library of useful extensions including smart punctuation"
- },
- "bin": [
- "bin/commonmark"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.16-dev"
+ "dev-master": "1.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Illuminate\\Notifications\\SlackChannelServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "League\\CommonMark\\": "src/"
+ "Illuminate\\Notifications\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Colin O'Dell",
- "email": "colinodell@gmail.com",
- "homepage": "https://www.colinodell.com",
- "role": "Lead Developer"
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
}
],
- "description": "Markdown parser for PHP based on the CommonMark spec",
- "homepage": "https://github.com/thephpleague/commonmark",
+ "description": "Slack Notification Channel for laravel.",
"keywords": [
- "commonmark",
- "markdown",
- "parser"
+ "laravel",
+ "notifications",
+ "slack"
],
- "time": "2016-12-19T00:11:43+00:00"
+ "support": {
+ "issues": "https://github.com/laravel/slack-notification-channel/issues",
+ "source": "https://github.com/laravel/slack-notification-channel/tree/1.0"
+ },
+ "time": "2018-12-12T13:12:06+00:00"
},
{
- "name": "league/flysystem",
- "version": "1.0.37",
+ "name": "laravel/tinker",
+ "version": "v1.0.10",
"source": {
"type": "git",
- "url": "https://github.com/thephpleague/flysystem.git",
- "reference": "78b5cc4feb61a882302df4fbaf63b7662e5e4ccd"
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/78b5cc4feb61a882302df4fbaf63b7662e5e4ccd",
- "reference": "78b5cc4feb61a882302df4fbaf63b7662e5e4ccd",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7",
+ "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
- },
- "conflict": {
- "league/flysystem-sftp": "<1.0.6"
+ "illuminate/console": "~5.1|^6.0",
+ "illuminate/contracts": "~5.1|^6.0",
+ "illuminate/support": "~5.1|^6.0",
+ "php": ">=5.5.9",
+ "psy/psysh": "0.7.*|0.8.*|0.9.*",
+ "symfony/var-dumper": "~3.0|~4.0"
},
"require-dev": {
- "ext-fileinfo": "*",
- "mockery/mockery": "~0.9",
- "phpspec/phpspec": "^2.2",
- "phpunit/phpunit": "~4.8"
+ "phpunit/phpunit": "~4.0|~5.0"
},
"suggest": {
- "ext-fileinfo": "Required for MimeType",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "league/flysystem-copy": "Allows you to use Copy.com storage",
- "league/flysystem-dropbox": "Allows you to use Dropbox storage",
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
+ "illuminate/database": "The Illuminate Database package (~5.1)."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Tinker\\TinkerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Tinker\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Powerful REPL for the Laravel framework.",
+ "keywords": [
+ "REPL",
+ "Tinker",
+ "laravel",
+ "psysh"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/tinker/issues",
+ "source": "https://github.com/laravel/tinker/tree/v1.0.10"
+ },
+ "time": "2019-08-07T15:10:45+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": {
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "mikey179/vfsstream": "~1.5",
+ "phpmd/phpmd": "~2.2",
+ "phpunit/php-invoker": "~1.1",
+ "phpunit/phpunit": "^5.7 || ^7.3",
+ "squizlabs/php_codesniffer": "~2.3"
+ },
+ "suggest": {
+ "lcobucci/clock": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "compat/class-aliases.php",
+ "compat/json-exception-polyfill.php",
+ "compat/lcobucci-clock-polyfill.php"
+ ],
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Otávio Cobucci Oblonczyk",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "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",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/lcobucci",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-09-28T19:18:28+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "1.6.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2b8185c13bc9578367a5bf901881d1c1b5bbd09b",
+ "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "scrutinizer/ocular": "1.7.*"
+ },
+ "require-dev": {
+ "cebe/markdown": "~1.0",
+ "commonmark/commonmark.js": "0.29.2",
+ "erusev/parsedown": "~1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "~1.4",
+ "mikehaertl/php-shellcommand": "^1.4",
+ "phpstan/phpstan": "^0.12.90",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2",
+ "scrutinizer/ocular": "^1.5",
+ "symfony/finder": "^4.2"
+ },
+ "bin": [
+ "bin/commonmark"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "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://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-13T17:18:13+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "1.0.70",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/585824702f534f8d3cf7fab7225e8466cc4b7493",
+ "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^3.4 || ^4.0 || ^5.0 || ^6.0",
+ "phpunit/phpunit": "^5.7.26"
+ },
+ "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",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
}
},
"autoload": {
@@ -2433,40 +3305,56 @@
"sftp",
"storage"
],
- "time": "2017-03-22T15:43:14+00:00"
+ "support": {
+ "issues": "https://github.com/thephpleague/flysystem/issues",
+ "source": "https://github.com/thephpleague/flysystem/tree/1.0.70"
+ },
+ "funding": [
+ {
+ "url": "https://offset.earth/frankdejonge",
+ "type": "other"
+ }
+ ],
+ "time": "2020-07-26T07:20:36+00:00"
},
{
"name": "mccool/laravel-auto-presenter",
- "version": "4.3.0",
+ "version": "7.7.0",
"source": {
"type": "git",
"url": "https://github.com/laravel-auto-presenter/laravel-auto-presenter.git",
- "reference": "08ce32a41aa5d6c842b4cc19ae442e211cb3dd96"
+ "reference": "e139110a82c8a1573d4015b4f6d600d79e1d33e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel-auto-presenter/laravel-auto-presenter/zipball/08ce32a41aa5d6c842b4cc19ae442e211cb3dd96",
- "reference": "08ce32a41aa5d6c842b4cc19ae442e211cb3dd96",
+ "url": "https://api.github.com/repos/laravel-auto-presenter/laravel-auto-presenter/zipball/e139110a82c8a1573d4015b4f6d600d79e1d33e5",
+ "reference": "e139110a82c8a1573d4015b4f6d600d79e1d33e5",
"shasum": ""
},
"require": {
- "illuminate/container": "5.1.*|5.2.*|5.3.*",
- "illuminate/contracts": "5.1.*|5.2.*|5.3.*",
- "illuminate/events": "5.1.*|5.2.*|5.3.*",
- "illuminate/pagination": "5.1.*|5.2.*|5.3.*",
- "illuminate/support": "5.1.*|5.2.*|5.3.*",
- "illuminate/view": "5.1.*|5.2.*|5.3.*",
- "php": ">=5.5.9"
+ "illuminate/container": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
+ "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0",
+ "illuminate/events": "^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0",
+ "illuminate/pagination": "^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0",
+ "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0",
+ "illuminate/view": "^5.5 || ^6.0 || ^7.0 || ^8.0|| ^9.0",
+ "php": "^7.1.3 || ^8.0"
},
"require-dev": {
- "graham-campbell/testbench": "^3.1",
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.4 || ^3.0",
+ "graham-campbell/testbench": "^5.4",
+ "mockery/mockery": "^1.3.1",
+ "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.7"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.3-dev"
+ "dev-master": "7.7-dev"
+ },
+ "laravel": {
+ "providers": [
+ "McCool\\LaravelAutoPresenter\\AutoPresenterServiceProvider"
+ ]
}
},
"autoload": {
@@ -2481,11 +3369,13 @@
"authors": [
{
"name": "Shawn McCool",
- "email": "shawn@heybigname.com"
+ "email": "shawn@mccool.email",
+ "homepage": "https://github.com/ShawnMcCool"
},
{
"name": "Graham Campbell",
- "email": "graham@alt-three.com"
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
}
],
"description": "A system for auto-decorating models with presenter objects.",
@@ -2495,20 +3385,34 @@
"lpm",
"presenter"
],
- "time": "2016-05-01T15:29:13+00:00"
+ "support": {
+ "issues": "https://github.com/laravel-auto-presenter/laravel-auto-presenter/issues",
+ "source": "https://github.com/laravel-auto-presenter/laravel-auto-presenter/tree/7.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/mccool/laravel-auto-presenter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-09T09:14:24+00:00"
},
{
"name": "monolog/monolog",
- "version": "1.22.1",
+ "version": "1.27.1",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0"
+ "reference": "904713c5929655dc9b97288b69cfeedad610c9a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0",
- "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1",
+ "reference": "904713c5929655dc9b97288b69cfeedad610c9a1",
"shasum": ""
},
"require": {
@@ -2522,14 +3426,13 @@
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
"doctrine/couchdb": "~1.0@dev",
"graylog2/gelf-php": "~1.0",
- "jakub-onderka/php-parallel-lint": "0.9",
"php-amqplib/php-amqplib": "~2.4",
"php-console/php-console": "^3.1.3",
+ "phpstan/phpstan": "^0.12.59",
"phpunit/phpunit": "~4.5",
- "phpunit/phpunit-mock-objects": "2.3.0",
"ruflin/elastica": ">=0.90 <3.0",
"sentry/sentry": "^0.13",
- "swiftmailer/swiftmailer": "~5.3"
+ "swiftmailer/swiftmailer": "^5.3|^6.0"
},
"suggest": {
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
@@ -2545,11 +3448,6 @@
"sentry/sentry": "Allow sending log messages to a Sentry server"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
"Monolog\\": "src/Monolog"
@@ -2573,71 +3471,43 @@
"logging",
"psr-3"
],
- "time": "2017-03-13T07:08:03+00:00"
- },
- {
- "name": "mtdowling/cron-expression",
- "version": "v1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/mtdowling/cron-expression.git",
- "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad",
- "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.2"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.0|~5.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Cron\\": "src/Cron/"
- }
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/1.27.1"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "funding": [
{
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
}
],
- "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
- "keywords": [
- "cron",
- "schedule"
- ],
- "time": "2017-01-23T04:29:33+00:00"
+ "time": "2022-06-09T08:53:42+00:00"
},
{
"name": "mtdowling/jmespath.php",
- "version": "2.4.0",
+ "version": "2.6.1",
"source": {
"type": "git",
"url": "https://github.com/jmespath/jmespath.php.git",
- "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac"
+ "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
- "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
+ "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
+ "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "php": "^5.4 || ^7.0 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.17"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "composer/xdebug-handler": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^7.5.15"
},
"bin": [
"bin/jp.php"
@@ -2645,16 +3515,16 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "2.6-dev"
}
},
"autoload": {
- "psr-4": {
- "JmesPath\\": "src/"
- },
"files": [
"src/JmesPath.php"
- ]
+ ],
+ "psr-4": {
+ "JmesPath\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2672,39 +3542,51 @@
"json",
"jsonpath"
],
- "time": "2016-12-03T22:08:25+00:00"
+ "support": {
+ "issues": "https://github.com/jmespath/jmespath.php/issues",
+ "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1"
+ },
+ "time": "2021-06-14T00:11:39+00:00"
},
{
"name": "nesbot/carbon",
- "version": "1.22.1",
+ "version": "1.39.1",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
+ "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4be0c005164249208ce1b5ca633cd57bdd42ff33",
+ "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33",
"shasum": ""
},
"require": {
- "php": ">=5.3.0",
- "symfony/translation": "~2.6 || ~3.0"
+ "kylekatarnls/update-helper": "^1.1",
+ "php": ">=5.3.9",
+ "symfony/translation": "~2.6 || ~3.0 || ~4.0"
},
"require-dev": {
+ "composer/composer": "^1.2",
"friendsofphp/php-cs-fixer": "~2",
- "phpunit/phpunit": "~4.0 || ~5.0"
+ "phpunit/phpunit": "^4.8.35 || ^5.7"
},
+ "bin": [
+ "bin/upgrade-carbon"
+ ],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.23-dev"
+ "update-helper": "Carbon\\Upgrade",
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
}
},
"autoload": {
"psr-4": {
- "Carbon\\": "src/Carbon/"
+ "": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2725,37 +3607,92 @@
"datetime",
"time"
],
- "time": "2017-01-16T07:55:07+00:00"
+ "support": {
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
+ "source": "https://github.com/briannesbitt/Carbon"
+ },
+ "time": "2019-10-14T05:51:36+00:00"
},
{
"name": "nexmo/client",
- "version": "1.0.0-beta3",
+ "version": "1.9.1",
"source": {
"type": "git",
- "url": "https://github.com/Nexmo/nexmo-php.git",
- "reference": "83aa47336da9fa927ce62cb9fa3cbdaff1aeaaa0"
+ "url": "https://github.com/Nexmo/nexmo-php-complete.git",
+ "reference": "c6d11d953c8c5594590bb9ebaba9616e76948f93"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/83aa47336da9fa927ce62cb9fa3cbdaff1aeaaa0",
- "reference": "83aa47336da9fa927ce62cb9fa3cbdaff1aeaaa0",
+ "url": "https://api.github.com/repos/Nexmo/nexmo-php-complete/zipball/c6d11d953c8c5594590bb9ebaba9616e76948f93",
+ "reference": "c6d11d953c8c5594590bb9ebaba9616e76948f93",
"shasum": ""
},
"require": {
- "lcobucci/jwt": "^3.2",
- "php": ">=5.4",
- "php-http/client-implementation": "^1.0",
- "php-http/guzzle6-adapter": "^1.0",
- "zendframework/zend-diactoros": "^1.3"
- },
- "require-dev": {
- "php-http/mock-client": "^0.3.0",
- "phpunit/phpunit": "^5.3"
+ "nexmo/client-core": "^1.0",
+ "php": ">=5.6",
+ "php-http/guzzle6-adapter": "^1.0"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Nexmo\\": "src/"
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tim Lytle",
+ "email": "tim@nexmo.com",
+ "homepage": "http://twitter.com/tjlytle",
+ "role": "Developer"
+ },
+ {
+ "name": "Michael Heap",
+ "email": "michael.heap@vonage.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Lorna Mitchell",
+ "email": "lorna.mitchell@vonage.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Client for using Nexmo's API.",
+ "support": {
+ "email": "devrel@nexmo.com",
+ "source": "https://github.com/Nexmo/nexmo-php-complete/tree/1.9.1"
+ },
+ "time": "2019-11-26T15:25:11+00:00"
+ },
+ {
+ "name": "nexmo/client-core",
+ "version": "1.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Nexmo/nexmo-php.git",
+ "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/182d41a02ebd3e4be147baea45458ccfe2f528c4",
+ "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4",
+ "shasum": ""
+ },
+ "require": {
+ "lcobucci/jwt": "^3.2",
+ "php": ">=5.6",
+ "php-http/client-implementation": "^1.0",
+ "php-http/guzzle6-adapter": "^1.0",
+ "zendframework/zend-diactoros": "^1.8.4 || ^2.0"
+ },
+ "require-dev": {
+ "estahn/phpunit-json-assertions": "^1.0.0",
+ "php-http/mock-client": "^0.3.0",
+ "phpunit/phpunit": "^5.7",
+ "squizlabs/php_codesniffer": "^3.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Nexmo\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2771,28 +3708,33 @@
}
],
"description": "PHP Client for using Nexmo's API.",
- "time": "2016-09-14T03:43:04+00:00"
+ "support": {
+ "email": "devrel@nexmo.com",
+ "source": "https://github.com/Nexmo/nexmo-php/tree/1.8.1"
+ },
+ "time": "2019-05-13T20:27:43+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v3.0.5",
+ "version": "v4.17.1",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d"
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
- "reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
- "php": ">=5.5"
+ "php": ">=7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0|~5.0"
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
@@ -2800,7 +3742,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "4.9-dev"
}
},
"autoload": {
@@ -2822,36 +3764,103 @@
"parser",
"php"
],
- "time": "2017-03-05T18:23:57+00:00"
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
+ },
+ "time": "2023-08-13T19:53:39+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v2.0.10",
+ "name": "opis/closure",
+ "version": "3.6.3",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d"
+ "url": "https://github.com/opis/closure.git",
+ "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d",
- "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d",
+ "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad",
+ "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "php": "^5.4 || ^7.0 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "jeremeamia/superclosure": "^2.0",
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6.x-dev"
+ }
+ },
"autoload": {
"files": [
- "lib/random.php"
- ]
+ "functions.php"
+ ],
+ "psr-4": {
+ "Opis\\Closure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marius Sarca",
+ "email": "marius.sarca@gmail.com"
+ },
+ {
+ "name": "Sorin Sarca",
+ "email": "sarca_sorin@hotmail.com"
+ }
+ ],
+ "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+ "homepage": "https://opis.io/closure",
+ "keywords": [
+ "anonymous functions",
+ "closure",
+ "function",
+ "serializable",
+ "serialization",
+ "serialize"
+ ],
+ "support": {
+ "issues": "https://github.com/opis/closure/issues",
+ "source": "https://github.com/opis/closure/tree/3.6.3"
+ },
+ "time": "2022-01-27T09:35:39+00:00"
+ },
+ {
+ "name": "paragonie/constant_time_encoding",
+ "version": "v2.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7|^8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "vimeo/psalm": "^1|^2|^3|^4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2861,16 +3870,37 @@
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
}
],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
"keywords": [
- "csprng",
- "pseudorandom",
- "random"
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
],
- "time": "2017-03-13T16:27:32+00:00"
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/constant_time_encoding/issues",
+ "source": "https://github.com/paragonie/constant_time_encoding"
+ },
+ "time": "2022-06-14T06:56:20+00:00"
},
{
"name": "php-http/guzzle6-adapter",
@@ -2930,6 +3960,10 @@
"Guzzle",
"http"
],
+ "support": {
+ "issues": "https://github.com/php-http/guzzle6-adapter/issues",
+ "source": "https://github.com/php-http/guzzle6-adapter/tree/master"
+ },
"time": "2016-05-10T06:13:32+00:00"
},
{
@@ -2986,32 +4020,34 @@
"client",
"http"
],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/master"
+ },
"time": "2016-08-31T08:30:17+00:00"
},
{
"name": "php-http/promise",
- "version": "v1.0.0",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/promise.git",
- "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980"
+ "reference": "ef4905bfb492ff389eb7f12e26925a0f20073050"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980",
- "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/ef4905bfb492ff389eb7f12e26925a0f20073050",
+ "reference": "ef4905bfb492ff389eb7f12e26925a0f20073050",
"shasum": ""
},
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
"require-dev": {
- "henrikbjorn/phpspec-code-coverage": "^1.0",
- "phpspec/phpspec": "^2.4"
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Http\\Promise\\": "src/"
@@ -3022,13 +4058,13 @@
"MIT"
],
"authors": [
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com"
- },
{
"name": "Joel Wurtz",
"email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
}
],
"description": "Promise used for asynchronous HTTP requests",
@@ -3036,45 +4072,51 @@
"keywords": [
"promise"
],
- "time": "2016-01-26T13:27:02+00:00"
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.2.0"
+ },
+ "time": "2023-10-24T09:20:26+00:00"
},
{
"name": "pragmarx/google2fa",
- "version": "v0.7.1",
+ "version": "v5.0.0",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa.git",
- "reference": "908678ba9b26cf8ecd7ddca6bfd86afc5b4874df"
+ "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/908678ba9b26cf8ecd7ddca6bfd86afc5b4874df",
- "reference": "908678ba9b26cf8ecd7ddca6bfd86afc5b4874df",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/17c969c82f427dd916afe4be50bafc6299aef1b4",
+ "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4",
"shasum": ""
},
"require": {
- "christian-riesen/base32": "~1.0",
- "php": ">=5.3.7",
- "simplesoftwareio/simple-qrcode": "1.3.*"
+ "paragonie/constant_time_encoding": "~1.0|~2.0",
+ "paragonie/random_compat": ">=1",
+ "php": ">=5.4",
+ "symfony/polyfill-php56": "~1.2"
},
"require-dev": {
- "phpspec/phpspec": "~2.1"
+ "phpunit/phpunit": "~4|~5|~6"
},
"type": "library",
"extra": {
"component": "package",
- "frameworks": [
- "Laravel"
- ]
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
},
"autoload": {
"psr-4": {
- "PragmaRX\\Google2FA\\": "src/"
+ "PragmaRX\\Google2FA\\": "src/",
+ "PragmaRX\\Google2FA\\Tests\\": "tests/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
@@ -3085,25 +4127,29 @@
],
"description": "A One Time Password Authentication package, compatible with Google Authenticator.",
"keywords": [
+ "2fa",
"Authentication",
"Two Factor Authentication",
- "google2fa",
- "laravel"
+ "google2fa"
],
- "time": "2015-11-07T13:57:42+00:00"
+ "support": {
+ "issues": "https://github.com/antonioribeiro/google2fa/issues",
+ "source": "https://github.com/antonioribeiro/google2fa/tree/master"
+ },
+ "time": "2019-03-19T22:44:16+00:00"
},
{
"name": "predis/predis",
- "version": "v1.1.1",
+ "version": "v1.1.10",
"source": {
"type": "git",
- "url": "https://github.com/nrk/predis.git",
- "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
+ "url": "https://github.com/predis/predis.git",
+ "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1",
- "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
+ "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e",
+ "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e",
"shasum": ""
},
"require": {
@@ -3130,17 +4176,141 @@
{
"name": "Daniele Alessandri",
"email": "suppakilla@gmail.com",
- "homepage": "http://clorophilla.net"
+ "homepage": "http://clorophilla.net",
+ "role": "Creator & Maintainer"
+ },
+ {
+ "name": "Till Krüss",
+ "homepage": "https://till.im",
+ "role": "Maintainer"
}
],
"description": "Flexible and feature-complete Redis client for PHP and HHVM",
- "homepage": "http://github.com/nrk/predis",
+ "homepage": "http://github.com/predis/predis",
"keywords": [
"nosql",
"predis",
"redis"
],
- "time": "2016-06-16T16:22:20+00:00"
+ "support": {
+ "issues": "https://github.com/predis/predis/issues",
+ "source": "https://github.com/predis/predis/tree/v1.1.10"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/tillkruss",
+ "type": "github"
+ }
+ ],
+ "time": "2022-01-05T17:46:08+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/master"
+ },
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
},
{
"name": "psr/http-message",
@@ -3190,20 +4360,23 @@
"request",
"response"
],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/log",
- "version": "1.0.2",
+ "version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"shasum": ""
},
"require": {
@@ -3212,7 +4385,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -3227,7 +4400,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
@@ -3237,58 +4410,37 @@
"psr",
"psr-3"
],
- "time": "2016-10-10T12:19:37+00:00"
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
+ },
+ "time": "2021-05-03T11:20:27+00:00"
},
{
- "name": "psy/psysh",
- "version": "v0.8.3",
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/bobthecow/psysh.git",
- "reference": "1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e"
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e",
- "reference": "1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
"shasum": ""
},
"require": {
- "dnoegel/php-xdg-base-dir": "0.1",
- "jakub-onderka/php-console-highlighter": "0.3.*",
- "nikic/php-parser": "~1.3|~2.0|~3.0",
- "php": ">=5.3.9",
- "symfony/console": "~2.3.10|^2.4.2|~3.0",
- "symfony/var-dumper": "~2.7|~3.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "~1.11",
- "hoa/console": "~3.16|~1.14",
- "phpunit/phpunit": "~4.4|~5.0",
- "symfony/finder": "~2.1|~3.0"
- },
- "suggest": {
- "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
- "ext-pdo-sqlite": "The doc command requires SQLite to work.",
- "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
- "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
- "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+ "php": ">=5.3.0"
},
- "bin": [
- "bin/psysh"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-develop": "0.9.x-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
- "files": [
- "src/Psy/functions.php"
- ],
"psr-4": {
- "Psy\\": "src/Psy/"
+ "Psr\\SimpleCache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3297,73 +4449,74 @@
],
"authors": [
{
- "name": "Justin Hileman",
- "email": "justin@justinhileman.info",
- "homepage": "http://justinhileman.com"
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
}
],
- "description": "An interactive shell for modern PHP.",
- "homepage": "http://psysh.org",
+ "description": "Common interfaces for simple caching",
"keywords": [
- "REPL",
- "console",
- "interactive",
- "shell"
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
],
- "time": "2017-03-19T21:40:44+00:00"
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/master"
+ },
+ "time": "2017-10-23T01:57:42+00:00"
},
{
- "name": "ramsey/uuid",
- "version": "3.6.0",
+ "name": "psy/psysh",
+ "version": "v0.9.12",
"source": {
"type": "git",
- "url": "https://github.com/ramsey/uuid.git",
- "reference": "0b7bdfb180e72c8d76e75a649ced67e392201458"
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "90da7f37568aee36b116a030c5f99c915267edd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/0b7bdfb180e72c8d76e75a649ced67e392201458",
- "reference": "0b7bdfb180e72c8d76e75a649ced67e392201458",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4",
+ "reference": "90da7f37568aee36b116a030c5f99c915267edd4",
"shasum": ""
},
"require": {
- "paragonie/random_compat": "^1.0|^2.0",
- "php": "^5.4 || ^7.0"
- },
- "replace": {
- "rhumsaa/uuid": "self.version"
+ "dnoegel/php-xdg-base-dir": "0.1.*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*",
+ "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0",
+ "php": ">=5.4.0",
+ "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0",
+ "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0"
},
"require-dev": {
- "apigen/apigen": "^4.1",
- "codeception/aspect-mock": "1.0.0",
- "doctrine/annotations": "~1.2.0",
- "goaop/framework": "1.0.0-alpha.2",
- "ircmaxell/random-lib": "^1.1",
- "jakub-onderka/php-parallel-lint": "^0.9.0",
- "mockery/mockery": "^0.9.4",
- "moontoast/math": "^1.1",
- "php-mock/php-mock-phpunit": "^0.3|^1.1",
- "phpunit/phpunit": "^4.7|>=5.0 <5.4",
- "satooshi/php-coveralls": "^0.6.1",
- "squizlabs/php_codesniffer": "^2.3"
+ "bamarni/composer-bin-plugin": "^1.2",
+ "hoa/console": "~2.15|~3.16",
+ "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0"
},
"suggest": {
- "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
- "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
- "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
- "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
- "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."
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+ "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
},
+ "bin": [
+ "bin/psysh"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.x-dev"
+ "dev-develop": "0.9.x-dev"
}
},
"autoload": {
+ "files": [
+ "src/functions.php"
+ ],
"psr-4": {
- "Ramsey\\Uuid\\": "src/"
+ "Psy\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3372,55 +4525,51 @@
],
"authors": [
{
- "name": "Marijn Huizendveld",
- "email": "marijn.huizendveld@gmail.com"
- },
- {
- "name": "Thibaud Fabre",
- "email": "thibaud@aztech.io"
- },
- {
- "name": "Ben Ramsey",
- "email": "ben@benramsey.com",
- "homepage": "https://benramsey.com"
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
}
],
- "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": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
"keywords": [
- "guid",
- "identifier",
- "uuid"
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
],
- "time": "2017-03-18T15:38:09+00:00"
+ "support": {
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.9.12"
+ },
+ "time": "2019-12-06T14:19:43+00:00"
},
{
- "name": "roumen/feed",
- "version": "v2.10.5",
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
"source": {
"type": "git",
- "url": "https://github.com/RoumenDamianoff/laravel-feed.git",
- "reference": "ffbdb58f2ef41c7cb5d3bcd0aec2273e8eabc58b"
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/RoumenDamianoff/laravel-feed/zipball/ffbdb58f2ef41c7cb5d3bcd0aec2273e8eabc58b",
- "reference": "ffbdb58f2ef41c7cb5d3bcd0aec2273e8eabc58b",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
- "illuminate/support": "^5.0",
- "php": ">=5.5.9"
+ "php": ">=5.6"
},
"require-dev": {
- "orchestra/testbench": "^3.0",
- "phpunit/phpunit": "^4.8"
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Roumen\\Feed": "src/"
- }
+ "files": [
+ "src/getallheaders.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3428,51 +4577,71 @@
],
"authors": [
{
- "name": "Roumen Damianoff",
- "email": "roumen@crimsson.com",
- "homepage": "https://roumen.it",
- "role": "Developer"
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
}
],
- "description": "A simple feed generator for Laravel.",
- "homepage": "https://roumen.it/projects/laravel-feed",
- "keywords": [
- "atom",
- "feed",
- "generator",
- "laravel",
- "rss"
- ],
- "time": "2017-03-22T17:31:36+00:00"
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
},
{
- "name": "simplesoftwareio/simple-qrcode",
- "version": "1.3.3",
+ "name": "ramsey/uuid",
+ "version": "3.9.7",
"source": {
"type": "git",
- "url": "https://github.com/SimpleSoftwareIO/simple-qrcode.git",
- "reference": "17c5e45c79c40f717d4bc08cf5e568f29ebf9333"
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "dc75aa439eb4c1b77f5379fd958b3dc0e6014178"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/SimpleSoftwareIO/simple-qrcode/zipball/17c5e45c79c40f717d4bc08cf5e568f29ebf9333",
- "reference": "17c5e45c79c40f717d4bc08cf5e568f29ebf9333",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/dc75aa439eb4c1b77f5379fd958b3dc0e6014178",
+ "reference": "dc75aa439eb4c1b77f5379fd958b3dc0e6014178",
"shasum": ""
},
"require": {
- "bacon/bacon-qr-code": "1.0.*",
- "ext-gd": "*",
- "illuminate/support": ">=4.2.0",
- "php": ">=5.4.0"
+ "ext-json": "*",
+ "paragonie/random_compat": "^1 | ^2 | ^9.99.99",
+ "php": "^5.4 | ^7.0 | ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
},
"require-dev": {
- "mockery/mockery": "0.9.*",
- "phpunit/phpunit": "4.7.*"
+ "codeception/aspect-mock": "^1 | ^2",
+ "doctrine/annotations": "^1.2",
+ "goaop/framework": "1.0.0-alpha.2 | ^1 | >=2.1.0 <=2.3.2",
+ "mockery/mockery": "^0.9.11 | ^1",
+ "moontoast/math": "^1.1",
+ "nikic/php-parser": "<=4.5.0",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock-phpunit": "^0.3 | ^1.1 | ^2.6",
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpunit/phpunit": ">=4.8.36 <9.0.0 | >=9.3.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "yoast/phpunit-polyfills": "^1.0"
+ },
+ "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).",
+ "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",
"autoload": {
- "psr-0": {
- "SimpleSoftwareIO\\QrCode\\": "src"
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3481,46 +4650,76 @@
],
"authors": [
{
- "name": "Simple Software LLC",
- "email": "support@simplesoftware.io"
+ "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": "Simple QrCode is a QR code generator made for Laravel.",
- "homepage": "http://www.simplesoftware.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",
"keywords": [
- "Simple",
- "generator",
- "laravel",
- "qrcode",
- "wrapper"
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "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"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+ "type": "tidelift"
+ }
],
- "time": "2016-01-31T02:09:25+00:00"
+ "time": "2022-12-19T21:55:10+00:00"
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v5.4.6",
+ "version": "v6.3.0",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e"
+ "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e",
- "reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c",
+ "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "egulias/email-validator": "^2.0|^3.1",
+ "php": ">=7.0.0",
+ "symfony/polyfill-iconv": "^1.0",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
},
"require-dev": {
- "mockery/mockery": "~0.9.1",
- "symfony/phpunit-bridge": "~3.2"
+ "mockery/mockery": "^1.0",
+ "symfony/phpunit-bridge": "^4.4|^5.4"
+ },
+ "suggest": {
+ "ext-intl": "Needed to support internationalized email addresses"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.4-dev"
+ "dev-master": "6.2-dev"
}
},
"autoload": {
@@ -3542,52 +4741,141 @@
}
],
"description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "http://swiftmailer.org",
+ "homepage": "https://swiftmailer.symfony.com",
"keywords": [
"email",
"mail",
"mailer"
],
- "time": "2017-02-13T07:52:53+00:00"
+ "support": {
+ "issues": "https://github.com/swiftmailer/swiftmailer/issues",
+ "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
+ "type": "tidelift"
+ }
+ ],
+ "abandoned": "symfony/mailer",
+ "time": "2021-10-18T15:26:12+00:00"
},
{
"name": "symfony/console",
- "version": "v3.1.10",
+ "version": "v4.4.49",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52"
+ "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/047f16485d68c083bd5d9b73ff16f9cb9c1a9f52",
- "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52",
+ "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9",
+ "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/debug": "~2.8|~3.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2"
+ },
+ "conflict": {
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/event-dispatcher": "<4.3|>=5",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<3.3"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/event-dispatcher": "~2.8|~3.0",
- "symfony/process": "~2.8|~3.0"
+ "psr/log": "^1|^2",
+ "symfony/config": "^3.4|^4.0|^5.0",
+ "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+ "symfony/event-dispatcher": "^4.3",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^3.4|^4.0|^5.0",
+ "symfony/var-dumper": "^4.3|^5.0"
},
"suggest": {
"psr/log": "For using the console logger",
"symfony/event-dispatcher": "",
+ "symfony/lock": "",
"symfony/process": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v4.4.49"
+ },
+ "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": "2022-11-05T17:10:16+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v4.4.44",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "bd0a6737e48de45b4b0b7b6fc98c78404ddceaed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/bd0a6737e48de45b4b0b7b6fc98c78404ddceaed",
+ "reference": "bd0a6737e48de45b4b0b7b6fc98c78404ddceaed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/polyfill-php80": "^1.16"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Console\\": ""
+ "Symfony\\Component\\CssSelector\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3602,49 +4890,133 @@
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Console Component",
+ "description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
- "time": "2017-01-08T20:43:43+00:00"
+ "support": {
+ "source": "https://github.com/symfony/css-selector/tree/v4.4.44"
+ },
+ "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": "2022-06-27T13:16:42+00:00"
},
{
"name": "symfony/debug",
- "version": "v3.1.10",
+ "version": "v4.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85"
+ "reference": "1a692492190773c5310bc7877cb590c04c2f05be"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/c6661361626b3cf5cf2089df98b3b5006a197e85",
- "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be",
+ "reference": "1a692492190773c5310bc7877cb590c04c2f05be",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "psr/log": "~1.0"
+ "php": ">=7.1.3",
+ "psr/log": "^1|^2|^3"
},
"conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ "symfony/http-kernel": "<3.4"
},
"require-dev": {
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/http-kernel": "~2.8|~3.0"
+ "symfony/http-kernel": "^3.4|^4.0|^5.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/debug/tree/v4.4.44"
+ },
+ "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"
}
+ ],
+ "abandoned": "symfony/error-handler",
+ "time": "2022-07-28T16:29:46+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v4.4.44",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "be731658121ef2d8be88f3a1ec938148a9237291"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291",
+ "reference": "be731658121ef2d8be88f3a1ec938148a9237291",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "psr/log": "^1|^2|^3",
+ "symfony/debug": "^4.4.5",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "require-dev": {
+ "symfony/http-kernel": "^4.4|^5.0",
+ "symfony/serializer": "^4.4|^5.0"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Debug\\": ""
+ "Symfony\\Component\\ErrorHandler\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3664,44 +5036,68 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Debug Component",
+ "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
- "time": "2017-01-28T00:04:57+00:00"
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v4.4.44"
+ },
+ "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": "2022-07-28T16:29:46+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v3.2.6",
+ "version": "v4.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d"
+ "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d",
- "reference": "b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
+ "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=7.1.3",
+ "symfony/event-dispatcher-contracts": "^1.1",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "1.1"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/dependency-injection": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0"
+ "psr/log": "^1|^2|^3",
+ "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",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/stopwatch": "^3.4|^4.0|^5.0"
},
"suggest": {
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.2-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\EventDispatcher\\": ""
@@ -3724,40 +5120,856 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony EventDispatcher Component",
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
- "time": "2017-02-21T09:12:04+00:00"
- },
- {
- "name": "symfony/finder",
- "version": "v3.1.10",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44"
+ },
+ "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": "2022-07-20T09:59:04+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v1.1.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e",
+ "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3"
+ },
+ "suggest": {
+ "psr/event-dispatcher": "",
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "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": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13"
+ },
+ "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": "2022-01-02T09:41:36+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v4.4.44",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "66bd787edb5e42ff59d3523f623895af05043e4f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/66bd787edb5e42ff59d3523f623895af05043e4f",
+ "reference": "66bd787edb5e42ff59d3523f623895af05043e4f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v4.4.44"
+ },
+ "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": "2022-07-29T07:35:46+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v1.1.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "59f37624a82635962f04c98f31aed122e539a89e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/59f37624a82635962f04c98f31aed122e539a89e",
+ "reference": "59f37624a82635962f04c98f31aed122e539a89e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3"
+ },
+ "suggest": {
+ "symfony/http-client-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ }
+ },
+ "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": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v1.1.13"
+ },
+ "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": "2022-04-11T14:52:04+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v4.4.49",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "191413c7b832c015bb38eae963f2e57498c3c173"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173",
+ "reference": "191413c7b832c015bb38eae963f2e57498c3c173",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/mime": "^4.3|^5.0",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "predis/predis": "~1.0",
+ "symfony/expression-language": "^3.4|^4.0|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v4.4.49"
+ },
+ "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": "2022-11-04T16:17:57+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v4.4.50",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "aa6df6c045f034aa13ac752fc234bb300b9488ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/aa6df6c045f034aa13ac752fc234bb300b9488ef",
+ "reference": "aa6df6c045f034aa13ac752fc234bb300b9488ef",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "psr/log": "^1|^2",
+ "symfony/error-handler": "^4.4",
+ "symfony/event-dispatcher": "^4.4",
+ "symfony/http-client-contracts": "^1.1|^2",
+ "symfony/http-foundation": "^4.4.30|^5.3.7",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php73": "^1.9",
+ "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"
+ },
+ "provide": {
+ "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/translation-contracts": "^1.1|^2",
+ "twig/twig": "^1.43|^2.13|^3.0.4"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "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/v4.4.50"
+ },
+ "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": "2023-02-01T08:01:31+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v4.4.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "0eaf33cd6d1b3eaa50e7bc48b17f6e45789df35d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/0eaf33cd6d1b3eaa50e7bc48b17f6e45789df35d",
+ "reference": "0eaf33cd6d1b3eaa50e7bc48b17f6e45789df35d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "egulias/email-validator": "~3.0.0",
+ "symfony/mailer": "<4.4"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3.1",
+ "symfony/dependency-injection": "^3.4|^4.1|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows manipulating MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mime/tree/v4.4.47"
+ },
+ "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": "2022-10-03T15:15:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-iconv",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-iconv.git",
+ "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1",
+ "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-iconv": "*"
+ },
+ "suggest": {
+ "ext-iconv": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Iconv\\": ""
+ }
+ },
+ "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 the Iconv extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "iconv",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-iconv/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
+ "reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "symfony/polyfill-intl-normalizer": "^1.10",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.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": "2023-01-26T09:30:37+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "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 for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php56",
+ "version": "v1.20.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "59687a255d1562f2c17b012418273862083d85f7"
+ "url": "https://github.com/symfony/polyfill-php56.git",
+ "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/59687a255d1562f2c17b012418273862083d85f7",
- "reference": "59687a255d1562f2c17b012418273862083d85f7",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+ "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=7.1"
},
- "type": "library",
+ "type": "metapackage",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Finder\\": ""
+ "dev-main": "1.20-dev"
},
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3765,52 +5977,75 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Finder Component",
+ "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
"homepage": "https://symfony.com",
- "time": "2017-01-02T20:31:54+00:00"
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.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": "2020-10-23T14:02:19+00:00"
},
{
- "name": "symfony/http-foundation",
- "version": "v3.1.10",
+ "name": "symfony/polyfill-php72",
+ "version": "v1.28.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-foundation.git",
- "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0"
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cef0ad49a2e90455cfc649522025b5a2929648c0",
- "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
+ "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.1"
- },
- "require-dev": {
- "symfony/expression-language": "~2.8|~3.0"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Component\\HttpFoundation\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Polyfill\\Php72\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3818,80 +6053,77 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpFoundation Component",
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
- "time": "2017-01-08T20:43:43+00:00"
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
},
{
- "name": "symfony/http-kernel",
- "version": "v3.1.10",
+ "name": "symfony/polyfill-php73",
+ "version": "v1.28.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-kernel.git",
- "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13"
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c830387dec1b48c100473d10a6a356c3c3ae2a13",
- "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
+ "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "psr/log": "~1.0",
- "symfony/debug": "~2.8|~3.0",
- "symfony/event-dispatcher": "~2.8|~3.0",
- "symfony/http-foundation": "~2.8.13|~3.1.6|~3.2"
- },
- "conflict": {
- "symfony/config": "<2.8"
- },
- "require-dev": {
- "symfony/browser-kit": "~2.8|~3.0",
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/console": "~2.8|~3.0",
- "symfony/css-selector": "~2.8|~3.0",
- "symfony/dependency-injection": "~2.8|~3.0",
- "symfony/dom-crawler": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/finder": "~2.8|~3.0",
- "symfony/process": "~2.8|~3.0",
- "symfony/routing": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0",
- "symfony/templating": "~2.8|~3.0",
- "symfony/translation": "~2.8|~3.0",
- "symfony/var-dumper": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/browser-kit": "",
- "symfony/class-loader": "",
- "symfony/config": "",
- "symfony/console": "",
- "symfony/dependency-injection": "",
- "symfony/finder": "",
- "symfony/var-dumper": ""
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Component\\HttpKernel\\": ""
+ "Symfony\\Polyfill\\Php73\\": ""
},
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3900,50 +6132,77 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpKernel Component",
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
- "time": "2017-01-28T02:53:17+00:00"
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.3.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.28.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
- "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
"files": [
"bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3951,6 +6210,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -3960,47 +6223,58 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
- "mbstring",
"polyfill",
"portable",
"shim"
],
- "time": "2016-11-14T01:06:16+00:00"
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.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": "2023-01-26T09:26:14+00:00"
},
{
- "name": "symfony/polyfill-php56",
- "version": "v1.3.0",
+ "name": "symfony/process",
+ "version": "v4.4.44",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "5cee9cdc4f7805e2699d9fd66991a0e6df8252a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/1dd42b9b89556f18092f3d1ada22cb05ac85383c",
- "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c",
+ "url": "https://api.github.com/repos/symfony/process/zipball/5cee9cdc4f7805e2699d9fd66991a0e6df8252a2",
+ "reference": "5cee9cdc4f7805e2699d9fd66991a0e6df8252a2",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "symfony/polyfill-util": "~1.0"
+ "php": ">=7.1.3",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
- },
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Php56\\": ""
+ "Symfony\\Component\\Process\\": ""
},
- "files": [
- "bootstrap.php"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -4009,51 +6283,82 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v4.4.44"
+ },
+ "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": "2016-11-14T01:06:16+00:00"
+ "time": "2022-06-27T13:16:42+00:00"
},
{
- "name": "symfony/polyfill-util",
- "version": "v1.3.0",
+ "name": "symfony/routing",
+ "version": "v4.4.44",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-util.git",
- "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb"
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/746bce0fca664ac0a575e465f65c6643faddf7fb",
- "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/f7751fd8b60a07f3f349947a309b5bdfce22d6ae",
+ "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1.3",
+ "symfony/polyfill-php80": "^1.16"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
+ "conflict": {
+ "symfony/config": "<4.2",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.10.4",
+ "psr/log": "^1|^2|^3",
+ "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"
},
+ "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",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Polyfill\\Util\\": ""
- }
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -4061,54 +6366,76 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony utilities for portability of PHP codes",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
"keywords": [
- "compat",
- "compatibility",
- "polyfill",
- "shim"
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v4.4.44"
+ },
+ "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": "2016-11-14T01:06:16+00:00"
+ "time": "2022-07-20T09:59:04+00:00"
},
{
- "name": "symfony/process",
- "version": "v3.1.10",
+ "name": "symfony/service-contracts",
+ "version": "v1.1.13",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "2605753c5f8c531623d24d002825ebb1d6a22248"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/2605753c5f8c531623d24d002825ebb1d6a22248",
- "reference": "2605753c5f8c531623d24d002825ebb1d6a22248",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/afa00c500c2d6aea6e3b2f4862355f507bc5ebb4",
+ "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=7.1.3",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "1.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Contracts\\Service\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -4116,64 +6443,92 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Process Component",
+ "description": "Generic abstractions related to writing services",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:13:55+00:00"
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v1.1.13"
+ },
+ "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": "2022-05-27T14:01:05+00:00"
},
{
- "name": "symfony/routing",
- "version": "v3.1.10",
+ "name": "symfony/translation",
+ "version": "v4.4.47",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a"
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/f25581d4eb0a82962c291917f826166f0dcd8a9a",
- "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/45036b1d53accc48fe9bab71ccd86d57eba0dd94",
+ "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/translation-contracts": "^1.1.6|^2"
},
"conflict": {
- "symfony/config": "<2.8"
+ "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"
},
"require-dev": {
- "doctrine/annotations": "~1.0",
- "doctrine/common": "~2.2",
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/http-foundation": "~2.8|~3.0",
- "symfony/yaml": "~2.8|~3.0"
+ "psr/log": "^1|^2|^3",
+ "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/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^3.4|^4.0|^5.0"
},
"suggest": {
- "doctrine/annotations": "For using the annotation loader",
- "symfony/config": "For using the all-in-one router or any loader",
- "symfony/dependency-injection": "For loading routes from a service",
- "symfony/expression-language": "For using expression matching",
- "symfony/http-foundation": "For using a Symfony Request object",
- "symfony/yaml": "For using the YAML loader"
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
"autoload": {
"psr-4": {
- "Symfony\\Component\\Routing\\": ""
+ "Symfony\\Component\\Translation\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -4193,61 +6548,61 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Routing Component",
+ "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
- "keywords": [
- "router",
- "routing",
- "uri",
- "url"
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v4.4.47"
+ },
+ "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": "2017-01-28T00:04:57+00:00"
+ "time": "2022-10-03T15:15:11+00:00"
},
{
- "name": "symfony/translation",
- "version": "v3.1.10",
+ "name": "symfony/translation-contracts",
+ "version": "v1.1.13",
"source": {
"type": "git",
- "url": "https://github.com/symfony/translation.git",
- "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45"
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "7462e5c4cb8b9cd152f992e8f10963b5641921f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/d5a20fab5f63f44c233c69b3041c3cb1d4945e45",
- "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/7462e5c4cb8b9cd152f992e8f10963b5641921f6",
+ "reference": "7462e5c4cb8b9cd152f992e8f10963b5641921f6",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "symfony/config": "<2.8"
- },
- "require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/intl": "~2.8|~3.0",
- "symfony/yaml": "~2.8|~3.0"
+ "php": ">=7.1.3"
},
"suggest": {
- "psr/log": "To use logging capability in translator",
- "symfony/config": "",
- "symfony/yaml": ""
+ "symfony/translation-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-main": "1.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"psr-4": {
- "Symfony\\Component\\Translation\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Contracts\\Translation\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -4255,48 +6610,82 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Translation Component",
+ "description": "Generic abstractions related to translation",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:01:39+00:00"
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v1.1.13"
+ },
+ "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": "2022-06-27T13:16:42+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v3.1.10",
+ "version": "v4.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9"
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/16df11647e5b992d687cb4eeeb9a882d5f5c26b9",
- "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63",
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php72": "~1.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/console": "<3.4"
},
"require-dev": {
- "twig/twig": "~1.20|~2.0"
+ "ext-iconv": "*",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^1.43|^2.13|^3.0.4"
},
"suggest": {
- "ext-symfony_debug": ""
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
"autoload": {
"files": [
"Resources/functions/dump.php"
@@ -4322,45 +6711,120 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
"homepage": "https://symfony.com",
"keywords": [
"debug",
"dump"
],
- "time": "2017-01-24T13:02:38+00:00"
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v4.4.47"
+ },
+ "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": "2022-10-03T15:15:11+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "2.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c",
+ "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Tijs Verkoyen",
+ "email": "css_to_inline_styles@verkoyen.eu",
+ "role": "Developer"
+ }
+ ],
+ "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+ "support": {
+ "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6"
+ },
+ "time": "2023-01-03T09:29:04+00:00"
},
{
"name": "twig/twig",
- "version": "v1.33.0",
+ "version": "v2.15.5",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "05cf49921b13f6f01d3cfdf9018cfa7a8086fd5a"
+ "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/05cf49921b13f6f01d3cfdf9018cfa7a8086fd5a",
- "reference": "05cf49921b13f6f01d3cfdf9018cfa7a8086fd5a",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
+ "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e",
"shasum": ""
},
"require": {
- "php": ">=5.2.7"
+ "php": ">=7.1.3",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3",
+ "symfony/polyfill-php72": "^1.8"
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/debug": "~2.7",
- "symfony/phpunit-bridge": "~3.3@dev"
+ "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.33-dev"
+ "dev-master": "2.15-dev"
}
},
"autoload": {
"psr-0": {
"Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4374,48 +6838,68 @@
"homepage": "http://fabien.potencier.org",
"role": "Lead Developer"
},
+ {
+ "name": "Twig Team",
+ "role": "Contributors"
+ },
{
"name": "Armin Ronacher",
"email": "armin.ronacher@active-4.com",
"role": "Project Founder"
- },
- {
- "name": "Twig Team",
- "homepage": "http://twig.sensiolabs.org/contributors",
- "role": "Contributors"
}
],
"description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "http://twig.sensiolabs.org",
+ "homepage": "https://twig.symfony.com",
"keywords": [
"templating"
],
- "time": "2017-03-22T15:40:09+00:00"
+ "support": {
+ "issues": "https://github.com/twigphp/Twig/issues",
+ "source": "https://github.com/twigphp/Twig/tree/v2.15.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-03T17:49:41+00:00"
},
{
"name": "vlucas/phpdotenv",
- "version": "v2.4.0",
+ "version": "v2.6.9",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c"
+ "reference": "2e93cc98e2e8e869f8d9cfa61bb3a99ba4fc4141"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
- "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2e93cc98e2e8e869f8d9cfa61bb3a99ba4fc4141",
+ "reference": "2e93cc98e2e8e869f8d9cfa61bb3a99ba4fc4141",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "php": "^5.3.9 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.17"
},
"require-dev": {
- "phpunit/phpunit": "^4.8 || ^5.0"
+ "ext-filter": "*",
+ "ext-pcre": "*",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator.",
+ "ext-pcre": "Required to use most of the library."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.6-dev"
}
},
"autoload": {
@@ -4425,13 +6909,18 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause-Attribution"
+ "BSD-3-Clause"
],
"authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
{
"name": "Vance Lucas",
"email": "vance@vancelucas.com",
- "homepage": "http://www.vancelucas.com"
+ "homepage": "https://github.com/vlucas"
}
],
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
@@ -4440,92 +6929,126 @@
"env",
"environment"
],
- "time": "2016-09-01T10:05:43+00:00"
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v2.6.9"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-12-12T22:59:22+00:00"
},
{
"name": "zendframework/zend-diactoros",
- "version": "1.3.10",
+ "version": "2.2.1",
"source": {
"type": "git",
"url": "https://github.com/zendframework/zend-diactoros.git",
- "reference": "83e8d98b9915de76c659ce27d683c02a0f99fa90"
+ "reference": "de5847b068362a88684a55b0dbb40d85986cfa52"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/83e8d98b9915de76c659ce27d683c02a0f99fa90",
- "reference": "83e8d98b9915de76c659ce27d683c02a0f99fa90",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/de5847b068362a88684a55b0dbb40d85986cfa52",
+ "reference": "de5847b068362a88684a55b0dbb40d85986cfa52",
"shasum": ""
},
"require": {
- "php": "^5.4 || ^7.0",
- "psr/http-message": "~1.0"
+ "php": "^7.1",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0"
},
"provide": {
- "psr/http-message-implementation": "~1.0.0"
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.6 || ^5.5",
+ "ext-curl": "*",
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "http-interop/http-factory-tests": "^0.5.0",
+ "php-http/psr7-integration-tests": "dev-master",
+ "phpunit/phpunit": "^7.0.2",
"zendframework/zend-coding-standard": "~1.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev",
- "dev-develop": "1.4-dev"
+ "dev-master": "2.1.x-dev",
+ "dev-develop": "2.2.x-dev",
+ "dev-release-1.8": "1.8.x-dev"
}
},
"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"
+ ],
"psr-4": {
"Zend\\Diactoros\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-2-Clause"
+ "BSD-3-Clause"
],
"description": "PSR HTTP Message implementations",
- "homepage": "https://github.com/zendframework/zend-diactoros",
"keywords": [
"http",
"psr",
"psr-7"
],
- "time": "2017-01-23T04:53:24+00:00"
+ "support": {
+ "docs": "https://docs.zendframework.com/zend-diactoros/",
+ "forum": "https://discourse.zendframework.com/c/questions/exprssive",
+ "issues": "https://github.com/zendframework/zend-diactoros/issues",
+ "rss": "https://github.com/zendframework/zend-diactoros/releases.atom",
+ "slack": "https://zendframework-slack.herokuapp.com",
+ "source": "https://github.com/zendframework/zend-diactoros"
+ },
+ "abandoned": "laminas/laminas-diactoros",
+ "time": "2019-11-13T19:16:13+00:00"
}
],
"packages-dev": [
{
"name": "alt-three/testbench",
- "version": "v1.11.3",
+ "version": "5.0.x-dev",
"source": {
"type": "git",
"url": "https://github.com/AltThree/TestBench.git",
- "reference": "41921bae1a2228785fa54dc3b2fa206e484e5f79"
+ "reference": "246d9744ec1cde265e5ea40c7cd4eebd5577b601"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/AltThree/TestBench/zipball/41921bae1a2228785fa54dc3b2fa206e484e5f79",
- "reference": "41921bae1a2228785fa54dc3b2fa206e484e5f79",
+ "url": "https://api.github.com/repos/AltThree/TestBench/zipball/246d9744ec1cde265e5ea40c7cd4eebd5577b601",
+ "reference": "246d9744ec1cde265e5ea40c7cd4eebd5577b601",
"shasum": ""
},
"require": {
- "graham-campbell/testbench-core": "^1.1",
- "php": ">=5.5.9"
+ "graham-campbell/testbench-core": "^3.2",
+ "php": "^7.0 || ^8.0"
},
"require-dev": {
- "nikic/php-parser": "^2.0|^3.0",
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.4 || ^3.0",
+ "phpunit/phpunit": "^6.5 || ^7.5 || ^8.4 || ^9.0"
},
"suggest": {
- "laravel/framework": "Enables the use of every trait.",
- "nikic/php-parser": "Enables the use of the static analyzer."
+ "laravel/framework": "Enables the use of most traits."
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11-dev"
- }
- },
"autoload": {
"psr-4": {
"AltThree\\TestBench\\": "src/"
@@ -4537,56 +7060,130 @@
],
"authors": [
{
- "name": "James Brooks",
- "email": "james@alt-three.com"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com"
- },
- {
- "name": "Joseph Cohen",
- "email": "joe@alt-three.com"
+ "name": "Alt Three",
+ "email": "support@alt-three.com"
}
],
- "description": "Provides Some Testing Traits For Apps",
+ "description": "Provides some testing traits for apps",
"keywords": [
"Alt Three",
"TestBench",
"app"
],
- "time": "2017-01-01T12:36:00+00:00"
+ "support": {
+ "issues": "https://github.com/AltThree/TestBench/issues",
+ "source": "https://github.com/AltThree/TestBench/tree/5.0"
+ },
+ "abandoned": true,
+ "time": "2021-03-29T11:19:11+00:00"
},
{
- "name": "doctrine/instantiator",
- "version": "1.0.5",
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v3.4.2",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "91ee8b3acf0d72a4937f4855bd245acbda9910ac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/91ee8b3acf0d72a4937f4855bd245acbda9910ac",
+ "reference": "91ee8b3acf0d72a4937f4855bd245acbda9910ac",
"shasum": ""
},
"require": {
- "php": ">=5.3,<8.0-DEV"
+ "illuminate/routing": "^5.5|^6|^7",
+ "illuminate/session": "^5.5|^6|^7",
+ "illuminate/support": "^5.5|^6|^7",
+ "maximebf/debugbar": "^1.16.3",
+ "php": ">=7.0",
+ "symfony/debug": "^3|^4|^5",
+ "symfony/finder": "^3|^4|^5"
},
"require-dev": {
- "athletic/athletic": "~0.1.8",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~2.0"
+ "orchestra/testbench": "^3.5|^4.0|^5.0",
+ "phpunit/phpunit": "^6.0|^7.0|^8.5|^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "3.2-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Barryvdh\\Debugbar\\ServiceProvider"
+ ],
+ "aliases": {
+ "Debugbar": "Barryvdh\\Debugbar\\Facade"
+ }
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Barryvdh\\Debugbar\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "support": {
+ "issues": "https://github.com/barryvdh/laravel-debugbar/issues",
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/3.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
}
+ ],
+ "time": "2020-08-30T07:08:17+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.30 || ^5.4"
},
+ "type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
@@ -4600,39 +7197,57 @@
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com",
- "homepage": "http://ocramius.github.com/"
+ "homepage": "https://ocramius.github.io/"
}
],
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://github.com/doctrine/instantiator",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
"constructor",
"instantiate"
],
- "time": "2015-06-14T21:17:01+00:00"
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:15:36+00:00"
},
{
"name": "filp/whoops",
- "version": "2.1.8",
+ "version": "2.15.3",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "f2950be7da8b8d6c4e77821b6c9d486e36cdc4f3"
+ "reference": "c83e88a30524f9360b11f585f71e6b17313b7187"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/f2950be7da8b8d6c4e77821b6c9d486e36cdc4f3",
- "reference": "f2950be7da8b8d6c4e77821b6c9d486e36cdc4f3",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187",
+ "reference": "c83e88a30524f9360b11f585f71e6b17313b7187",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0",
- "psr/log": "^1.0.1"
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
- "mockery/mockery": "0.9.*",
- "phpunit/phpunit": "^4.8 || ^5.0",
- "symfony/var-dumper": "^2.6 || ^3.0"
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -4641,7 +7256,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "2.7-dev"
}
},
"autoload": {
@@ -4667,36 +7282,48 @@
"exception",
"handling",
"library",
- "whoops",
- "zf2"
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.15.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
],
- "time": "2017-03-07T09:04:45+00:00"
+ "time": "2023-07-13T12:00:00+00:00"
},
{
"name": "fzaninotto/faker",
- "version": "v1.6.0",
+ "version": "v1.9.2",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
- "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123"
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123",
- "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123",
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
"shasum": ""
},
"require": {
- "php": "^5.3.3|^7.0"
+ "php": "^5.3.3 || ^7.0"
},
"require-dev": {
"ext-intl": "*",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~1.5"
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
+ "squizlabs/php_codesniffer": "^2.9.2"
},
"type": "library",
"extra": {
- "branch-alias": []
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
},
"autoload": {
"psr-4": {
@@ -4718,27 +7345,105 @@
"faker",
"fixtures"
],
- "time": "2016-04-29T12:21:54+00:00"
+ "support": {
+ "issues": "https://github.com/fzaninotto/Faker/issues",
+ "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2"
+ },
+ "abandoned": true,
+ "time": "2020-12-11T09:56:16+00:00"
+ },
+ {
+ "name": "graham-campbell/analyzer",
+ "version": "v2.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Analyzer.git",
+ "reference": "baecd15b7e1185075a8db63ca1806c555cd60bc8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Analyzer/zipball/baecd15b7e1185075a8db63ca1806c555cd60bc8",
+ "reference": "baecd15b7e1185075a8db63ca1806c555cd60bc8",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^3.0|^4.0",
+ "php": "^7.0|^8.0",
+ "phpdocumentor/reflection-docblock": "^4.2",
+ "phpdocumentor/type-resolver": "~0.4|^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5|^7.5|^8.4|^9.0"
+ },
+ "suggest": {
+ "phpunit/phpunit": "Required to use the analysis trait."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\Analyzer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "Checks if referenced classes really exist.",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "analysis",
+ "analyzer",
+ "classes",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Analyzer/issues",
+ "source": "https://github.com/GrahamCampbell/Analyzer/tree/v2.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/analyzer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-02T14:42:06+00:00"
},
{
"name": "graham-campbell/testbench-core",
- "version": "v1.1.2",
+ "version": "v3.4.1",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-TestBench-Core.git",
- "reference": "9dcc8fe7feb891e4c7ffb85d7bc316de9699cf41"
+ "reference": "f62a3d0200cbea9f8156ac2cd7d16684ad324c8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Laravel-TestBench-Core/zipball/9dcc8fe7feb891e4c7ffb85d7bc316de9699cf41",
- "reference": "9dcc8fe7feb891e4c7ffb85d7bc316de9699cf41",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-TestBench-Core/zipball/f62a3d0200cbea9f8156ac2cd7d16684ad324c8d",
+ "reference": "f62a3d0200cbea9f8156ac2cd7d16684ad324c8d",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": "^7.0 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.0"
+ "graham-campbell/analyzer": "^2.4 || ^3.0",
+ "phpunit/phpunit": "^6.5 || ^7.5 || ^8.0 || ^9.0 || ^10.0"
},
"suggest": {
"illuminate/support": "Required to use the laravel trait.",
@@ -4746,11 +7451,6 @@
"phpunit/phpunit": "Required to use the most of the features."
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
"autoload": {
"psr-4": {
"GrahamCampbell\\TestBenchCore\\": "src/"
@@ -4763,10 +7463,11 @@
"authors": [
{
"name": "Graham Campbell",
- "email": "graham@alt-three.com"
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
}
],
- "description": "TestBench Core Provides Some Testing Functionality For Laravel 5",
+ "description": "TestBench Core Provides Some Testing Functionality For Laravel",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
@@ -4778,24 +7479,38 @@
"testbench-core",
"testing"
],
- "time": "2017-01-01T13:06:17+00:00"
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Laravel-TestBench-Core/issues",
+ "source": "https://github.com/GrahamCampbell/Laravel-TestBench-Core/tree/v3.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/testbench-core",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-02-25T15:19:33+00:00"
},
{
"name": "hamcrest/hamcrest-php",
- "version": "v1.2.2",
+ "version": "v2.0.1",
"source": {
"type": "git",
"url": "https://github.com/hamcrest/hamcrest-php.git",
- "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
- "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "php": "^5.3|^7.0|^8.0"
},
"replace": {
"cordoval/hamcrest-php": "*",
@@ -4803,54 +7518,126 @@
"kodova/hamcrest-php": "*"
},
"require-dev": {
- "phpunit/php-file-iterator": "1.3.3",
- "satooshi/php-coveralls": "dev-master"
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
"autoload": {
"classmap": [
"hamcrest"
- ],
- "files": [
- "hamcrest/Hamcrest.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD"
+ "BSD-3-Clause"
],
"description": "This is the PHP port of Hamcrest Matchers",
"keywords": [
"test"
],
- "time": "2015-05-11T14:41:42+00:00"
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ },
+ "time": "2020-07-09T08:09:16+00:00"
+ },
+ {
+ "name": "maximebf/debugbar",
+ "version": "v1.19.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maximebf/php-debugbar.git",
+ "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/03dd40a1826f4d585ef93ef83afa2a9874a00523",
+ "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1|^8",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^4|^5|^6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=7.5.20 <10.0",
+ "twig/twig": "^1.38|^2.7|^3.0"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "DebugBar\\": "src/DebugBar/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug",
+ "debugbar"
+ ],
+ "support": {
+ "issues": "https://github.com/maximebf/php-debugbar/issues",
+ "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.1"
+ },
+ "time": "2023-10-12T08:10:52+00:00"
},
{
"name": "mockery/mockery",
- "version": "0.9.5",
+ "version": "1.3.6",
"source": {
"type": "git",
- "url": "https://github.com/padraic/mockery.git",
- "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2"
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/padraic/mockery/zipball/4db079511a283e5aba1b3c2fb19037c645e70fc2",
- "reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/dc206df4fa314a50bbb81cf72239a305c5bbd5c0",
+ "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0",
"shasum": ""
},
"require": {
- "hamcrest/hamcrest-php": "~1.1",
+ "hamcrest/hamcrest-php": "^2.0.1",
"lib-pcre": ">=7.0",
- "php": ">=5.3.2"
+ "php": ">=5.6.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^5.7.10|^6.5|^7.5|^8.5|^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.9.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
@@ -4874,8 +7661,8 @@
"homepage": "http://davedevelopment.co.uk"
}
],
- "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
- "homepage": "http://github.com/padraic/mockery",
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
"keywords": [
"BDD",
"TDD",
@@ -4888,31 +7675,43 @@
"test double",
"testing"
],
- "time": "2016-05-22T21:52:33+00:00"
+ "support": {
+ "issues": "https://github.com/mockery/mockery/issues",
+ "source": "https://github.com/mockery/mockery/tree/1.3.6"
+ },
+ "time": "2022-09-07T15:05:49+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.6.0",
+ "version": "1.11.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
- "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
- "doctrine/collections": "1.*",
- "phpunit/phpunit": "~4.1"
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
@@ -4922,7 +7721,6 @@
"MIT"
],
"description": "Create deep copies (clones) of your objects",
- "homepage": "https://github.com/myclabs/DeepCopy",
"keywords": [
"clone",
"copy",
@@ -4930,39 +7728,154 @@
"object",
"object graph"
],
- "time": "2017-01-26T22:05:40+00:00"
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-03-08T13:26:56+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^2.0",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "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"
+ },
+ "time": "2018-07-08T19:23:20+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "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/master"
+ },
+ "time": "2018-07-08T19:19:57+00:00"
},
{
"name": "phpdocumentor/reflection-common",
- "version": "1.0",
+ "version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
- "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+ "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
"shasum": ""
},
"require": {
- "php": ">=5.5"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.6"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src"
- ]
+ "phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4984,33 +7897,44 @@
"reflection",
"static analysis"
],
- "time": "2015-12-27T11:43:31+00:00"
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master"
+ },
+ "time": "2020-04-27T09:25:28+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "3.1.1",
+ "version": "4.3.4",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
- "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
"shasum": ""
},
"require": {
- "php": ">=5.5",
- "phpdocumentor/reflection-common": "^1.0@dev",
- "phpdocumentor/type-resolver": "^0.2.0",
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+ "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
"webmozart/assert": "^1.0"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.4"
+ "doctrine/instantiator": "^1.0.5",
+ "mockery/mockery": "^1.0",
+ "phpdocumentor/type-resolver": "0.4.*",
+ "phpunit/phpunit": "^6.4"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": [
@@ -5029,41 +7953,44 @@
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2016-09-30T07:12:33+00:00"
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x"
+ },
+ "time": "2019-12-28T18:55:12+00:00"
},
{
"name": "phpdocumentor/type-resolver",
- "version": "0.2.1",
+ "version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
- "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
"shasum": ""
},
"require": {
- "php": ">=5.5",
- "phpdocumentor/reflection-common": "^1.0"
+ "php": "^7.1",
+ "phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^5.2||^4.8.24"
+ "ext-tokenizer": "^7.1",
+ "mockery/mockery": "~1",
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -5076,42 +8003,47 @@
"email": "me@mikevanriel.com"
}
],
- "time": "2016-11-25T06:54:22+00:00"
+ "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/0.7.2"
+ },
+ "time": "2019-08-22T18:11:29+00:00"
},
{
"name": "phpspec/prophecy",
- "version": "v1.7.0",
+ "version": "v1.10.3",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+ "reference": "451c3cd1418cf640de218914901e51b064abb093"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
- "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0",
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
- "sebastian/comparator": "^1.1|^2.0",
- "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
},
"require-dev": {
- "phpspec/phpspec": "^2.5|^3.2",
- "phpunit/phpunit": "^4.8 || ^5.6.5"
+ "phpspec/phpspec": "^2.5 || ^3.2",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6.x-dev"
+ "dev-master": "1.10.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Prophecy\\": "src/"
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -5139,44 +8071,48 @@
"spy",
"stub"
],
- "time": "2017-03-02T20:05:34+00:00"
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
+ },
+ "time": "2020-03-05T15:02:03+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "4.0.7",
+ "version": "6.1.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "09e2277d14ea467e5a984010f501343ef29ffc69"
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/09e2277d14ea467e5a984010f501343ef29ffc69",
- "reference": "09e2277d14ea467e5a984010f501343ef29ffc69",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-xmlwriter": "*",
- "php": "^5.6 || ^7.0",
- "phpunit/php-file-iterator": "^1.3",
- "phpunit/php-text-template": "^1.2",
- "phpunit/php-token-stream": "^1.4.2 || ^2.0",
- "sebastian/code-unit-reverse-lookup": "^1.0",
- "sebastian/environment": "^1.3.2 || ^2.0",
- "sebastian/version": "^1.0 || ^2.0"
+ "php": "^7.1",
+ "phpunit/php-file-iterator": "^2.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^3.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^3.1 || ^4.0",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1"
},
"require-dev": {
- "ext-xdebug": "^2.1.4",
- "phpunit/phpunit": "^5.7"
+ "phpunit/phpunit": "^7.0"
},
"suggest": {
- "ext-xdebug": "^2.5.1"
+ "ext-xdebug": "^2.6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0.x-dev"
+ "dev-master": "6.1-dev"
}
},
"autoload": {
@@ -5191,7 +8127,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -5202,29 +8138,36 @@
"testing",
"xunit"
],
- "time": "2017-03-01T09:12:17+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master"
+ },
+ "time": "2018-10-31T16:06:48+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.4.2",
+ "version": "2.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
- "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
+ "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
@@ -5239,7 +8182,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -5249,7 +8192,17 @@
"filesystem",
"iterator"
],
- "time": "2016-10-03T07:40:28+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:42:26+00:00"
},
{
"name": "phpunit/php-text-template",
@@ -5290,32 +8243,36 @@
"keywords": [
"template"
],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+ },
"time": "2015-06-21T13:50:34+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "1.0.9",
+ "version": "2.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662",
+ "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.1-dev"
}
},
"autoload": {
@@ -5330,7 +8287,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -5339,33 +8296,43 @@
"keywords": [
"timer"
],
- "time": "2017-02-26T11:10:40+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T08:20:02+00:00"
},
{
"name": "phpunit/php-token-stream",
- "version": "1.4.11",
+ "version": "3.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+ "reference": "9c1da83261628cb24b6a6df371b6e312b3954768"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
- "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768",
+ "reference": "9c1da83261628cb24b6a6df371b6e312b3954768",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "3.1-dev"
}
},
"autoload": {
@@ -5388,55 +8355,68 @@
"keywords": [
"tokenizer"
],
- "time": "2017-02-27T10:12:30+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
+ "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "abandoned": true,
+ "time": "2021-07-26T12:15:06+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "5.7.17",
+ "version": "7.5.20",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "68752b665d3875f9a38a357e3ecb35c79f8673bf"
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/68752b665d3875f9a38a357e3ecb35c79f8673bf",
- "reference": "68752b665d3875f9a38a357e3ecb35c79f8673bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c",
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c",
"shasum": ""
},
"require": {
+ "doctrine/instantiator": "^1.1",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
- "myclabs/deep-copy": "~1.3",
- "php": "^5.6 || ^7.0",
- "phpspec/prophecy": "^1.6.2",
- "phpunit/php-code-coverage": "^4.0.4",
- "phpunit/php-file-iterator": "~1.4",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": "^1.0.6",
- "phpunit/phpunit-mock-objects": "^3.2",
- "sebastian/comparator": "^1.2.4",
- "sebastian/diff": "~1.2",
- "sebastian/environment": "^1.3.4 || ^2.0",
- "sebastian/exporter": "~2.0",
- "sebastian/global-state": "^1.1",
- "sebastian/object-enumerator": "~2.0",
- "sebastian/resource-operations": "~1.0",
- "sebastian/version": "~1.0.3|~2.0",
- "symfony/yaml": "~2.1|~3.0"
+ "myclabs/deep-copy": "^1.7",
+ "phar-io/manifest": "^1.0.2",
+ "phar-io/version": "^2.0",
+ "php": "^7.1",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^6.0.7",
+ "phpunit/php-file-iterator": "^2.0.1",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^2.1",
+ "sebastian/comparator": "^3.0",
+ "sebastian/diff": "^3.0",
+ "sebastian/environment": "^4.0",
+ "sebastian/exporter": "^3.1",
+ "sebastian/global-state": "^2.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^2.0",
+ "sebastian/version": "^2.0.1"
},
"conflict": {
- "phpdocumentor/reflection-docblock": "3.0.2"
+ "phpunit/phpunit-mock-objects": "*"
},
"require-dev": {
"ext-pdo": "*"
},
"suggest": {
+ "ext-soap": "*",
"ext-xdebug": "*",
- "phpunit/php-invoker": "~1.1"
+ "phpunit/php-invoker": "^2.0"
},
"bin": [
"phpunit"
@@ -5444,7 +8424,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.7.x-dev"
+ "dev-master": "7.5-dev"
}
},
"autoload": {
@@ -5470,86 +8450,31 @@
"testing",
"xunit"
],
- "time": "2017-03-19T16:52:12+00:00"
- },
- {
- "name": "phpunit/phpunit-mock-objects",
- "version": "3.4.3",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
- "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
- "shasum": ""
- },
- "require": {
- "doctrine/instantiator": "^1.0.2",
- "php": "^5.6 || ^7.0",
- "phpunit/php-text-template": "^1.2",
- "sebastian/exporter": "^1.2 || ^2.0"
- },
- "conflict": {
- "phpunit/phpunit": "<5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^5.4"
- },
- "suggest": {
- "ext-soap": "*"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.2.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
- }
- ],
- "description": "Mock Object library for PHPUnit",
- "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
- "keywords": [
- "mock",
- "xunit"
- ],
- "time": "2016-12-08T20:27:08+00:00"
+ "time": "2020-01-08T08:45:45+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": ">=5.6"
},
"require-dev": {
- "phpunit/phpunit": "^5.7 || ^6.0"
+ "phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
@@ -5574,34 +8499,44 @@
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
- "time": "2017-03-04T06:30:41+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T08:15:22+00:00"
},
{
"name": "sebastian/comparator",
- "version": "1.2.4",
+ "version": "3.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770",
+ "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/diff": "~1.2",
- "sebastian/exporter": "~1.2 || ~2.0"
+ "php": ">=7.1",
+ "sebastian/diff": "^3.0",
+ "sebastian/exporter": "^3.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -5614,6 +8549,10 @@
"BSD-3-Clause"
],
"authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
@@ -5625,45 +8564,52 @@
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
}
],
"description": "Provides the functionality to compare PHP values for equality",
- "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
- "time": "2017-01-29T09:50:25+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:31:48+00:00"
},
{
"name": "sebastian/diff",
- "version": "1.4.1",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae",
+ "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.8"
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "symfony/process": "^2 || ^3.3 || ^4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -5676,46 +8622,62 @@
"BSD-3-Clause"
],
"authors": [
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- },
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
- "diff"
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
],
- "time": "2015-12-08T07:14:41+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-07T05:30:20+00:00"
},
{
"name": "sebastian/environment",
- "version": "2.0.0",
+ "version": "4.2.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
+ "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "^5.0"
+ "phpunit/phpunit": "^7.5"
+ },
+ "suggest": {
+ "ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "4.2-dev"
}
},
"autoload": {
@@ -5740,34 +8702,44 @@
"environment",
"hhvm"
],
- "time": "2016-11-26T07:53:53+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:53:42+00:00"
},
{
"name": "sebastian/exporter",
- "version": "2.0.0",
+ "version": "3.1.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+ "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
- "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6",
+ "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/recursion-context": "~2.0"
+ "php": ">=7.0",
+ "sebastian/recursion-context": "^3.0"
},
"require-dev": {
"ext-mbstring": "*",
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.1.x-dev"
}
},
"autoload": {
@@ -5780,6 +8752,10 @@
"BSD-3-Clause"
],
"authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
@@ -5788,17 +8764,13 @@
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
@@ -5807,27 +8779,37 @@
"export",
"exporter"
],
- "time": "2016-11-19T08:54:04+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:00:17+00:00"
},
{
"name": "sebastian/global-state",
- "version": "1.1.1",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "phpunit/phpunit": "^6.0"
},
"suggest": {
"ext-uopz": "*"
@@ -5835,7 +8817,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -5858,33 +8840,38 @@
"keywords": [
"global state"
],
- "time": "2015-10-12T03:26:01+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
+ },
+ "time": "2017-04-27T15:39:26+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "2.0.1",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
- "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
"shasum": ""
},
"require": {
- "php": ">=5.6",
- "sebastian/recursion-context": "~2.0"
+ "php": ">=7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
},
"require-dev": {
- "phpunit/phpunit": "~5"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
@@ -5904,32 +8891,42 @@
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
- "time": "2017-02-18T15:18:39+00:00"
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:40:27+00:00"
},
{
- "name": "sebastian/recursion-context",
- "version": "2.0.0",
+ "name": "sebastian/object-reflector",
+ "version": "1.1.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
- "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "1.1-dev"
}
},
"autoload": {
@@ -5942,44 +8939,49 @@
"BSD-3-Clause"
],
"authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
- },
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2"
+ },
+ "funding": [
{
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2016-11-19T07:33:16+00:00"
+ "time": "2020-11-30T07:37:18+00:00"
},
{
- "name": "sebastian/resource-operations",
- "version": "1.0.0",
+ "name": "sebastian/recursion-context",
+ "version": "3.0.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
"shasum": ""
},
"require": {
- "php": ">=5.6.0"
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
@@ -5995,33 +8997,51 @@
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
}
],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
- "time": "2015-07-28T20:34:47+00:00"
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:34:24+00:00"
},
{
- "name": "sebastian/version",
- "version": "2.0.1",
+ "name": "sebastian/resource-operations",
+ "version": "2.0.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3",
+ "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -6036,198 +9056,134 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
- "time": "2016-10-03T07:35:21+00:00"
- },
- {
- "name": "symfony/css-selector",
- "version": "v3.2.6",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/css-selector.git",
- "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/a48f13dc83c168f1253a5d2a5a4fb46c36244c4c",
- "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c",
- "shasum": ""
- },
- "require": {
- "php": ">=5.5.9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.2-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\CssSelector\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jean-François Simon",
- "email": "jeanfrancois.simon@sensiolabs.com"
- },
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
+ "funding": [
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "description": "Symfony CssSelector Component",
- "homepage": "https://symfony.com",
- "time": "2017-02-21T09:12:04+00:00"
+ "time": "2020-11-30T07:30:19+00:00"
},
{
- "name": "symfony/dom-crawler",
- "version": "v3.2.6",
+ "name": "sebastian/version",
+ "version": "2.0.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/dom-crawler.git",
- "reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee"
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/403944e294cf4ceb3b8447f54cbad88ea7b99cee",
- "reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "require-dev": {
- "symfony/css-selector": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/css-selector": ""
+ "php": ">=5.6"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Component\\DomCrawler\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Symfony DomCrawler Component",
- "homepage": "https://symfony.com",
- "time": "2017-02-21T09:12:04+00:00"
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/master"
+ },
+ "time": "2016-10-03T07:35:21+00:00"
},
{
- "name": "symfony/yaml",
- "version": "v3.2.6",
+ "name": "theseer/tokenizer",
+ "version": "1.1.3",
"source": {
"type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a"
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/093e416ad096355149e265ea2e4cc1f9ee40ab1a",
- "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
- },
- "require-dev": {
- "symfony/console": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/console": "For validating YAML files using the lint command"
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.2-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Symfony\\Component\\Yaml\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
}
],
- "description": "Symfony Yaml Component",
- "homepage": "https://symfony.com",
- "time": "2017-03-07T16:47:02+00:00"
+ "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"
+ },
+ "time": "2019-06-13T22:48:21+00:00"
},
{
"name": "tightenco/mailthief",
- "version": "v0.3.4",
+ "version": "v0.3.14",
"source": {
"type": "git",
- "url": "https://github.com/tightenco/mailthief.git",
- "reference": "b9ea841ad2c679dcf2aed200aca306f57ca9ea56"
+ "url": "https://github.com/tighten/mailthief.git",
+ "reference": "9a8c2443be2b3d77753596f70ae6cd879b5b26a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tightenco/mailthief/zipball/b9ea841ad2c679dcf2aed200aca306f57ca9ea56",
- "reference": "b9ea841ad2c679dcf2aed200aca306f57ca9ea56",
+ "url": "https://api.github.com/repos/tighten/mailthief/zipball/9a8c2443be2b3d77753596f70ae6cd879b5b26a6",
+ "reference": "9a8c2443be2b3d77753596f70ae6cd879b5b26a6",
"shasum": ""
},
"require": {
- "illuminate/mail": "^5.0",
- "illuminate/view": "^5.0"
+ "illuminate/mail": "5.*",
+ "illuminate/view": "5.*"
},
"require-dev": {
- "laravel/framework": "^5.1",
+ "laravel/framework": ">=5.0 <5.5",
"mockery/mockery": "^0.9.5",
"phpunit/phpunit": "^5.5"
},
@@ -6248,35 +9204,38 @@
}
],
"description": "A fake Mailer for Laravel applications that takes the pain out of testing mail.",
- "time": "2017-01-30T17:27:29+00:00"
+ "support": {
+ "issues": "https://github.com/tighten/mailthief/issues",
+ "source": "https://github.com/tighten/mailthief/tree/v0.3.14"
+ },
+ "time": "2018-02-10T04:17:52+00:00"
},
{
"name": "webmozart/assert",
- "version": "1.2.0",
+ "version": "1.9.1",
"source": {
"type": "git",
- "url": "https://github.com/webmozart/assert.git",
- "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
- "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.6",
- "sebastian/version": "^1.0.1"
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
- },
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
@@ -6298,19 +9257,31 @@
"check",
"validate"
],
- "time": "2016-11-23T20:04:58+00:00"
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.9.1"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
}
],
"aliases": [],
- "minimum-stability": "stable",
+ "minimum-stability": "dev",
"stability-flags": {
- "nexmo/client": 10
+ "alt-three/testbench": 20
},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": ">=5.6.4",
+ "php": "^7.1.3",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
"ext-xml": "*"
},
- "platform-dev": []
+ "platform-dev": {
+ "ext-sqlite3": "*"
+ },
+ "platform-overrides": {
+ "php": "7.1.3"
+ },
+ "plugin-api-version": "2.3.0"
}
diff --git a/config/app.php b/config/app.php
index 280139b6190f..b9599092fed0 100644
--- a/config/app.php
+++ b/config/app.php
@@ -47,7 +47,7 @@
|
*/
- 'debug' => env('APP_DEBUG', false),
+ 'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
@@ -73,7 +73,7 @@
|
*/
- 'timezone' => 'UTC',
+ 'timezone' => env('APP_TIMEZONE', 'UTC'),
/*
|--------------------------------------------------------------------------
@@ -173,35 +173,31 @@
/*
* Packages Service Providers...
*/
- AltThree\Badger\BadgerServiceProvider::class,
- AltThree\Emoji\EmojiServiceProvider::class,
- AltThree\Logger\LoggerServiceProvider::class,
- AltThree\Twitter\TwitterServiceProvider::class,
- BackupManager\Laravel\Laravel5ServiceProvider::class,
+ env('APP_DEBUG') ? Bugsnag\BugsnagLaravel\BugsnagServiceProvider::class : null,
Barryvdh\Cors\ServiceProvider::class,
- Fideloper\Proxy\TrustedProxyServiceProvider::class,
+ env('APP_DEBUG') ? Barryvdh\Debugbar\ServiceProvider::class : null,
+ CachetHQ\Badger\BadgerServiceProvider::class,
+ CachetHQ\Emoji\EmojiServiceProvider::class,
+ CachetHQ\Twitter\TwitterServiceProvider::class,
GrahamCampbell\Binput\BinputServiceProvider::class,
GrahamCampbell\Exceptions\ExceptionsServiceProvider::class,
- GrahamCampbell\Core\CoreServiceProvider::class,
GrahamCampbell\Markdown\MarkdownServiceProvider::class,
GrahamCampbell\Security\SecurityServiceProvider::class,
Jenssegers\Date\DateServiceProvider::class,
+ Laravel\Tinker\TinkerServiceProvider::class,
McCool\LaravelAutoPresenter\AutoPresenterServiceProvider::class,
- PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider::class,
- Roumen\Feed\FeedServiceProvider::class,
/*
* Application Service Providers...
*/
- CachetHQ\Cachet\Foundation\Providers\AppServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\ComposerServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\ConsoleServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\ConfigServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\EventServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\IntegrationServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\ModuleServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\RepositoryServiceProvider::class,
- CachetHQ\Cachet\Foundation\Providers\RouteServiceProvider::class,
+ CachetHQ\Cachet\Providers\AppServiceProvider::class,
+ CachetHQ\Cachet\Providers\ComposerServiceProvider::class,
+ CachetHQ\Cachet\Providers\ConsoleServiceProvider::class,
+ CachetHQ\Cachet\Providers\ConfigServiceProvider::class,
+ CachetHQ\Cachet\Providers\EventServiceProvider::class,
+ CachetHQ\Cachet\Providers\IntegrationServiceProvider::class,
+ CachetHQ\Cachet\Providers\RepositoryServiceProvider::class,
+ CachetHQ\Cachet\Providers\RouteServiceProvider::class,
]),
@@ -222,11 +218,14 @@
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
+ 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
+ 'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
+ 'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
diff --git a/config/avatar.php b/config/avatar.php
new file mode 100644
index 000000000000..68590dd603b9
--- /dev/null
+++ b/config/avatar.php
@@ -0,0 +1,88 @@
+ 'gd',
+
+ // Whether all characters supplied must be replaced with their closest ASCII counterparts
+ 'ascii' => false,
+
+ // Image shape: circle or square
+ 'shape' => 'circle',
+
+ // Image width, in pixel
+ 'width' => 100,
+
+ // Image height, in pixel
+ 'height' => 100,
+
+ // Number of characters used as initials. If name consists of single word, the first N character will be used
+ 'chars' => 2,
+
+ // font size
+ 'fontSize' => 48,
+
+ // convert initial letter in uppercase
+ 'uppercase' => false,
+
+ // Fonts used to render text.
+ // If contains more than one fonts, randomly selected based on name supplied
+ // You can provide absolute path, path relative to folder resources/laravolt/avatar/fonts/, or mixed.
+ 'fonts' => ['OpenSans-Bold.ttf', 'rockwell.ttf'],
+
+ // List of foreground colors to be used, randomly selected based on name supplied
+ 'foregrounds' => [
+ '#FFFFFF',
+ ],
+
+ // List of background colors to be used, randomly selected based on name supplied
+ 'backgrounds' => [
+ '#f44336',
+ '#E91E63',
+ '#9C27B0',
+ '#673AB7',
+ '#3F51B5',
+ '#2196F3',
+ '#03A9F4',
+ '#00BCD4',
+ '#009688',
+ '#4CAF50',
+ '#8BC34A',
+ '#CDDC39',
+ '#FFC107',
+ '#FF9800',
+ '#FF5722',
+ ],
+
+ 'border' => [
+ 'size' => 1,
+
+ // border color, available value are:
+ // 'foreground' (same as foreground color)
+ // 'background' (same as background color)
+ // or any valid hex ('#aabbcc')
+ 'color' => 'foreground',
+ ],
+
+];
diff --git a/config/backup-manager.php b/config/backup-manager.php
deleted file mode 100644
index 40c8539bc14a..000000000000
--- a/config/backup-manager.php
+++ /dev/null
@@ -1,70 +0,0 @@
- [
- 'type' => 'Local',
- 'root' => database_path('backups'),
- ],
- 's3' => [
- 'type' => 'AwsS3',
- 'key' => '',
- 'secret' => '',
- 'region' => 'us-east-1',
- 'bucket' => '',
- 'root' => '',
- ],
- 'gcs' => [
- 'type' => 'Gcs',
- 'key' => '',
- 'secret' => '',
- 'bucket' => '',
- 'root' => '',
- ],
- 'rackspace' => [
- 'type' => 'Rackspace',
- 'username' => '',
- 'key' => '',
- 'container' => '',
- 'zone' => '',
- 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/',
- 'root' => '',
- ],
- 'dropbox' => [
- 'type' => 'Dropbox',
- 'token' => '',
- 'key' => '',
- 'secret' => '',
- 'app' => '',
- 'root' => '',
- ],
- 'ftp' => [
- 'type' => 'Ftp',
- 'host' => '',
- 'username' => '',
- 'password' => '',
- 'port' => 21,
- 'passive' => true,
- 'ssl' => true,
- 'timeout' => 30,
- 'root' => '',
- ],
- 'sftp' => [
- 'type' => 'Sftp',
- 'host' => '',
- 'username' => '',
- 'password' => '',
- 'port' => 21,
- 'timeout' => 10,
- 'privateKey' => '',
- 'root' => '',
- ],
-];
diff --git a/config/broadcasting.php b/config/broadcasting.php
index 9305cdeb5c32..01c1213a4c7d 100644
--- a/config/broadcasting.php
+++ b/config/broadcasting.php
@@ -20,9 +20,11 @@
| framework when an event needs to be broadcast. You may set this to
| any of the connections defined in the "connections" array below.
|
+ | Supported: "pusher", "redis", "log", "null"
+ |
*/
- 'default' => env('BROADCAST_DRIVER', 'pusher'),
+ 'default' => env('BROADCAST_DRIVER', 'null'),
/*
|--------------------------------------------------------------------------
@@ -39,9 +41,9 @@
'pusher' => [
'driver' => 'pusher',
- 'key' => null,
- 'secret' => null,
- 'app_id' => null,
+ 'key' => env('PUSHER_APP_KEY'),
+ 'secret' => env('PUSHER_APP_SECRET'),
+ 'app_id' => env('PUSHER_APP_ID'),
'options' => [
//
],
@@ -56,6 +58,10 @@
'driver' => 'log',
],
+ 'null' => [
+ 'driver' => 'null',
+ ],
+
],
];
diff --git a/config/cache.php b/config/cache.php
index c10d17614d4f..06ec44c36eaf 100644
--- a/config/cache.php
+++ b/config/cache.php
@@ -10,6 +10,7 @@
*/
return [
+
/*
|--------------------------------------------------------------------------
| Default Cache Store
@@ -22,7 +23,9 @@
| Supported: "apc", "array", "database", "file", "memcached", "redis"
|
*/
+
'default' => env('CACHE_DRIVER', 'file'),
+
/*
|--------------------------------------------------------------------------
| Cache Stores
@@ -33,22 +36,28 @@
| same cache driver to group types of items stored in your caches.
|
*/
+
'stores' => [
+
'apc' => [
'driver' => 'apc',
],
+
'array' => [
'driver' => 'array',
],
+
'database' => [
'driver' => 'database',
'table' => 'cache',
'connection' => null,
],
+
'file' => [
'driver' => 'file',
- 'path' => storage_path('framework/cache'),
+ 'path' => storage_path('framework/cache/data'),
],
+
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
@@ -67,11 +76,17 @@
],
],
],
+
'redis' => [
'driver' => 'redis',
'connection' => 'default',
+ 'password' => env('REDIS_PASSWORD', null),
+ 'port' => env('REDIS_PORT', 6379),
+ 'database' => env('REDIS_DB', 0),
],
+
],
+
/*
|--------------------------------------------------------------------------
| Cache Key Prefix
@@ -82,5 +97,7 @@
| value to get prefixed to all our keys so we can avoid collisions.
|
*/
+
'prefix' => 'laravel',
+
];
diff --git a/config/cachet.php b/config/cachet.php
index 2f193d21e84c..6e0c9f8debdc 100644
--- a/config/cachet.php
+++ b/config/cachet.php
@@ -31,7 +31,7 @@
|
*/
- 'is_docker' => env('DOCKER', false),
+ 'is_docker' => env('DOCKER', false),
/*
|--------------------------------------------------------------------------
@@ -44,6 +44,23 @@
|
*/
- 'beacon' => env('CACHET_BEACON', true),
+ 'beacon' => env('CACHET_BEACON', true),
+ /*
+ |--------------------------------------------------------------------------
+ | Templates configurations
+ |--------------------------------------------------------------------------
+ |
+ | Security fix: now user can provide information which will be included to the Twig sandbox settings
+ |
+ | Default: Described below
+ |
+ */
+ 'twig' => [
+ 'methods' => [],
+ 'functions' => [],
+ 'filters' => ['escape'],
+ 'tags' => ['if'],
+ 'props' => [],
+ ],
];
diff --git a/config/cors.php b/config/cors.php
index fb12f8c9df49..6e843598bebd 100644
--- a/config/cors.php
+++ b/config/cors.php
@@ -10,6 +10,7 @@
*/
return [
+
/*
|--------------------------------------------------------------------------
| Laravel CORS
@@ -19,11 +20,13 @@
| to accept any value.
|
*/
- 'supportsCredentials' => false,
- 'allowedOrigins' => ['*'],
- 'allowedHeaders' => ['X-Cachet-Token'],
- 'allowedMethods' => ['*'],
- 'exposedHeaders' => [],
- 'maxAge' => 3600,
- 'hosts' => [],
+
+ 'supportsCredentials' => false,
+ 'allowedOrigins' => ['*'],
+ 'allowedOriginsPatterns' => [],
+ 'allowedHeaders' => ['X-Cachet-Token'],
+ 'allowedMethods' => ['*'],
+ 'exposedHeaders' => [],
+ 'maxAge' => 3600,
+
];
diff --git a/config/database.php b/config/database.php
index b6d967af0e50..bb5f8221b91b 100644
--- a/config/database.php
+++ b/config/database.php
@@ -11,19 +11,6 @@
return [
- /*
- |--------------------------------------------------------------------------
- | PDO Fetch Style
- |--------------------------------------------------------------------------
- |
- | By default, database results will be returned as instances of the PHP
- | stdClass object; however, you may desire to retrieve records in an
- | array format for simplicity. Here you can tweak the fetch style.
- |
- */
-
- 'fetch' => PDO::FETCH_CLASS,
-
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
@@ -58,33 +45,35 @@
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
- 'prefix' => env('DB_PREFIX', null),
+ 'prefix' => '',
],
'mysql' => [
- 'driver' => 'mysql',
- 'host' => env('DB_HOST', null),
- 'database' => env('DB_DATABASE', null),
- 'username' => env('DB_USERNAME', null),
- 'password' => env('DB_PASSWORD', null),
- 'port' => env('DB_PORT', '3306'),
- 'charset' => 'utf8',
- 'collation' => 'utf8_unicode_ci',
- 'prefix' => env('DB_PREFIX', null),
- 'strict' => false,
- 'engine' => null,
+ 'driver' => 'mysql',
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'unix_socket' => env('DB_UNIX_SOCKET', null),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => 'utf8mb4',
+ 'collation' => 'utf8mb4_unicode_ci',
+ 'prefix' => env('DB_PREFIX', null),
+ 'strict' => false,
+ 'engine' => null,
],
'pgsql' => [
'driver' => 'pgsql',
- 'host' => env('DB_HOST', null),
- 'database' => env('DB_DATABASE', null),
- 'username' => env('DB_USERNAME', null),
- 'password' => env('DB_PASSWORD', null),
+ 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => env('DB_PREFIX', null),
'schema' => env('DB_SCHEMA', 'public'),
+ 'sslmode' => 'prefer',
],
],
@@ -115,13 +104,13 @@
'redis' => [
- 'cluster' => false,
+ 'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
- 'password' => env('REDIS_PASSWORD', null),
],
],
diff --git a/config/debugbar.php b/config/debugbar.php
new file mode 100644
index 000000000000..f2591b99f80f
--- /dev/null
+++ b/config/debugbar.php
@@ -0,0 +1,201 @@
+ env('DEBUGBAR_ENABLED', null),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Storage settings
+ |--------------------------------------------------------------------------
+ |
+ | DebugBar stores data for session/ajax requests.
+ | You can disable this, so the debugbar stores data in headers/session,
+ | but this can cause problems with large data collectors.
+ | By default, file storage (in the storage folder) is used. Redis and PDO
+ | can also be used. For PDO, run the package migrations first.
+ |
+ */
+ 'storage' => [
+ 'enabled' => true,
+ 'driver' => 'file', // redis, file, pdo, custom
+ 'path' => storage_path('debugbar'), // For file driver
+ 'connection' => null, // Leave null for default connection (Redis/PDO)
+ 'provider' => '', // Instance of StorageInterface for custom driver
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Vendors
+ |--------------------------------------------------------------------------
+ |
+ | Vendor files are included by default, but can be set to false.
+ | This can also be set to 'js' or 'css', to only include javascript or css vendor files.
+ | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files)
+ | and for js: jquery and and highlight.js
+ | So if you want syntax highlighting, set it to true.
+ | jQuery is set to not conflict with existing jQuery scripts.
+ |
+ */
+
+ 'include_vendors' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Capture Ajax Requests
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),
+ | you can use this option to disable sending the data through the headers.
+ |
+ | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.
+ */
+
+ 'capture_ajax' => true,
+ 'add_ajax_timing' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Error Handler for Deprecated warnings
+ |--------------------------------------------------------------------------
+ |
+ | When enabled, the Debugbar shows deprecated warnings for Symfony components
+ | in the Messages tab.
+ |
+ */
+ 'error_handler' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Clockwork integration
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can emulate the Clockwork headers, so you can use the Chrome
+ | Extension, without the server-side code. It uses Debugbar collectors instead.
+ |
+ */
+ 'clockwork' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | DataCollectors
+ |--------------------------------------------------------------------------
+ |
+ | Enable/disable DataCollectors
+ |
+ */
+
+ 'collectors' => [
+ 'phpinfo' => true, // Php version
+ 'messages' => true, // Messages
+ 'time' => true, // Time Datalogger
+ 'memory' => true, // Memory usage
+ 'exceptions' => true, // Exception displayer
+ 'log' => true, // Logs from Monolog (merged in messages if enabled)
+ 'db' => true, // Show database (PDO) queries and bindings
+ 'views' => true, // Views with their data
+ 'route' => true, // Current route information
+ 'auth' => true, // Display Laravel authentication status
+ 'gate' => true, // Display Laravel Gate checks
+ 'session' => true, // Display session data
+ 'symfony_request' => true, // Only one can be enabled..
+ 'mail' => true, // Catch mail messages
+ 'laravel' => false, // Laravel version and environment
+ 'events' => false, // All events fired
+ 'default_request' => false, // Regular or special Symfony request logger
+ 'logs' => false, // Add the latest log messages
+ 'files' => false, // Show the included files
+ 'config' => false, // Display config settings
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Extra options
+ |--------------------------------------------------------------------------
+ |
+ | Configure some DataCollectors
+ |
+ */
+
+ 'options' => [
+ 'auth' => [
+ 'show_name' => true, // Also show the users name/email in the debugbar
+ ],
+ 'db' => [
+ 'with_params' => true, // Render SQL with the parameters substituted
+ 'backtrace' => true, // Use a backtrace to find the origin of the query in your files.
+ 'timeline' => false, // Add the queries to the timeline
+ 'explain' => [ // Show EXPLAIN output on queries
+ 'enabled' => false,
+ 'types' => ['SELECT'], // ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+
+ ],
+ 'hints' => true, // Show hints for common mistakes
+ ],
+ 'mail' => [
+ 'full_log' => false,
+ ],
+ 'views' => [
+ 'data' => false, //Note: Can slow down the application, because the data can be quite large..
+ ],
+ 'route' => [
+ 'label' => true, // show complete route on bar
+ ],
+ 'logs' => [
+ 'file' => null,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Inject Debugbar in Response
+ |--------------------------------------------------------------------------
+ |
+ | Usually, the debugbar is added just before