diff --git a/.ac-php-conf.json b/.ac-php-conf.json
new file mode 100644
index 00000000..7edd623f
--- /dev/null
+++ b/.ac-php-conf.json
@@ -0,0 +1,22 @@
+{
+ "use-cscope": null,
+ "tag-dir": null,
+ "filter": {
+ "php-file-ext-list": [
+ "php"
+ ],
+ "php-path-list": [
+ "."
+ ],
+ "ignore-ruleset": [
+ "# like .gitignore file ",
+ "/vendor/**/[tT]ests/**/*.php",
+ "/vendor/**/[Ee]xamples/**/*.php",
+ "/vendor/composer/*.php",
+ "/vendor/*.php",
+ "# not need php_codesniffer",
+ "/vendor/squizlabs/php_codesniffer/**/*.php",
+ "# -- end -- "
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.drone.jsonnet b/.drone.jsonnet
new file mode 100644
index 00000000..53c7d85b
--- /dev/null
+++ b/.drone.jsonnet
@@ -0,0 +1,65 @@
+
+local Pipeline(php_version, wp_version) =
+ {
+ kind: 'pipeline',
+ name: 'php-' + php_version,
+
+ clone: {
+ disable: true
+ },
+
+ steps: [
+ {
+ name: "git",
+ pull: "default",
+ image: "plugins/git",
+ settings: {
+ depth: 0,
+ tags: true
+ }
+ },
+ {
+ name: "test",
+ image: "docker.io/presslabs/php-runtime:%s" % php_version,
+ user: "root",
+ environment: {
+ WORDPRESS_TEST_DB_HOST: "database"
+ },
+ commands: [
+ "make test WP_VERSION=%s" % wp_version,
+ ],
+ },
+ {
+ name: "publish",
+ image: "quay.io/presslabs/build:latest",
+ group: "publish",
+ commands: [
+ "/usr/local/bin/setup-credentials-helper.sh",
+ ],
+ when: {
+ event: {
+ include: ['tag']
+ }
+ }
+ }
+ ],
+
+ services: [
+ {
+ name: "database",
+ image: "percona:5.7",
+ pull: "always",
+ environment: {
+ MYSQL_DATABASE: "wordpress_test",
+ MYSQL_USER: "wordpress",
+ MYSQL_PASSWORD: "wordpress",
+ MYSQL_ROOT_PASSWORD: "test"
+ }
+ }
+ ],
+ };
+
+[
+ Pipeline('8.0', '6.0.1'),
+ //Pipeline('7.4'),
+]
diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 00000000..2f969897
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,37 @@
+---
+clone:
+ disable: true
+kind: pipeline
+name: php-8.0
+services:
+- environment:
+ MYSQL_DATABASE: wordpress_test
+ MYSQL_PASSWORD: wordpress
+ MYSQL_ROOT_PASSWORD: test
+ MYSQL_USER: wordpress
+ image: percona:5.7
+ name: database
+ pull: always
+steps:
+- image: plugins/git
+ name: git
+ pull: default
+ settings:
+ depth: 0
+ tags: true
+- commands:
+ - make test WP_VERSION=6.0.1
+ environment:
+ WORDPRESS_TEST_DB_HOST: database
+ image: docker.io/presslabs/php-runtime:8.0
+ name: test
+ user: root
+- commands:
+ - /usr/local/bin/setup-credentials-helper.sh
+ group: publish
+ image: quay.io/presslabs/build:latest
+ name: publish
+ when:
+ event:
+ include:
+ - tag
diff --git a/.gitignore b/.gitignore
index 73060851..9bdefb4d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,9 @@ Thumbs.db
vendor/
.idea/
*.sql
-*.zip
\ No newline at end of file
+*.zip
+
+.cache/
+.work/
+_output/
+bin/
diff --git a/.phpcs.xml.dist b/.phpcs.xml.dist
new file mode 100644
index 00000000..a86cfdaf
--- /dev/null
+++ b/.phpcs.xml.dist
@@ -0,0 +1,47 @@
+
+
+ Generally-applicable sniffs for WordPress plugins.
+
+
+ .
+ /vendor/
+ /node_modules/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..ba3871fd
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+PROJECT_NAME := toplytics
+PROJECT_REPO := github.com/presslabs/toplytics
+
+WP_VERSION ?= 6.0.1
+
+include build/makelib/common.mk
+include build/makelib/wordpress.mk
+include build/makelib/php.mk
+
+.php.test.init: $(WP_TESTS_DIR)/wp-tests-config.php $(WP_TESTS_DIR)/includes $(WP_TESTS_DIR)/data
diff --git a/bin/deploy.sh b/bin/deploy.sh
old mode 100644
new mode 100755
diff --git a/build/.drone.yml b/build/.drone.yml
new file mode 100644
index 00000000..ab4c7da7
--- /dev/null
+++ b/build/.drone.yml
@@ -0,0 +1,95 @@
+kind: pipeline
+name: default
+
+clone:
+ disable: true
+
+workspace:
+ base: /workspace
+ path: src/github.com/presslabs/build
+
+steps:
+- name: clone
+ image: plugins/git
+ settings:
+ depth: 0
+ tags: true
+
+- name: install dependencies
+ image: presslabs/build:stable
+ commands:
+ - make -j4 build.tools
+
+- name: build
+ pull: true
+ image: presslabs/build:stable
+ environment:
+ DOCKER_HOST: "unix:///workspace/docker.sock"
+ commands:
+ - make -j4 build
+
+- name: publish
+ image: presslabs/build:stable
+ commands:
+ - /usr/local/bin/setup-credentials-helper.sh
+ - make publish
+ environment:
+ DOCKER_HOST: "unix:///workspace/docker.sock"
+ DOCKER_USERNAME: presslabsbot
+ DOCKER_PASSWORD:
+ from_secret: DOCKERHUB_TOKEN
+ when:
+ ref:
+ - refs/heads/master
+ - refs/heads/release-*
+
+services:
+- name: docker
+ image: docker:dind
+ privileged: true
+ commands:
+ - /usr/local/bin/dockerd-entrypoint.sh dockerd --host "unix:///workspace/docker.sock" --storage-driver overlay2 --log-level error
+
+
+trigger:
+ ref:
+ - refs/pull/**
+ - refs/heads/**
+ event:
+ exclude:
+ - promote
+ - tag
+
+---
+kind: pipeline
+name: promote
+
+clone:
+ disable: true
+
+workspace:
+ base: /workspace
+ path: src/github.com/presslabs/build
+
+steps:
+- name: clone
+ image: plugins/git
+ settings:
+ depth: 0
+ tags: true
+
+- name: promote
+ image: presslabs/build:stable
+ commands:
+ - /usr/local/bin/setup-credentials-helper.sh
+ - make promote CHANNEL=${DRONE_DEPLOY_TO} PROMOTE_IMAGE_TAG=${PUBLISH_TAG}
+ - '[ "$PUBLISH_TAG" = "" ] || make tag VERSION=${PUBLISH_TAG}'
+ environment:
+ DOCKER_HOST: "unix:///workspace/docker.sock"
+ DOCKER_USERNAME: presslabsbot
+ DOCKER_PASSWORD:
+ from_secret: DOCKERHUB_TOKEN
+
+trigger:
+ event:
+ - promote
diff --git a/build/.gitignore b/build/.gitignore
new file mode 100644
index 00000000..54768b76
--- /dev/null
+++ b/build/.gitignore
@@ -0,0 +1,6 @@
+_output
+.cache
+.work
+/bin/
+
+.#*
\ No newline at end of file
diff --git a/build/LICENSE b/build/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/build/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/build/Makefile b/build/Makefile
new file mode 100644
index 00000000..ca30b715
--- /dev/null
+++ b/build/Makefile
@@ -0,0 +1,16 @@
+# Project Setup
+PROJECT_NAME := presslabs-build
+PROJECT_REPO := github.com/presslabs/build
+
+PLATFORMS = linux_amd64
+
+# this is required, since by default, the makelib files are under a ./build path prefix, but here,
+# they are under root
+ROOT_DIR := $(abspath $(shell cd ./ && pwd -P))
+
+include makelib/common.mk
+
+IMAGES ?= build
+DOCKER_REGISTRY ?= presslabs
+
+include makelib/image.mk
diff --git a/build/README.md b/build/README.md
new file mode 100644
index 00000000..190c97e9
--- /dev/null
+++ b/build/README.md
@@ -0,0 +1,74 @@
+# build
+Presslabs GNU make based build system
+
+## Goals
+
+1. Allow building locally the same way the project is build on CI
+2. Provide a sane test, build, publish flow
+3. Provide stable toolchain for building (eg. pinned tool versions)
+4. Enables caching for speeding up builds.
+
+## Quickstart
+
+```sh
+git subtree add -P build https://github.com/presslabs/build.git
+
+cat < Makefile
+# Project Setup
+PROJECT_NAME := mysql-operator
+PROJECT_REPO := github.com/presslabs/mysql-operator
+
+include build/makelib/common.mk
+```
+
+### Push back changes
+
+An [workaround](https://github.com/rust-lang/rust-clippy/issues/5565#issuecomment-623489754) on how
+to bypass the segfault of git subtree command on repose with more commits.
+
+```sh
+ulimit -s 60000 # workaround to fix segfault
+
+git subtree push -P build/ git@github.com:presslabs/build.git
+```
+
+## Development workflow
+
+The image publishing will work as follows:
+
+On a feature branch (e.g. `feat-*`):
+ * Drone build runs without image publishing
+ * Can't trigger a promotion (it will fail)
+
+On a release branch (e.i. `release-*` or `master`):
+ * Drone build will publish images using git-semver using the following tags: `$(git-semver)`, `$(git-semver)-$ARCH`
+ * Manually can promote to the following channels (`$CHANNEL`): `stable`, `beta`, `alpha`, `master`
+ * *On promote*: the images are published with the following tags: `$CHANNEL`, `$CHANNEL-$(git-semver)`, `$(git-semver)`, `$(git-semver)-$ARCH`
+ * *On promote* and parameter `PUBLISH_TAG` is set: a new git tag will be created and images will be published under the following tags: `$CHANNEL`, `$CHANNEL-$PUBLISH_TAG`, `$PUBLISH_TAG` (if channel is `stable`).
+
+On git tag event the CI will not run.
+
+## Usage
+
+```
+Usage: make [make-options] [options]
+
+Common Targets:
+ build Build source code and other artifacts for host platform.
+ build.all Build source code and other artifacts for all platforms.
+ build.tools Install the required build tools.
+ clean Remove all files created during the build.
+ distclean Remove all files created during the build including cached tools.
+ generate Run code generation tools.
+ fmt Run code auto-formatting tools.
+ lint Run lint and code analysis tools.
+ test Runs unit tests.
+ e2e Runs end-to-end integration tests.
+ translate Collect translation strings and post-process the .pot/.po files.
+ help Show this help info.
+```
+
+## Acknowledgement
+
+This work is based on https://github.com/bitpoke/build
+This work is based on https://github.com/upbound/build.
diff --git a/build/bin/po-diff.sh b/build/bin/po-diff.sh
new file mode 100755
index 00000000..4ef21a48
--- /dev/null
+++ b/build/bin/po-diff.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+# Copyright 2019 Pressinfra SRL
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+export ROOT_DIR=$(dirname "${BASH_SOURCE}")/../..
+
+# Install tools we need, but only from vendor/...
+cd "${ROOT_DIR}"
+
+diff -u \
+ <(grep -E '^msgid' "${1}" | sort | sed 's/msgid[[:space:]]*//g') \
+ <(grep -E '^msgid' "${2}" | sort | sed 's/msgid[[:space:]]*//g')
+
+exit 0
diff --git a/build/images/build/Dockerfile b/build/images/build/Dockerfile
new file mode 100644
index 00000000..dc721def
--- /dev/null
+++ b/build/images/build/Dockerfile
@@ -0,0 +1,195 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM google/cloud-sdk:367.0.0
+
+ARG ARCH
+
+ENV DEBIAN_FRONTEND noninteractive
+
+COPY build-scripts /usr/local/build-scripts
+
+COPY --from=docker/buildx-bin:0.6.1 /buildx /usr/libexec/docker/cli-plugins/docker-buildx
+RUN docker buildx version
+
+# ------------------------------------------------------------------------------------------------
+# install build and release tools
+RUN /usr/local/build-scripts/install-packages.sh \
+ apt-transport-https \
+ gettext \
+ jq \
+ lsb-release \
+ make \
+ rsync \
+ runit \
+ sudo \
+ wget \
+ zip
+# ------------------------------------------------------------------------------------------------
+# PHP
+RUN sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \
+ && wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \
+ && /usr/local/build-scripts/install-packages.sh \
+ php7.4-bcmath \
+ php7.4-curl \
+ php7.4-cli \
+ php7.4-fpm \
+ php7.4-gd \
+ php7.4-mbstring \
+ php7.4-mysql \
+ php7.4-opcache \
+ php7.4-tidy \
+ php7.4-xml \
+ php7.4-xmlrpc \
+ php7.4-xsl \
+ php7.4-zip \
+ php-apcu \
+ php-apcu-bc \
+ php-geoip \
+ php-imagick \
+ php-memcached \
+ php-redis \
+ php-sodium \
+ php-yaml \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+# ------------------------------------------------------------------------------------------------
+# git config
+RUN git config --global user.email "bot@presslabs.com" \
+ && git config --global user.name "RoBot" \
+ && git config --global diff.tar-filelist.binary true \
+ && git config --global diff.tar-filelist.textconv 'tar -tvf' \
+ && git config --global diff.tar.binary true \
+ && git config --global diff.tar.textconv 'tar -xvOf'
+
+# ------------------------------------------------------------------------------------------------
+# Go support
+RUN GO_VERSION=1.18.1 && \
+ GO_HASH=b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334 && \
+ curl -fsSL https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz -o golang.tar.gz && \
+ echo "${GO_HASH} golang.tar.gz" | sha256sum -c - && \
+ tar -C /usr/local -xzf golang.tar.gz && \
+ rm golang.tar.gz
+ENV GOPATH /workspace
+ENV PATH /workspace/bin:/usr/local/go/bin:$PATH
+
+# precompile the go standard library for all supported platforms and configurations
+# the install suffixes match those in golang.mk so please keep them in sync
+RUN platforms="darwin_amd64 windows_amd64 linux_amd64 linux_arm64" && \
+ for p in $platforms; do CGO_ENABLED=0 GOOS=${p%_*} GOARCH=${p##*_} GOARM=7 go install -installsuffix static -a std; done
+
+# ------------------------------------------------------------------------------------------------
+# Node JS and chrome support
+RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - && \
+ curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
+ echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \
+ /usr/local/build-scripts/install-packages.sh \
+ nodejs \
+ google-chrome-stable \
+ xvfb && \
+ rm -f /etc/apt/sources.list.d/google.list && \
+ ln -fs /usr/local/bin/xvfb-chrome /usr/bin/google-chrome && \
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+ENV CHROME_BIN /usr/bin/google-chrome
+
+# ------------------------------------------------------------------------------------------------
+# Yarn
+RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \
+ /usr/local/build-scripts/install-packages.sh \
+ yarn && \
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+# ------------------------------------------------------------------------------------------------
+# rclone
+RUN set -ex \
+ && export RCLONE_VERSION=1.57.0 \
+ && curl -sL -o rclone-v${RCLONE_VERSION}-linux-amd64.deb https://github.com/rclone/rclone/releases/download/v${RCLONE_VERSION}/rclone-v${RCLONE_VERSION}-linux-amd64.deb \
+ && dpkg -i rclone-v${RCLONE_VERSION}-linux-amd64.deb \
+ && rm rclone-v${RCLONE_VERSION}-linux-amd64.deb \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+# ------------------------------------------------------------------------------------------------
+# dockerize
+RUN set -ex \
+ && export DOCKERIZE_VERSION="2.1.0" \
+ && curl -sL -o dockerize.tar.gz "https://github.com/presslabs/dockerize/releases/download/v${DOCKERIZE_VERSION}/dockerize-linux-amd64-v${DOCKERIZE_VERSION}.tar.gz" \
+ && tar -C /usr/local/bin -xzvf dockerize.tar.gz \
+ && rm dockerize.tar.gz \
+ && chmod 0755 /usr/local/bin/dockerize \
+ && chown root:root /usr/local/bin/dockerize
+
+# ------------------------------------------------------------------------------------------------
+# sops
+RUN set -ex \
+ && export SOPS_VERSION="3.7.1" \
+ && curl -sL -o /usr/local/bin/sops "https://github.com/mozilla/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.linux" \
+ && chmod 0755 /usr/local/bin/sops \
+ && chown root:root /usr/local/bin/sops
+
+# ------------------------------------------------------------------------------------------------
+# helm
+RUN set -ex \
+ && export HELM_VERSION="3.8.2" \
+ && curl -sL -o helm.tar.gz "https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz" \
+ && tar -C /usr/local/bin -xzvf helm.tar.gz --strip-components 1 linux-amd64/helm \
+ && rm helm.tar.gz \
+ && chmod 0755 /usr/local/bin/helm \
+ && chown root:root /usr/local/bin/helm
+
+# ------------------------------------------------------------------------------------------------
+# helm secrets plugin
+RUN set -ex \
+ && export HELM_SECRETS_VERSION="3.8.3" \
+ && helm plugin install https://github.com/jkroepke/helm-secrets --version ${HELM_SECRETS_VERSION}
+
+# ------------------------------------------------------------------------------------------------
+# kustomize
+RUN set -ex \
+ && export KUSTOMIZE_VERSION="4.5.4" \
+ && curl -sL -o kustomize.tar.gz "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_amd64.tar.gz" \
+ && tar -C /usr/local/bin -xzvf kustomize.tar.gz \
+ && rm kustomize.tar.gz \
+ && chmod 0755 /usr/local/bin/kustomize \
+ && chown root:root /usr/local/bin/kustomize
+
+# ------------------------------------------------------------------------------------------------
+# docker-compose
+
+RUN set -ex \
+ && export DOCKER_COMPOSE_VERSION="1.29.2" \
+ && curl -sL -o /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64" \
+ && chmod +x /usr/local/bin/docker-compose \
+ && chown root:root /usr/local/bin/docker
+
+# ------------------------------------------------------------------------------------------------
+# Run tini as PID 1 and avoid signal handling issues
+
+RUN set -ex \
+ && export TINI_VERSION=v0.19.0 \
+ && curl -sL -o /tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH} \
+ && chmod +x /tini
+
+# ------------------------------------------------------------------------------------------------
+# yq
+
+RUN set -ex \
+ && export YQ_VERSION=4.24.5 \
+ && curl -sL -o /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_amd64" \
+ && chmod 0755 /usr/local/bin/yq \
+ && chown root:root /usr/local/bin/yq
+
+COPY root /
+
+ENTRYPOINT [ "/tini", "-g", "--", "/build/run.sh" ]
diff --git a/build/images/build/Makefile b/build/images/build/Makefile
new file mode 100644
index 00000000..70913081
--- /dev/null
+++ b/build/images/build/Makefile
@@ -0,0 +1,21 @@
+PLATFORMS := linux_amd64
+include ../../makelib/common.mk
+
+# this is required, since by default, the makelib files are under a ./build path prefix, but here,
+# they are under root
+ROOT_DIR := $(abspath $(shell cd ./../.. && pwd -P))
+
+IMAGE = $(BUILD_REGISTRY)/build-$(ARCH)
+CACHE_IMAGES = $(IMAGE)
+include ../../makelib/image.mk
+
+img.build:
+ @$(INFO) docker build $(IMAGE) $(IMAGE_PLATFORM)
+ @cp -La . $(IMAGE_TEMP_DIR)
+ @mkdir -p $(IMAGE_TEMP_DIR)/rootfs
+ @docker buildx build $(BUILD_ARGS) \
+ --platform $(IMAGE_PLATFORM) \
+ -t $(IMAGE) \
+ --build-arg ARCH=$(ARCH) \
+ $(IMAGE_TEMP_DIR)
+ @$(OK) docker build $(IMAGE)
diff --git a/build/images/build/build-scripts/install-packages.sh b/build/images/build/build-scripts/install-packages.sh
new file mode 100755
index 00000000..20520572
--- /dev/null
+++ b/build/images/build/build-scripts/install-packages.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+# Copyright 2019 Pressinfra
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+apt-get update
+apt-get install -yy -q --no-install-recommends "${@}"
+apt-get clean
+rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
diff --git a/build/images/build/root/build/rsyncd.sh b/build/images/build/root/build/rsyncd.sh
new file mode 100755
index 00000000..35ff953f
--- /dev/null
+++ b/build/images/build/root/build/rsyncd.sh
@@ -0,0 +1,51 @@
+#!/bin/bash -e
+
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+VOLUME=${VOLUME:-/volume}
+ALLOW=${ALLOW:-192.168.0.0/16 172.16.0.0/12 10.0.0.0/8}
+OWNER=${OWNER:-nobody}
+GROUP=${GROUP:-nogroup}
+
+if [[ "${GROUP}" != "nogroup" && "${GROUP}" != "root" ]]; then
+ groupadd -g ${GROUP} rsync
+fi
+
+if [[ "${OWNER}" != "nobody" && "${OWNER}" != "root" ]]; then
+ groupadd -u ${OWNER} -G rsync rsync
+fi
+
+chown "${OWNER}:${GROUP}" "${VOLUME}"
+
+[ -f /etc/rsyncd.conf ] || cat < /etc/rsyncd.conf
+uid = ${OWNER}
+gid = ${GROUP}
+use chroot = yes
+log file = /dev/stdout
+reverse lookup = no
+[volume]
+ hosts deny = *
+ hosts allow = ${ALLOW}
+ read only = false
+ path = ${VOLUME}
+ comment = volume
+EOF
+
+for dir in ${MKDIRS}; do
+ mkdir -p ${dir}
+ chown "${OWNER}:${GROUP}" ${dir}
+done
+
+exec /usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf "$@"
diff --git a/build/images/build/root/build/run.sh b/build/images/build/root/build/run.sh
new file mode 100755
index 00000000..27b9abaf
--- /dev/null
+++ b/build/images/build/root/build/run.sh
@@ -0,0 +1,34 @@
+#!/bin/bash -e
+
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ARGS="$@"
+if [ $# -eq 0 ]; then
+ ARGS=/bin/bash
+fi
+
+BUILDER_USER=${BUILDER_USER:-upbound}
+BUILDER_GROUP=${BUILDER_GROUP:-upbound}
+BUILDER_UID=${BUILDER_UID:-1000}
+BUILDER_GID=${BUILDER_GID:-1000}
+
+groupadd -o -g $BUILDER_GID $BUILDER_GROUP 2> /dev/null
+useradd -o -m -g $BUILDER_GID -u $BUILDER_UID $BUILDER_USER 2> /dev/null
+echo "$BUILDER_USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
+export HOME=/home/${BUILDER_USER}
+echo "127.0.0.1 $(cat /etc/hostname)" >> /etc/hosts
+[[ -S /var/run/docker.sock ]] && chmod 666 /var/run/docker.sock
+chown -R $BUILDER_UID:$BUILDER_GID $HOME
+exec chpst -u :$BUILDER_UID:$BUILDER_GID ${ARGS}
diff --git a/build/images/build/root/usr/local/bin/setup-credentials-helper.sh b/build/images/build/root/usr/local/bin/setup-credentials-helper.sh
new file mode 100755
index 00000000..e7d01f19
--- /dev/null
+++ b/build/images/build/root/usr/local/bin/setup-credentials-helper.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+: "${GOOGLE_CREDENTIALS:="$(cat "$PLUGIN_GOOGLE_CREDENTIALS_FILE" 2>/dev/null)"}"
+: "${GOOGLE_CLOUD_PROJECT:="$PLUGIN_GOOGLE_CLOUD_PROJECT"}"
+: "${GOOGLE_CLOUD_CLUSTER:="$PLUGIN_GOOGLE_CLOUD_CLUSTER"}"
+: "${GOOGLE_CLOUD_ZONE:="$PLUGIN_GOOGLE_CLOUD_ZONE"}"
+: "${SSH_KEY:="$PLUGIN_SSH_KEY"}"
+: "${DOCKER_USERNAME:="$PLUGIN_DOCKER_USERNAME"}"
+: "${DOCKER_PASSWORD:="$PLUGIN_DOCKER_PASSWORD"}"
+: "${DOCKER_REGISTRY:="${PLUGIN_DOCKER_REGISTRY:-docker.io}"}"
+
+DOCKER_REGISTRY_HOST="$(echo "${DOCKER_REGISTRY}" | awk 'BEGIN{ FS="/" }{print $1}')"
+
+export PATH="$CI_WORKSPACE/bin:$PATH"
+
+require_param() {
+ declare name="$1"
+ local env_name
+ env_name="$(echo "$name" | tr /a-z/ /A-Z/)"
+ if [ -z "${!env_name}" ] ; then
+ echo "You must define \"$name\" parameter or define $env_name environment variable" >&2
+ exit 2
+ fi
+}
+
+require_google_credentials() {
+ if [ -z "$GOOGLE_CREDENTIALS" ] ; then
+ echo "You must define \"google_credentials_file\" parameter or define GOOGLE_CREDENTIALS environment variable" >&2
+ exit 2
+ fi
+}
+
+run() {
+ echo "+" "$@"
+ "$@"
+}
+
+if [ -n "$DOCKER_PASSWORD" ] ; then
+ require_param DOCKER_USERNAME
+ echo "+ docker login $DOCKER_REGISTRY_HOST -u $DOCKER_USERNAME"
+ echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY_HOST" -u "$DOCKER_USERNAME" --password-stdin
+fi
+
+if [ -n "$GOOGLE_CREDENTIALS" ] ; then
+ echo "$GOOGLE_CREDENTIALS" > /run/google-credentials.json
+ run gcloud auth activate-service-account --quiet --key-file=/run/google-credentials.json
+ run gcloud auth configure-docker --quiet
+fi
+
+if [ -n "$GOOGLE_CLOUD_PROJECT" ] ; then
+ run gcloud config set project "$GOOGLE_CLOUD_PROJECT"
+fi
+
+if [ -n "$GOOGLE_CLOUD_CLUSTER" ] ; then
+ require_google_credentials
+ require_param "google_cloud_project"
+ require_param "google_cloud_zone"
+
+ run gcloud container clusters get-credentials "$GOOGLE_CLOUD_CLUSTER" --project "$GOOGLE_CLOUD_PROJECT" --zone "$GOOGLE_CLOUD_ZONE"
+ # Display kubernetees versions (usefull for debugging)
+ run kubectl version
+fi
+
+if [ -n "$SSH_KEY" ] ; then
+ require_param "home"
+ test -d "$HOME/.ssh" || mkdir -p "$HOME/.ssh"
+ echo "$SSH_KEY" > "$HOME/.ssh/id_rsa"
+ chmod 0400 "$HOME/.ssh/id_rsa"
+ echo "Installed ssh key into $HOME/.ssh/id_rsa"
+ run ssh-keygen -y -f "$HOME/.ssh/id_rsa"
+fi
+
+if [[ -n "${GIT_USER}" && -n "${GIT_PASSWORD}" ]] ; then
+ git config --global user.email "${GIT_EMAIL:-bot@presslabs.com}"
+ git config --global user.name "${GIT_USER:-presslabs-bot}"
+
+ cat <> ~/.netrc
+machine ${GIT_HOST:-github.com}
+ login ${GIT_USER}
+ password ${GIT_PASSWORD}
+EOF
+fi
diff --git a/build/images/build/root/usr/local/bin/xvfb-chrome b/build/images/build/root/usr/local/bin/xvfb-chrome
new file mode 100755
index 00000000..ae88a91c
--- /dev/null
+++ b/build/images/build/root/usr/local/bin/xvfb-chrome
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+_kill_procs() {
+ kill -TERM $chrome
+ wait $chrome
+}
+
+# Setup a trap to catch SIGTERM and relay it to child processes
+trap _kill_procs SIGTERM
+
+# Start Chrome inside xvfb
+xvfb-run -a -s "-screen 0 1920x1080x24 -nolisten tcp" /opt/google/chrome/chrome --no-sandbox $@ &
+chrome=$!
+
+wait $chrome
diff --git a/build/makelib/cache.mk b/build/makelib/cache.mk
new file mode 100644
index 00000000..77621c7f
--- /dev/null
+++ b/build/makelib/cache.mk
@@ -0,0 +1,59 @@
+# Copyright 2019 Pressinfra SRL. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __CACHE_MAKEFILE__
+__CACHE_MAKEFILE__ := included
+
+RCLONE_BIN ?= RCLONE_VERSION=true rclone
+RCLONE_ARGS ?= -q --config /dev/null
+
+ifeq ($(CACHE_BACKEND),)
+$(error You must define CACHE_BACKEND before adding cache support. See format at https://rclone.org/docs/#backend-path-to-dir)
+endif
+
+CACHE_COMPRESSION ?= gzip
+
+ifneq ($(DRONE_PULL_REQUEST),)
+CACHE_NAME ?= $(PROJECT_NAME)-pr$(DRONE_PULL_REQUEST)-cache
+else ifneq ($(DRONE_TAG),)
+CACHE_NAME ?= $(PROJECT_NAME)-$(DRONE_TAG)-cache
+else
+CACHE_NAME ?= $(PROJECT_NAME)-$(BRANCH_NAME)-cache
+endif
+
+
+RCLONE := $(RCLONE_BIN) $(RCLONE_ARGS)
+
+ifeq ($(CACHE_COMPRESSION),gzip)
+TAR_COMPRESS_ARGS += -z
+CACHE_EXTENSION_SUFFIX := .gz
+endif
+
+CACHE_FILE := $(CACHE_NAME).tar$(CACHE_EXTENSION_SUFFIX)
+
+.PHONY: cache.store cache.restore
+
+cache.store:
+ @$(INFO) storing cache $(CACHE_FILE) into $(CACHE_BACKEND)
+ @$(RCLONE) mkdir $(CACHE_BACKEND) || $(FAIL)
+ @tar -C $(CACHE_DIR) $(TAR_COMPRESS_ARGS) -cf - ./ | $(RCLONE) rcat $(CACHE_BACKEND)/$(CACHE_FILE) || $(FAIL)
+ @$(OK) cache store
+
+cache.restore: |$(CACHE_DIR)
+ @$(INFO) restoring cache from $(CACHE_BACKEND)/$(CACHE_FILE)
+ @$(RCLONE) cat $(CACHE_BACKEND)/$(CACHE_FILE) | tar -C $(CACHE_DIR) $(TAR_COMPRESS_ARGS) -x \
+ && $(OK) cache restore \
+ || $(WARN) cache restore failed
+
+endif # __CACHE_MAKEFILE__
diff --git a/build/makelib/common.mk b/build/makelib/common.mk
new file mode 100644
index 00000000..8397e33c
--- /dev/null
+++ b/build/makelib/common.mk
@@ -0,0 +1,488 @@
+# Copyright 2019 Pressinfra SRL. All rights reserved.
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __COMMON_MAKEFILE__
+__COMMON_MAKEFILE__ := included
+
+# include the common make file
+COMMON_SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+include $(COMMON_SELF_DIR)/utils.mk
+
+# remove default suffixes as we dont use them
+.SUFFIXES:
+
+# set the shell to bash always
+SHELL := /bin/bash
+
+# ====================================================================================
+# Host information
+# This is defined earlier so that it can be used down the road
+
+# Set the host's OS. Only linux and darwin supported for now
+HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
+ifeq ($(filter darwin linux,$(HOSTOS)),)
+$(error build only supported on linux and darwin host currently)
+endif
+
+# Set the host's arch. Only amd64 support for now
+HOSTARCH := $(shell uname -m)
+ifeq ($(HOSTARCH),x86_64)
+HOSTARCH := amd64
+endif
+ifneq ($(HOSTARCH),amd64)
+ $(error build only supported on amd64 host currently)
+endif
+HOST_PLATFORM := $(HOSTOS)_$(HOSTARCH)
+
+# default target is build
+.PHONY: all
+all: build
+
+# ====================================================================================
+# Colors
+
+BLACK := $(shell printf "\033[30m")
+BLACK_BOLD := $(shell printf "\033[30;1m")
+RED := $(shell printf "\033[31m")
+RED_BOLD := $(shell printf "\033[31;1m")
+GREEN := $(shell printf "\033[32m")
+GREEN_BOLD := $(shell printf "\033[32;1m")
+YELLOW := $(shell printf "\033[33m")
+YELLOW_BOLD := $(shell printf "\033[33;1m")
+BLUE := $(shell printf "\033[34m")
+BLUE_BOLD := $(shell printf "\033[34;1m")
+MAGENTA := $(shell printf "\033[35m")
+MAGENTA_BOLD := $(shell printf "\033[35;1m")
+CYAN := $(shell printf "\033[36m")
+CYAN_BOLD := $(shell printf "\033[36;1m")
+WHITE := $(shell printf "\033[37m")
+WHITE_BOLD := $(shell printf "\033[37;1m")
+CNone := $(shell printf "\033[0m")
+
+# ====================================================================================
+# Logger
+
+TIME_LONG = `date +%Y-%m-%d' '%H:%M:%S`
+TIME_SHORT = `date +%H:%M:%S`
+TIME = $(TIME_SHORT)
+
+INFO = echo ${TIME} ${BLUE}[ .. ]${CNone}
+WARN = echo ${TIME} ${YELLOW}[WARN]${CNone}
+ERR = echo ${TIME} ${RED}[FAIL]${CNone}
+OK = echo ${TIME} ${GREEN}[ OK ]${CNone}
+FAIL = (echo ${TIME} ${RED}[FAIL]${CNone} && false)
+
+# ====================================================================================
+# Helpers
+
+ifeq ($(HOSTOS),darwin)
+SED?=sed -i '' -E
+else
+SED?=sed -i -r
+endif
+
+# ====================================================================================
+# Build Options
+
+# Set V=1 to turn on more verbose build
+V ?= 0
+ifeq ($(V),1)
+MAKEFLAGS += VERBOSE=1
+else
+MAKEFLAGS += --no-print-directory
+endif
+
+ifeq ($(V),$(filter $(V),1 2 3 4)) # Print verbose make info, iv V>0
+ifneq ($(PLATFORM),)
+VERBOSE_BUILD_INFO += PLATFORM=$(BLUE)$(PLATFORM)$(CNone)
+endif
+
+$(info ---- $(BLUE_BOLD)$(MAKECMDGOALS)$(CNone) $(VERBOSE_BUILD_INFO) )
+endif
+
+# Set DEBUG=1 to turn on a debug build
+DEBUG ?= 0
+
+# ====================================================================================
+# Platform and cross build options
+
+# all supported platforms we build for this can be set to other platforms if desired
+# we use the golang os and arch names for convenience
+PLATFORMS ?= darwin_amd64 windows_amd64 linux_amd64 linux_arm64
+
+# Set the platform to build if not currently defined
+ifeq ($(origin PLATFORM),undefined)
+
+PLATFORM := $(HOST_PLATFORM)
+
+# if the host platform is on the supported list add it to the single build target
+ifneq ($(filter $(PLATFORMS),$(HOST_PLATFORM)),)
+BUILD_PLATFORMS = $(HOST_PLATFORM)
+endif
+
+# for convenience always build the linux platform when building on mac
+ifneq ($(HOSTOS),linux)
+BUILD_PLATFORMS += linux_amd64
+endif
+
+else
+BUILD_PLATFORMS = $(PLATFORM)
+endif
+
+OS := $(word 1, $(subst _, ,$(PLATFORM)))
+ARCH := $(word 2, $(subst _, ,$(PLATFORM)))
+
+ifeq ($(HOSTOS),darwin)
+NPROCS := $(shell sysctl -n hw.ncpu)
+else
+NPROCS := $(shell nproc)
+endif
+
+# ====================================================================================
+# Setup directories and paths
+
+# include the common make file
+COMMON_SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+MAKELIB_BIN_DIR := $(abspath $(shell cd $(COMMON_SELF_DIR)/../bin && pwd -P))
+
+# the root directory of this repo
+ifeq ($(origin ROOT_DIR),undefined)
+ROOT_DIR := $(abspath $(shell cd $(COMMON_SELF_DIR)/../.. && pwd -P))
+endif
+
+# the output directory which holds final build produced artifacts
+ifeq ($(origin OUTPUT_DIR),undefined)
+OUTPUT_DIR := $(ROOT_DIR)/_output
+endif
+$(OUTPUT_DIR):
+ @mkdir -p "$@"
+
+# the output directory for staged files. The staged files are generated files which are commited to the main repo and
+# staged for being pushed to an upstream repo. (eg. generated protobuf client code)
+ifeq ($(origin STAGING_DIR),undefined)
+STAGING_DIR:= $(ROOT_DIR)/staging/src
+endif
+$(STAGING_DIR):
+ @mkdir -p "$@"
+
+# a working directory that holds all temporary or working items generated
+# during the build. The items will be discarded on a clean build and they
+# will never be cached.
+ifeq ($(origin WORK_DIR), undefined)
+WORK_DIR := $(ROOT_DIR)/.work
+endif
+$(WORK_DIR):
+ @mkdir -p "$@"
+
+# a directory that holds tools and other items that are safe to cache
+# across build invocations. removing this directory will trigger a
+# re-download and waste time. Its safe to cache this directory on CI systems
+ifeq ($(origin CACHE_DIR), undefined)
+CACHE_DIR := $(ROOT_DIR)/.cache
+endif
+$(CACHE_DIR):
+ @mkdir -p "$@"
+
+TOOLS_DIR := $(CACHE_DIR)/tools
+TOOLS_HOST_DIR := $(TOOLS_DIR)/$(HOST_PLATFORM)
+TOOLS_BIN_DIR := $(ROOT_DIR)/bin
+PATH := $(TOOLS_BIN_DIR):$(PATH)
+export PATH
+
+$(TOOLS_HOST_DIR):
+ @mkdir -p "$@"
+
+$(TOOLS_BIN_DIR):
+ @mkdir -p "$@"
+
+ifeq ($(origin HOSTNAME), undefined)
+HOSTNAME := $(shell hostname)
+endif
+
+YQ_VERSION ?= 4.24.5
+YQ_DOWNLOAD_URL ?= https://github.com/mikefarah/yq/releases/download/v$(YQ_VERSION)/yq_$(HOST_PLATFORM)
+$(eval $(call tool.download,yq,$(YQ_VERSION),$(YQ_DOWNLOAD_URL)))
+
+GIT_SEMVER_VERSION ?= 6.1.1
+GIT_SEMVER_DOWNLOAD_URL ?= https://github.com/mdomke/git-semver/releases/download/v$(GIT_SEMVER_VERSION)/git-semver_$(GIT_SEMVER_VERSION)_$(HOST_PLATFORM).tar.gz
+$(eval $(call tool.download.tar.gz,git-semver,$(GIT_SEMVER_VERSION),$(GIT_SEMVER_DOWNLOAD_URL),git-semver,0))
+
+$(TOOLS_DIR)/git-semver.mk: $(GIT_SEMVER)
+ @echo '# dummy target to require installing git-semver before making everything' > "$@"
+ @touch "$@"
+
+include $(TOOLS_DIR)/git-semver.mk
+
+# ====================================================================================
+# git introspection
+
+ifeq ($(COMMIT_HASH),)
+override COMMIT_HASH := $(shell git rev-parse HEAD)
+endif
+
+TAGS := $(shell git tag -l --points-at HEAD)
+
+ifeq ($(origin BRANCH_NAME), undefined)
+BRANCH_NAME := $(shell git rev-parse --abbrev-ref HEAD)
+endif
+
+# Set default GIT_TREE_STATE
+ifeq ($(shell git status -s | head -c1 | wc -c | tr -d '[[:space:]]'), 0)
+GIT_TREE_STATE = clean
+else
+GIT_TREE_STATE = dirty
+endif
+
+# ====================================================================================
+# Release Options
+
+CHANNEL ?= master
+ifeq ($(filter master alpha beta stable,$(CHANNEL)),)
+$(error invalid channel $(CHANNEL))
+endif
+
+REMOTE_NAME ?= origin
+REMOTE_URL ?= $(shell git remote get-url $(REMOTE_NAME))
+
+# ====================================================================================
+# Version and Tagging
+#
+
+BUILD_DATE ?= $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
+
+# set a semantic version number from git if VERSION is undefined.
+ifeq ($(origin VERSION), undefined)
+ifeq ($(GIT_TREE_STATE),clean)
+VERSION := $(shell $(GIT_SEMVER) -prefix v $(ROOT_DIR))
+else
+VERSION := $(shell $(GIT_SEMVER) -prefix v -set-meta $(shell echo "$(COMMIT_HASH)" | head -c8)-dirty $(ROOT_DIR))
+endif
+else
+endif
+export VERSION
+
+VERSION_REGEX := ^v([0-9]*)[.]([0-9]*)[.]([0-9]*)(-(alpha|beta|rc)[.][0-9]+)?(\+[[:alnum:].+_-]+)?$$
+VERSION_VALID := $(shell echo "$(VERSION)" | grep -E -q '$(VERSION_REGEX)' && echo 1 || echo 0)
+VERSION_MAJOR := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\1/')
+VERSION_MINOR := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\2/')
+VERSION_PATCH := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\3/')
+
+.publish.tag: .version.require.clean.tree
+ifneq ($(VERSION_VALID),1)
+ $(error invalid version $(VERSION). must be a semantic semver version (eg. with v[Major].[Minor].[Patch]))
+endif
+ @$(INFO) tagging commit hash $(COMMIT_HASH) with $(VERSION)
+ git tag -f -m "release $(VERSION)" $(VERSION) $(COMMIT_HASH)
+ git push $(REMOTE_NAME) $(VERSION)
+ @set -e; if ! git ls-remote --heads $(REMOTE_NAME) | grep -q refs/heads/release-$(VERSION_MAJOR).$(VERSION_MINOR); then \
+ echo === creating new release branch release-$(VERSION_MAJOR).$(VERSION_MINOR) ;\
+ git branch -f release-$(VERSION_MAJOR).$(VERSION_MINOR) $(COMMIT_HASH) ;\
+ git push $(REMOTE_NAME) release-$(VERSION_MAJOR).$(VERSION_MINOR) ;\
+ fi
+ @$(OK) tagging
+
+# fail publish if the version is dirty
+.version.require.clean.tree:
+ @if [[ $$ALLOW_DIRTY_TREE != "true" ]] && [[ $(GIT_TREE_STATE) = dirty ]]; then \
+ $(ERR) version '$(VERSION)' is dirty. The following files changed: ;\
+ git status --short;\
+ exit 1; \
+ fi
+
+.PHONY: .publish.tag .version.require.clean.tree
+
+# ====================================================================================
+# Common Targets - Build and Test workflow
+
+# A common target registers a target and calls in order the following targets
+# .TARGET.init .TARGET.run .TARGET.done
+define common.target
+.$(1).init: ; @:
+.$(1).run: ; @:
+.$(1).done: ; @:
+
+$(1):
+ @$$(MAKE) .$(1).init
+ @$$(MAKE) .$(1).run
+ @$$(MAKE) .$(1).done
+
+.PHONY: $(1) .$(1).init .$(1).run .$(1).done
+endef
+
+# lint the code
+$(eval $(call common.target,lint))
+
+# run tests
+$(eval $(call common.target,test))
+
+# run e2e tests
+$(eval $(call common.target,e2e))
+
+# run code generation (eg. compile protocol buffers, collect translations)
+$(eval $(call common.target,generate))
+
+# run code auto-formatting tools
+$(eval $(call common.target,fmt))
+
+# ====================================================================================
+# Release Targets
+
+# publish artifacts
+$(eval $(call common.target,publish))
+publish: .version.require.clean.tree
+
+# promote all artifacts to a release channel
+$(eval $(call common.target,promote))
+
+# tag a release
+tag: .publish.tag
+
+.PHONY: tag
+
+# ====================================================================================
+# Build targets
+#
+# These targets are use to build the project artifacts.
+
+# run init steps before building code
+# these will run once regardless of how many platforms we are building
+.build.init: ; @:
+
+# check the code with fmt, lint, vet and other source level checks pre build
+# these will run once regardless of how many platforms we are building
+.build.check: ; @:
+
+# check the code with fmt, lint, vet and other source level checks pre build
+# these will run for each platform being built
+.build.check.platform: ; @:
+
+# build code. this will run once regardless of platform
+.build.code: ; @:
+
+# build code. this will run for each platform built
+.build.code.platform: ; @:
+
+# build releasable artifacts. this will run once regardless of platform
+.build.artifacts: ; @:
+
+# build releasable artifacts. this will run for each platform being built
+.build.artifacts.platform: ; @:
+
+# runs at the end of the build to do any cleanup, caching etc.
+# these will run once regardless of how many platforms we are building
+.build.done: ; @:
+
+# helper targets for building multiple platforms
+.do.build.platform.%:
+ @$(MAKE) .build.check.platform PLATFORM=$*
+ @$(MAKE) .build.code.platform PLATFORM=$*
+.do.build.platform: $(foreach p,$(PLATFORMS), .do.build.platform.$(p))
+
+# helper targets for building multiple platforms
+.do.build.artifacts.%:
+ @$(MAKE) .build.artifacts.platform PLATFORM=$*
+.do.build.artifacts: $(foreach p,$(PLATFORMS), .do.build.artifacts.$(p))
+
+# build for all platforms
+build.all:
+ @$(MAKE) .build.init
+ @$(MAKE) .build.check
+ @$(MAKE) .build.code
+ @$(MAKE) .do.build.platform
+ @$(MAKE) .build.artifacts
+ @$(MAKE) .do.build.artifacts
+ @$(MAKE) .build.done
+
+# build for a single platform if it's supported
+build:
+ifneq ($(BUILD_PLATFORMS),)
+ @$(MAKE) build.all PLATFORMS="$(BUILD_PLATFORMS)"
+else
+ @:
+endif
+
+# Install required build tools. This can be used to generate a docker container with all the required tools for example.
+build.tools: |$(TOOLS_HOST_DIR)
+
+# clean all files created during the build.
+clean:
+ @rm -fr $(OUTPUT_DIR) $(WORK_DIR)
+
+# clean all files created during the build, including caches across builds
+distclean: clean
+ @rm -fr $(CACHE_DIR)
+
+.PHONY: .build.init .build.check .build.check.platform .build.code .build.code.platform .build.artifacts .build.artifacts.platform
+.PHONY: .build.done .do.build.platform.% .do.build.platform .do.build.artifacts.% .do.build.artifacts
+.PHONY: build.tools build.info build.all build clean distclean
+
+build.info:
+ @echo "build version: $(VERSION)"
+ @echo "git commit: $(COMMIT_HASH)"
+ @echo "git branch: $(BRANCH_NAME)"
+ @echo "git tree state: $(GIT_TREE_STATE)"
+ @echo "git tags: $(TAGS)"
+
+# ====================================================================================
+# Help
+
+define HELPTEXT
+Usage: make [make-options] [options]
+
+Common Targets:
+ build Build source code and other artifacts for host platform.
+ build.all Build source code and other artifacts for all platforms.
+ build.tools Install the required build tools.
+ build.vars Show build vars.
+ clean Remove all files created during the build.
+ distclean Remove all files created during the build including cached tools.
+ generate Run code generation tools.
+ fmt Run code auto-formatting tools.
+ lint Run lint and code analysis tools.
+ test Runs unit tests.
+ e2e Runs end-to-end integration tests.
+ translate Collect translation strings and post-process the .pot/.po files.
+ help Show this help info.
+
+Common Options:
+ DEBUG Whether to generate debug symbols. Default is 0.
+ PLATFORM The platform to build.
+ SUITE The test suite to run.
+ TESTFILTER Tests to run in a suite.
+ V Build verbosity level (1-4). Default is 0.
+
+Release Targets:
+ publish Build and publish final releasable artifacts
+ promote Promote a release to a release channel
+ tag Tag a release
+
+Release Options:
+ VERSION The version information for binaries and releases.
+ CHANNEL Sets the release channel. Can be set to master, alpha, beta, or stable.
+
+endef
+export HELPTEXT
+
+.help: ; @:
+
+help:
+ @echo "$$HELPTEXT"
+ @$(MAKE) .help
+
+.PHONY: help .help
+
+endif # __COMMON_MAKEFILE__
diff --git a/build/makelib/gcp.mk b/build/makelib/gcp.mk
new file mode 100644
index 00000000..28f3f87f
--- /dev/null
+++ b/build/makelib/gcp.mk
@@ -0,0 +1,32 @@
+# Copyright 2019 Pressinfra SRL. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __GOOGLE_CLOUD_MAKEFILE__
+__GOOGLE_CLOUD_MAKEFILE__ := included
+
+ifeq ($(origin GOOGLE_CLOUD_PROJECT),undefined)
+ifneq ($(GCLOUD_PROJECT),)
+GOOGLE_CLOUD_PROJECT := $(GCLOUD_PROJECT)
+else
+GOOGLE_CLOUD_PROJECT := $(shell gcloud config get-value project)
+endif
+endif
+
+ifeq ($(GOOGLE_CLOUD_PROJECT),)
+$(error Could not determine current Google Cloud Project. Set the GOOGLE_CLOUD_PROJECT environment variable or set with `gcloud config`)
+else
+export GOOGLE_CLOUD_PROJECT
+endif
+
+endif # __GOOGLE_CLOUD_MAKEFILE__
diff --git a/build/makelib/gettext.mk b/build/makelib/gettext.mk
new file mode 100644
index 00000000..bd163cfa
--- /dev/null
+++ b/build/makelib/gettext.mk
@@ -0,0 +1,81 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __GETTEXT_MAKEFILE__
+__GETTEXT_MAKEFILE__ := included
+
+# ====================================================================================
+# Options
+
+# ====================================================================================
+# Translations
+
+# The list of languages to generate translations for
+LANGUAGES ?=
+
+LOCALES_DIR ?= $(ROOT_DIR)/locales
+$(LOCALES_DIR):
+ @mkdir -p $(LOCALES_DIR)
+
+ifeq ($(LANGUAGES),)
+$(error You must specify the LANGUAGES variable in order to handle translations)
+endif
+
+ifeq ($(HOSTOS),darwin)
+MSGFMT = /usr/local/opt/gettext/bin/msgfmt
+MSGMERGE = /usr/local/opt/gettext/bin/msgmerge
+else
+MSGFMT = msgfmt
+MSGMERGE = msgmerge
+endif
+
+PO_FILES := $(shell find $(LOCALES_DIR) -name '*.po')
+POT_FILES := $(shell find $(LOCALES_DIR) -mindepth 1 -maxdepth 1 -name '*.pot')
+
+# lint the code
+$(eval $(call common.target,translations))
+
+gettext.lint:
+ @$(INFO) msgfmt check
+ $(foreach p,$(PO_FILES),@$(MSGFMT) -c $(p) || $(FAIL) ${\n})
+ @$(OK) msgfmt check
+
+.gettext.merge:
+ @$(INFO) msgmerge
+ $(foreach l,$(LANGUAGES),@mkdir -p $(LOCALES_DIR)/$(l) || $(FAIL) ${\n})
+ $(foreach pot,$(POT_FILES),$(foreach l,$(LANGUAGES), \
+ @touch $(LOCALES_DIR)/$(l)/$(basename $(notdir $(pot))).po || $(FAIL) ${\n} \
+ @$(MSGMERGE) -q --no-wrap --sort-output --no-fuzzy-matching --lang=$(l) -U "$(LOCALES_DIR)/$(l)/$(basename $(notdir $(pot))).po" "$(pot)" || $(FAIL) ${\n} \
+ ))
+ @find $(LOCALES_DIR) -name '*.po~' -delete
+ @find $(LOCALES_DIR) -name '*.pot~' -delete
+ @$(OK) msgmerge
+
+.gettext.build:
+ @$(INFO) copying translations
+ @rm -rf $(OUTPUT_DIR)/locales
+ @cp -a $(LOCALES_DIR) $(OUTPUT_DIR)/locales
+ @$(OK) copying translations
+
+.PHONY: gettext.lint .gettext.build .gettext.merge
+
+# ====================================================================================
+# Common Targets
+.lint.run: gettext.lint
+
+.translations.run: .gettext.merge
+
+.build.code: .gettext.build
+
+endif # __GETTEXT_MAKEFILE__
diff --git a/build/makelib/git-publish.mk b/build/makelib/git-publish.mk
new file mode 100644
index 00000000..31947de0
--- /dev/null
+++ b/build/makelib/git-publish.mk
@@ -0,0 +1,147 @@
+# Copyright 2019 The Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __GIT_PUBLISH_MAKEFILE__
+__GIT_PUBLISH_MAKEFILE__ := included
+
+# ====================================================================================
+# Options
+
+PUBLISH_BRANCH ?= master
+PUBLISH_PREFIX ?= /
+PUBLISH_TAGS ?= true
+
+ifeq ($(PUBLISH_DIRS),)
+PUBLISH_DIR ?= $(CURDIR:$(abspath $(ROOT_DIR))/%=%)
+endif
+
+PUBLISH_WORK_BRANCH := build/split-$(COMMIT_HASH)/$(PUBLISH_DIR)
+PUBLISH_WORK_DIR := $(WORK_DIR)/git-publish/$(PUBLISH_DIR)
+PUBLISH_GIT := git -C $(PUBLISH_WORK_DIR)
+
+GIT_MERGE_ARGS ?= --ff-only
+GIT_SUBTREE_MERGE_ARGS ?= --squash
+ifeq ($(PUBLISH_TAGS),true)
+GIT_PUSH_ARGS := --follow-tags
+endif
+
+PUBLISH_DIRS ?= $(PUBLISH_DIR)
+
+# ====================================================================================
+# git publish targets
+
+git.urlize = $(patsubst %,https://%,$(patsubst %.git,%,$(patsubst https://%,%,$(patsubst git@github.com:%,https://github.com/%,$(1)))))
+git.workbranch = build/split-$(COMMIT_HASH)/$(1)
+
+# 1 publish directory
+define git.publish
+
+$(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1)):
+ @$(INFO) git subtree split $(1)
+ @cd $(ROOT_DIR) && git subtree split -q -P $(1) -b $(call git.workbranch,$(1)) $(COMMIT_HASH)
+ @$(OK) git subtree split $(1)
+.PHONY: .git.build.artifacts.$(1)
+.git.build.artifacts.$(1): $(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1))
+.git.build.artifacts: .git.build.artifacts.$(1)
+
+.PHONY: .git.clean.$(1)
+.git.clean.$(1):
+ @cd $(ROOT_DIR) && git branch -D $(call git.workbranch,$(1)) || true
+.git.clean: .git.clean.$(1)
+
+.PHONY: .do.git.publish.$(1)
+.do.git.publish.$(1): |$(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1))
+ @$(MAKE) -C $(1) .git.publish
+
+endef
+
+ifeq ($(filter-out $(PUBLISH_DIR),$(PUBLISH_DIRS)),)
+.git.publish: |$(ROOT_DIR)/.git/refs/heads/$(PUBLISH_WORK_BRANCH)
+ @$(INFO) Publishing $(1) to $(PUBLISH_REPO)@$(PUBLISH_BRANCH) under $(PUBLISH_PREFIX)
+ @rm -rf $(PUBLISH_WORK_DIR) && mkdir -p $(PUBLISH_WORK_DIR)
+ @$(PUBLISH_GIT) init -q
+ @$(PUBLISH_GIT) remote add origin $(PUBLISH_REPO)
+ @$(PUBLISH_GIT) remote add upstream $(ROOT_DIR)/.git
+ @$(PUBLISH_GIT) fetch -q upstream +refs/heads/$(PUBLISH_WORK_BRANCH):
+ @$(PUBLISH_GIT) checkout -q -b $(PUBLISH_BRANCH)
+ @set -e; cd $(PUBLISH_WORK_DIR); if git ls-remote --heads origin | grep -q refs/heads/$(PUBLISH_BRANCH); then \
+ $(PUBLISH_GIT) fetch -q origin +refs/heads/$(PUBLISH_BRANCH): ;\
+ $(PUBLISH_GIT) reset -q --hard origin/$(PUBLISH_BRANCH) ;\
+ $(PUBLISH_GIT) branch -q -u origin/$(PUBLISH_BRANCH) ;\
+ fi
+ifeq ($(PUBLISH_PREFIX),/)
+ @set -e; \
+ $(PUBLISH_GIT) merge -q $(GIT_MERGE_ARGS) \
+ -m "Merge '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \
+ upstream/$(PUBLISH_WORK_BRANCH) ;\
+ if [ "$(PUBLISH_TAGS)" == "true" ] ; then \
+ for t in $(TAGS) ; do \
+ $(PUBLISH_GIT) tag -a -m "$$t" $$t ;\
+ done ;\
+ fi
+else
+ @set -e; \
+ if [ -d "$(PUBLISH_WORK_DIR)/$(PUBLISH_PREFIX)" ] ; then \
+ $(PUBLISH_GIT) subtree -q merge -P $(PUBLISH_PREFIX) $(GIT_SUBTREE_MERGE_ARGS) \
+ -m "Merge '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \
+ upstream/$(PUBLISH_WORK_BRANCH) ;\
+ else \
+ $(PUBLISH_GIT) subtree add -q -P $(PUBLISH_PREFIX) $(GIT_SUBTREE_MERGE_ARGS) \
+ -m "Add '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \
+ $(ROOT_DIR)/.git $(PUBLISH_WORK_BRANCH) ;\
+ fi
+endif
+ @$(PUBLISH_GIT) push -u origin $(GIT_PUSH_ARGS) $(PUBLISH_BRANCH)
+ @$(OK) Published $(1) to $(PUBLISH_REPO)@$(PUBLISH_BRANCH)
+else
+.git.publish: $(foreach d,$(PUBLISH_DIRS),.do.git.publish.$(d))
+endif
+
+$(foreach d,$(PUBLISH_DIRS), $(eval $(call git.publish,$(d))))
+
+.PHONY: .git.clean .git.build.artifacts .git.publish
+
+# ====================================================================================
+# Common Targets
+
+# if PUBLISH_DIRS is defined the invoke publish for each dir
+ifneq ($(filter-out $(PUBLISH_DIR),$(PUBLISH_DIRS)),)
+
+.publish.init: .git.build.artifacts
+clean: .git.clean
+
+# only publish for master and release branches
+# also, if publishing for tags is enabled,
+# publish if the current commit is a tag
+ifneq ($(filter master release-%,$(BRANCH_NAME)),)
+.publish.run: $(addprefix .do.git.publish.,$(PUBLISH_DIRS))
+else ifeq ($(PUBLISH_TAGS),true)
+ifneq ($(TAGS),)
+.publish.run: $(addprefix .do.git.publish.,$(PUBLISH_DIRS))
+endif
+endif
+
+else # assume this .mk file is being included for a single dir
+
+ifeq ($(PUBLISH_REPO),)
+$(error You must specify the PUBLISH_REPO variable in order to handle git publishing)
+endif
+
+.publish.init: .git.build.artifacts
+clean: .git.clean
+
+endif # PUBLISH_DIRS
+
+
+endif # __GIT_PUBLISH_MAKEFILE__
diff --git a/build/makelib/golang.mk b/build/makelib/golang.mk
new file mode 100644
index 00000000..3b7da7be
--- /dev/null
+++ b/build/makelib/golang.mk
@@ -0,0 +1,447 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __GOLANG_MAKEFILE__
+__GOLANG_MAKEFILE__ := included
+
+# ====================================================================================
+# Options
+
+# The go project including repo name, for example, github.com/rook/rook
+GO_PROJECT ?= $(PROJECT_REPO)
+
+# Optional. These are subdirs that we look for all go files to test, vet, and fmt
+GO_SUBDIRS ?= cmd pkg
+
+# Optional. Additional subdirs used for integration or e2e testings
+GO_INTEGRATION_TESTS_SUBDIRS ?=
+
+# Optional directories (relative to CURDIR)
+GO_VENDOR_DIR ?= vendor
+GO_PKG_DIR ?= $(WORK_DIR)/pkg
+GO_CACHE_DIR ?= $(CACHE_DIR)/go
+
+# Optional build flags passed to go tools
+GO_BUILDFLAGS ?=
+GO_LDFLAGS ?=
+GO_TAGS ?=
+GO_TEST_TOOL ?= ginkgo
+GO_TEST_FLAGS ?=
+GO_TEST_SUITE ?=
+GO_NOCOV ?=
+
+GO_SRCS := $(shell find $(GO_SUBDIRS) -type f -name '*.go' | grep -v '_test.go')
+
+# ====================================================================================
+# Setup go environment
+
+# turn on more verbose build when V=2
+ifeq ($(V),2)
+GO_LDFLAGS += -v -n
+GO_BUILDFLAGS += -x
+endif
+
+# whether to generate debug information in binaries. this includes DWARF and symbol tables.
+ifeq ($(DEBUG),0)
+GO_LDFLAGS += -s -w
+endif
+
+# supported go versions
+GO_SUPPORTED_VERSIONS ?= 1.17|1.18
+
+# set GOOS and GOARCH
+GOOS := $(OS)
+GOARCH := $(ARCH)
+GOCACHE := $(GO_CACHE_DIR)
+export GOOS GOARCH GOCACHE
+
+# set GOOS and GOARCH
+GOHOSTOS := $(HOSTOS)
+GOHOSTARCH := $(HOSTARCH)
+
+GO_PACKAGES := $(foreach t,$(GO_SUBDIRS),$(GO_PROJECT)/$(t)/...)
+GO_TEST_PACKAGES ?= $(shell go list -f '{{ if or .TestGoFiles .XTestGoFiles }}{{ .ImportPath }}{{ end }}' $(foreach t,$(GO_SUBDIRS),$(GO_PROJECT)/$(t)/...))
+GO_INTEGRATION_TEST_PACKAGES ?= $(foreach t,$(GO_INTEGRATION_TESTS_SUBDIRS),$(GO_PROJECT)/$(t)/integration)
+
+ifneq ($(GO_TEST_PARALLEL),)
+GO_TEST_FLAGS += -p $(GO_TEST_PARALLEL)
+endif
+
+ifneq ($(GO_TEST_SUITE),)
+ifeq ($(GO_TEST_TOOL),ginkgo)
+GO_TEST_FLAGS += -focus '$(GO_TEST_SUITE)'
+else # GO_TEST_TOOL != ginkgo
+GO_TEST_FLAGS += -run '$(GO_TEST_SUITE)'
+endif # GO_TEST_TOOL
+endif # GO_TEST_SUITE
+
+GOPATH := $(shell go env GOPATH)
+
+GO := go
+GOHOST := GOOS=$(GOHOSTOS) GOARCH=$(GOHOSTARCH) $(GO)
+GO_VERSION := $(shell $(GO) version | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p')
+
+GO_BIN_DIR := $(abspath $(OUTPUT_DIR)/bin)
+GO_OUT_DIR := $(GO_BIN_DIR)/$(PLATFORM)
+GO_TEST_DIR := $(abspath $(OUTPUT_DIR)/tests)
+GO_TEST_OUTPUT := $(GO_TEST_DIR)/$(PLATFORM)
+GO_LINT_DIR := $(abspath $(OUTPUT_DIR)/lint)
+GO_LINT_OUTPUT := $(GO_LINT_DIR)/$(PLATFORM)
+
+ifeq ($(GOOS),windows)
+GO_OUT_EXT := .exe
+endif
+
+ifeq ($(GO_TEST_TOOL),ginkgo)
+GO_TEST_FLAGS += -randomize-all -randomize-suites
+endif
+
+# NOTE: the install suffixes are matched with the build container to speed up the
+# the build. Please keep them in sync.
+
+# we run go build with -i which on most system's would want to install packages
+# into the system's root dir. using our own pkg dir avoid thats
+ifneq ($(GO_PKG_DIR),)
+GO_PKG_BASE_DIR := $(abspath $(GO_PKG_DIR)/$(PLATFORM))
+GO_PKG_STATIC_FLAGS := -pkgdir $(GO_PKG_BASE_DIR)_static
+endif
+
+GO_COMMON_FLAGS = $(GO_BUILDFLAGS) -tags '$(GO_TAGS)'
+GO_STATIC_FLAGS = $(GO_COMMON_FLAGS) $(GO_PKG_STATIC_FLAGS) -installsuffix static -ldflags '$(GO_LDFLAGS)'
+GO_GENERATE_FLAGS = $(GO_BUILDFLAGS) -tags 'generate $(GO_TAGS)'
+GO_XGETTEXT_ARGS ?=
+GO_LOCALE_PREFIX ?= default
+
+export GO111MODULE
+
+# switch for go modules
+ifeq ($(GO111MODULE),on)
+
+# set GOPATH to $(GO_PKG_DIR), so that the go modules are installed there, instead of the default $HOME/go/pkg/mod
+export GOPATH=$(abspath $(GO_PKG_DIR))
+
+GO_SRCS += go.mod go.sum
+
+else
+
+GO_SRCS += Gopkg.toml Gopkg.lock
+
+endif
+
+# ====================================================================================
+# Go Tools macros
+
+# Creates a target for downloading and compiling a go tool from source
+# 1 tool, 2 version, 3 tool url, 4 go env vars
+define tool.go.get
+$(call tool,$(1),$(2))
+
+$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} go get $(3)@$(2)
+ @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL)
+ @mkdir -p $$(TOOLS_DIR)/go/$(1)-v$(2)/ && cd $$(TOOLS_DIR)/go/$(1)-v$(2)/ && $(GOHOST) mod init tools && \
+ $(4) GO111MODULE=on GOPATH=$$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) $(GOHOST) get -u $(3)@$(2) || $$(FAIL)
+ @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type f -print0 | xargs -0 chmod 0644 || $$(FAIL)
+ @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type d -print0 | xargs -0 chmod 0755 || $$(FAIL)
+ @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/bin/$(1) $$@ || $$(FAIL)
+ @chmod +x $$@
+ @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)
+ @$$(OK) go get $(3)
+endef # tool.go.get
+
+# Creates a target for installing a go tool from source
+# 1 tool, 2 version, 3 tool url, 4 go env vars
+define tool.go.install
+$(call tool,$(1),$(2))
+
+$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} go install $(3)@$(2)
+ @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL)
+ @mkdir -p $$(TOOLS_DIR)/go/$(1)-v$(2)/ && cd $$(TOOLS_DIR)/go/$(1)-v$(2)/ && $(GOHOST) mod init tools && \
+ $(4) GO111MODULE=on GOPATH=$$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) $(GOHOST) install $(3)@$(2) || $$(FAIL)
+ @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type f -print0 | xargs -0 chmod 0644 || $$(FAIL)
+ @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type d -print0 | xargs -0 chmod 0755 || $$(FAIL)
+ @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/bin/$(1) $$@ || $$(FAIL)
+ @chmod +x $$@
+ @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)
+ @$$(OK) go install $(3)
+endef # tool.go.install
+
+# Creates a target for compiling a vendored go tool
+# 1 tool, 2 package
+define tool.go.vendor.install
+$(subst -,_,$(call upper,$(1))) := $$(TOOLS_BIN_DIR)/$(1)
+
+build.tools: $$(TOOLS_BIN_DIR)/$(1)
+$$(TOOLS_BIN_DIR)/$(1): vendor/$(2)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} installing go vendored $(2)
+ @GOBIN=$$(TOOLS_BIN_DIR) $$(GOHOST) install ./vendor/$(2)
+ @$$(OK) installing go vendored $(2)
+
+endef # tool.go.vendor.install
+
+# ====================================================================================
+# Tools install targets
+
+ifneq ($(GO111MODULE),on)
+DEP_VERSION ?= 0.5.4
+DEP_DOWNLOAD_URL ?= https://github.com/golang/dep/releases/download/v$(DEP_VERSION)/dep-$(HOSTOS)-$(HOSTARCH)
+$(eval $(call tool.download,dep,$(DEP_VERSION),$(DEP_DOWNLOAD_URL)))
+endif
+
+GOLANGCI_LINT_VERSION ?= 1.45.2
+GOLANGCI_LINT_DOWNLOAD_URL ?= https://github.com/golangci/golangci-lint/releases/download/v$(GOLANGCI_LINT_VERSION)/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOSTOS)-$(HOSTARCH).tar.gz
+$(eval $(call tool.download.tar.gz,golangci-lint,$(GOLANGCI_LINT_VERSION),$(GOLANGCI_LINT_DOWNLOAD_URL)))
+
+ifneq ($(LANGUAGES),)
+GO_XGETTEXT_VERSION ?= v0.0.0-20180127124228-c366ce0fe48d
+GO_XGETTEXT_URL ?= github.com/presslabs/gettext/go-xgettext
+$(eval $(call tool.go.install,go-xgettext,$(GO_XGETTEXT_VERSION),$(GO_XGETTEXT_URL)))
+endif
+
+# we use a consistent version of gofmt even while running different go compilers.
+# see https://github.com/golang/go/issues/26397 for more details
+GOFMT_VERSION ?= 1.18.1
+GOFMT_DOWNLOAD_URL ?= https://dl.google.com/go/go$(GOFMT_VERSION).$(HOSTOS)-$(HOSTARCH).tar.gz
+ifneq ($(findstring $(GOFMT_VERSION),$(GO_VERSION)),)
+GOFMT := $(shell which gofmt)
+else
+$(eval $(call tool.download.tar.gz,gofmt,$(GOFMT_VERSION),$(GOFMT_DOWNLOAD_URL),bin/gofmt))
+endif
+
+GOIMPORTS_VERSION ?= v0.1.10
+GOIMPORTS_URL ?= golang.org/x/tools/cmd/goimports
+$(eval $(call tool.go.install,goimports,$(GOIMPORTS_VERSION),$(GOIMPORTS_URL)))
+
+ifeq ($(GO_TEST_TOOL),ginkgo)
+GINKGO_VERSION ?= v2.1.4
+GINKGO_URL ?= github.com/onsi/ginkgo/v2/ginkgo
+$(eval $(call tool.go.install,ginkgo,$(GINKGO_VERSION),$(GINKGO_URL)))
+else # GO_TEST_TOOL != ginkgo
+GO_JUNIT_REPORT_VERSION ?= v0.9.2-0.20191008195320-984a47ca6b0a
+GO_JUNIT_REPORT_URL ?= github.com/jstemmer/go-junit-report
+$(eval $(call tool.go.install,go-junit-report,$(GO_JUNIT_REPORT_VERSION),$(GO_JUNIT_REPORT_URL),go-junit-report))
+endif # GO_TEST_TOOL
+
+# ====================================================================================
+# Go Targets
+
+.go.init:
+ @if ! `$(GO) version | grep -q -E '\bgo($(GO_SUPPORTED_VERSIONS))\b'`; then \
+ $(ERR) unsupported go version. Please make install one of the following supported version: '$(GO_SUPPORTED_VERSIONS)' ;\
+ exit 1 ;\
+ fi
+ @if [ "$(GO111MODULE)" != "on" ] && [ "$(realpath ../../../..)" != "$(realpath $(GOPATH))" ]; then \
+ $(WARN) the source directory is not relative to the GOPATH at $(GOPATH) or you are you using symlinks. The build might run into issue. Please move the source directory to be at $(GOPATH)/src/$(GO_PROJECT) ;\
+ fi
+
+# common target for building a node js project
+$(eval $(call common.target,go.build))
+.go.build.run: .do.go.build
+.do.go.build:
+ @$(INFO) go build $(PLATFORM) $(GO_TAGS)
+ $(foreach p,$(GO_STATIC_PACKAGES),@CGO_ENABLED=0 $(GO) build -v -i -o $(GO_OUT_DIR)/$(call list-join,_,$(lastword $(subst /, ,$(p))) $(call lower,$(GO_TAGS)))$(GO_OUT_EXT) $(GO_STATIC_FLAGS) $(p) || $(FAIL) ${\n})
+ @$(OK) go build $(PLATFORM) $(GO_TAGS)
+
+ifeq ($(GO_TEST_TOOL),ginkgo)
+go.test.unit: $(GINKGO)
+ @$(INFO) ginkgo unit-tests
+ @mkdir -p $(GO_TEST_OUTPUT)
+ @CGO_ENABLED=0 $(GINKGO) $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(patsubst $(ROOT_DIR)/%,./%,$(shell go list -f '{{ .Dir }}' $(GO_TEST_PACKAGES))) || $(FAIL)
+ @$(OK) go test unit-tests
+
+go.test.integration: $(GINKGO)
+ @$(INFO) ginkgo integration-tests
+ @mkdir -p $(GO_TEST_OUTPUT) || $(FAIL)
+ @CGO_ENABLED=0 $(GINKGO) $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(foreach t,$(GO_INTEGRATION_TESTS_SUBDIRS),./$(t)/...) $(TEST_FILTER_PARAM) || $(FAIL)
+ @$(OK) go test integration-tests
+
+else # GO_TEST_TOOL != ginkgo
+go.test.unit: $(GO_JUNIT_REPORT)
+ @$(INFO) go test unit-tests
+ @mkdir -p $(GO_TEST_OUTPUT)
+ @CGO_ENABLED=0 $(GOHOST) test -i $(GO_STATIC_FLAGS) $(GO_TEST_PACKAGES) || $(FAIL)
+ @CGO_ENABLED=0 $(GOHOST) test $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(GO_TEST_PACKAGES) $(TEST_FILTER_PARAM) 2>&1 | tee $(GO_TEST_OUTPUT)/unit-tests.log || $(FAIL)
+ @cat $(GO_TEST_OUTPUT)/unit-tests.log | $(GO_JUNIT_REPORT) -set-exit-code > $(GO_TEST_OUTPUT)/unit-tests.xml || $(FAIL)
+ @$(OK) go test unit-tests
+
+go.test.integration: $(GO_JUNIT_REPORT)
+ @$(INFO) go test integration-tests
+ @mkdir -p $(GO_TEST_OUTPUT) || $(FAIL)
+ @CGO_ENABLED=0 $(GOHOST) test -i $(GO_STATIC_FLAGS) $(GO_INTEGRATION_TEST_PACKAGES) || $(FAIL)
+ @CGO_ENABLED=0 $(GOHOST) test $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(GO_INTEGRATION_TEST_PACKAGES) $(TEST_FILTER_PARAM) 2>&1 | tee $(GO_TEST_OUTPUT)/integration-tests.log || $(FAIL)
+ @cat $(GO_TEST_OUTPUT)/integration-tests.log | $(GO_JUNIT_REPORT) -set-exit-code > $(GO_TEST_OUTPUT)/integration-tests.xml || $(FAIL)
+ @$(OK) go test integration-tests
+
+endif # GO_TEST_TOOL
+
+$(GO_LINT_OUTPUT)/stylecheck.xml: $(GO_SRCS) $(GOLANGCI_LINT)
+ @$(INFO) golangci-lint
+ @mkdir -p $(GO_LINT_OUTPUT)
+ @$(GOLANGCI_LINT) run $(GO_LINT_ARGS) || $(FAIL)
+ @touch $(GO_LINT_OUTPUT)/stylecheck.xml
+ @$(OK) golangci-lint
+
+go.lint: $(GO_LINT_OUTPUT)/stylecheck.xml
+
+go.fmt.verify: $(GOFMT) .go.imports.verify
+ @$(INFO) go fmt verify
+ @gofmt_out=$$($(GOFMT) -s -d -e $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) 2>&1) && [ -z "$${gofmt_out}" ] || (echo "$${gofmt_out}" 1>&2; $(FAIL))
+ @$(OK) go fmt verify
+
+go.fmt: $(GOFMT) .go.imports.fix
+ @$(INFO) gofmt simplify
+ @$(GOFMT) -l -s -w $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) || $(FAIL)
+ @$(OK) gofmt simplify
+
+.go.imports.verify: $(GOIMPORTS)
+ @$(INFO) goimports verify
+ @goimports_out=$$($(GOIMPORTS) -d -e -local $(GO_PROJECT) $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) 2>&1) && [ -z "$${goimports_out}" ] || (echo "$${goimports_out}" 1>&2; $(FAIL))
+ @$(OK) goimports verify
+
+.go.imports.fix: $(GOIMPORTS)
+ @$(INFO) goimports fix
+ @$(GOIMPORTS) -l -w -local $(GO_PROJECT) $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) || $(FAIL)
+ @$(OK) goimports fix
+
+ifeq ($(GO111MODULE),on)
+
+.go.vendor.lite go.vendor.check:
+ @$(INFO) verify dependencies have expected content
+ @$(GOHOST) mod verify || $(FAIL)
+ @$(OK) go modules dependencies verified
+
+go.vendor.update:
+ @$(INFO) update go modules
+ @$(GOHOST) get -u ./... || $(FAIL)
+ @$(OK) update go modules
+
+go.vendor:
+ @$(INFO) go mod vendor
+ @$(GOHOST) mod vendor || $(FAIL)
+ @$(OK) go mod vendor
+
+else
+
+.go.vendor.lite: $(DEP)
+# dep ensure blindly updates the whole vendor tree causing everything to be rebuilt. This workaround
+# will only call dep ensure if the .lock file changes or if the vendor dir is non-existent.
+ @if [ ! -d $(GO_VENDOR_DIR) ]; then \
+ $(MAKE) go.vendor; \
+ elif ! $(DEP) ensure -no-vendor -dry-run &> /dev/null; then \
+ $(MAKE) go.vendor; \
+ fi
+
+go.vendor.check: $(DEP)
+ @$(INFO) checking if vendor deps changed
+ @$(DEP) check -skip-vendor || $(FAIL)
+ @$(OK) vendor deps have not changed
+
+go.vendor.update: $(DEP)
+ @$(INFO) updating vendor deps
+ @$(DEP) ensure -update -v || $(FAIL)
+ @$(OK) updating vendor deps
+
+go.vendor: $(DEP)
+ @$(INFO) dep ensure
+ @$(DEP) ensure || $(FAIL)
+ @$(OK) dep ensure
+
+endif
+
+.go.clean:
+ @# `go modules` creates read-only folders under WORK_DIR
+ @# make all folders within WORK_DIR writable, so they can be deleted
+ @if [ -d $(WORK_DIR) ]; then chmod -R +w $(WORK_DIR); fi
+
+ @rm -fr $(GO_BIN_DIR) $(GO_TEST_DIR)
+
+.go.distclean:
+ @rm -rf $(GO_VENDOR_DIR) $(GO_PKG_DIR)
+
+go.generate: $(GOIMPORTS)
+ @$(INFO) go generate $(PLATFORM)
+ @CGO_ENABLED=0 $(GOHOST) generate $(GO_GENERATE_FLAGS) $(GO_PACKAGES) $(GO_INTEGRATION_TEST_PACKAGES) || $(FAIL)
+ @find $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) -type f -name 'zz_generated*' -exec $(GOIMPORTS) -l -w -local $(GO_PROJECT) {} \;
+ @$(OK) go generate $(PLATFORM)
+
+ifneq ($(LANGUAGES),)
+.PHONY: go.collect-translations
+go.collect-translations: $(GO_XGETTEXT) |$(WORK_DIR)
+ @$(INFO) go-xgettext collect translations
+ @$(GO_XGETTEXT) -sort-output -output "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" $(GO_XGETTEXT_ARGS) \
+ $(shell find $(GO_SUBDIRS) $(STAGING_DIR) -type f -name '*.go' -not -name '*test.go' -not -name '*pb.go')
+ @$(SED) 's|$(STAGING_DIR)/||g' "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" || $(FAIL)
+ $(foreach p,$(GO_SUBDIRS),@$(SED) 's|([[:space:]])($(p)/[[:alnum:]/]+.go)|\1$(GO_PROJECT)/\2|g' "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" || $(FAIL) ${\n})
+#
+# Update the .pot file only if there are changes to actual messages. We need this because the collector always updates
+# the POT-Creation-Date
+#
+ @$(MAKELIB_BIN_DIR)/po-diff.sh $(LOCALES_DIR)/$(GO_LOCALE_PREFIX).pot $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot || \
+ mv $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot $(LOCALES_DIR)/$(GO_LOCALE_PREFIX).pot
+ @rm -f $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot
+#
+ @$(OK) go-xgettext collect translations
+
+.translations.init: go.collect-translations
+endif
+
+.PHONY: .go.init .do.go.build go.test.unit go.test.integration go.test.codecov go.lint go.fmt go.generate
+.PHONY: .go.vendor.lite go.vendor go.vendor.check go.vendor.update .go.clean .go.distclean
+
+# ====================================================================================
+# Common Targets
+
+.build.init: .go.init .go.vendor.lite
+.build.check: go.lint
+.build.code.platform: go.build
+.clean: .go.clean
+.distclean: .go.distclean
+
+.lint.init: .go.init
+.lint.run: go.fmt.verify go.lint
+
+.test.init: .go.init
+.test.run: go.test.unit
+
+.e2e.init: .go.init
+.e2e.run: go.test.integration
+
+.fmt.run: go.fmt
+
+.generate.run: go.generate
+
+# ====================================================================================
+# Special Targets
+
+define GO_HELPTEXT
+Go Targets:
+ go.vendor Updates vendor packages.
+ go.vendor.check Fail the build if vendor packages have changed.
+ go.vendor.update Update vendor dependencies.
+
+Go Options:
+ GO_TEST_PACKAGES Packages to run the tests for.
+ GO_TEST_SUITE Regex filter for the tests.
+
+endef
+export GO_HELPTEXT
+
+.PHONY: .go.help
+.go.help:
+ @echo "$$GO_HELPTEXT"
+
+.help: .go.help
+
+endif # __GOLANG_MAKEFILE__
diff --git a/build/makelib/helm.mk b/build/makelib/helm.mk
new file mode 100644
index 00000000..1ba313dc
--- /dev/null
+++ b/build/makelib/helm.mk
@@ -0,0 +1,141 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __HELM_MAKEFILE__
+__HELM_MAKEFILE__ := included
+
+include $(COMMON_SELF_DIR)/k8s-tools.mk
+
+# the charts directory
+HELM_CHARTS_DIR ?= deploy/charts
+
+HELM_CHARTS ?= $(patsubst $(HELM_CHARTS_DIR)/%,%,$(shell find $(HELM_CHARTS_DIR) -mindepth 1 -maxdepth 1 -type d))
+
+# the base url where helm charts are published
+# ifeq ($(HELM_BASE_URL),)
+# $(error the variable HELM_BASE_URL must be set prior to including helm.mk)
+# endif
+
+# the charts output directory
+HELM_OUTPUT_DIR ?= $(OUTPUT_DIR)/charts
+
+# the helm index file
+HELM_INDEX := $(HELM_OUTPUT_DIR)/index.yaml
+
+# helm home
+HELM_HOME := $(abspath $(WORK_DIR)/helm)
+HELM_CHARTS_WORK_DIR := $(abspath $(WORK_DIR)/charts)
+export HELM_HOME
+
+# remove the leading `v` for helm chart versions
+HELM_CHART_VERSION := $(VERSION:v%=%)
+HELM_APP_VERSION ?= $(VERSION)
+
+# ====================================================================================
+# Tools install targets
+
+HELM_VERSION := 3.8.2
+HELM_DOWNLOAD_URL := https://get.helm.sh/helm-v$(HELM_VERSION)-$(HOSTOS)-$(HOSTARCH).tar.gz
+$(eval $(call tool.download.tar.gz,helm,$(HELM_VERSION),$(HELM_DOWNLOAD_URL)))
+
+# ====================================================================================
+# Helm Targets
+
+$(HELM_HOME): $(HELM)
+ @mkdir -p $(HELM_HOME)
+
+$(HELM_OUTPUT_DIR):
+ @mkdir -p $(HELM_OUTPUT_DIR)
+
+$(HELM_CHARTS_WORK_DIR):
+ @mkdir -p $(HELM_CHARTS_WORK_DIR)
+
+define helm.chart
+
+.helm.package.init.$(1): $(HELM_CHARTS_WORK_DIR)
+ @rm -rf $(HELM_CHARTS_WORK_DIR)/$(1)
+ @cp -a $(abspath $(HELM_CHARTS_DIR)/$(1)) $(HELM_CHARTS_WORK_DIR)/$(1)
+.helm.package.run.$(1): $(HELM_OUTPUT_DIR) $(HELM_HOME)
+ @$(INFO) helm package $(1) $(HELM_CHART_VERSION)
+ @$(HELM) package --version $(HELM_CHART_VERSION) --app-version $(HELM_APP_VERSION) -d $(HELM_OUTPUT_DIR) $(HELM_CHARTS_WORK_DIR)/$(1)
+ @$(OK) helm package $(1) $(HELM_CHART_VERSION)
+.helm.package.done.$(1): ; @:
+.helm.package.$(1):
+ @$(MAKE) .helm.package.init.$(1)
+ @$(MAKE) .helm.package.run.$(1)
+ @$(MAKE) .helm.package.done.$(1)
+
+.PHONY: .helm.package.init.$(1) .helm.package.run.$(1) .helm.package.done.$(1) .helm.package.$(1)
+
+$(HELM_OUTPUT_DIR)/$(1)-$(HELM_CHART_VERSION).tgz: $(HELM_HOME) $(HELM_OUTPUT_DIR) $(shell find $(HELM_CHARTS_DIR)/$(1) -type f)
+
+.PHONY: .helm.lint.$(1)
+.helm.lint.$(1): $(HELM_HOME) .helm.dep.$(1)
+ @$(INFO) helm lint $(1)
+ @rm -rf $(abspath $(HELM_CHARTS_DIR)/$(1)/charts)
+ @$(HELM) dependency build $(abspath $(HELM_CHARTS_DIR)/$(1))
+ @$(HELM) lint $(abspath $(HELM_CHARTS_DIR)/$(1)) $(HELM_CHART_LINT_ARGS_$(1)) --strict || $$(FAIL)
+ @$(OK) helm lint $(1)
+
+helm.lint: .helm.lint.$(1)
+
+.PHONY: .helm.dep.$(1)
+.helm.dep.$(1): $(HELM_HOME)
+ @$(INFO) helm dep $(1) $(HELM_CHART_VERSION)
+ @$(HELM) dependency update $(abspath $(HELM_CHARTS_DIR)/$(1))
+ @$(OK) helm dep $(1) $(HELM_CHART_VERSION)
+
+helm.dep: .helm.dep.$(1)
+
+$(HELM_INDEX): .helm.package.$(1)
+endef
+$(foreach p,$(HELM_CHARTS),$(eval $(call helm.chart,$(p))))
+
+$(HELM_INDEX): $(HELM_HOME) $(HELM_OUTPUT_DIR)
+ @$(INFO) helm index
+ @$(HELM) repo index $(HELM_OUTPUT_DIR)
+ @$(OK) helm index
+
+helm.build: $(HELM_INDEX)
+
+.helm.clean:
+ @rm -fr $(HELM_OUTPUT_DIR)
+
+.PHONY: helm.lint helm.build helm.dep .helm.clean
+
+# ====================================================================================
+# Common Targets
+
+.build.check: helm.lint
+.build.artifacts: helm.build
+.lint.run: helm.lint
+clean: .helm.clean
+
+# ====================================================================================
+# Special Targets
+
+define HELM_HELPTEXT
+Helm Targets:
+ helm.dep Upgrade charts dependencies
+
+endef
+export HELM_HELPTEXT
+
+.PHONY: .helm.help
+.helm.help:
+ @echo "$$HELM_HELPTEXT"
+
+.help: .helm.help
+
+endif # __HELM_MAKEFILE__
diff --git a/build/makelib/image.mk b/build/makelib/image.mk
new file mode 100644
index 00000000..3adbe760
--- /dev/null
+++ b/build/makelib/image.mk
@@ -0,0 +1,338 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# ====================================================================================
+# Options
+
+ifndef __DOCKER_MAKEFILE__
+__DOCKER_MAKEFILE__ := included
+
+ifeq ($(origin IMAGE_DIR),undefined)
+IMAGE_DIR := $(ROOT_DIR)/images
+endif
+
+ifeq ($(origin IMAGE_OUTPUT_DIR),undefined)
+IMAGE_OUTPUT_DIR := $(OUTPUT_DIR)/images/$(PLATFORM)
+endif
+
+ifeq ($(origin IMAGE_TEMP_DIR),undefined)
+IMAGE_TEMP_DIR := $(shell mktemp -d)
+endif
+
+ifeq ($(DRONE),true)
+DOCKER_HOST ?= tcp://docker:2375
+export DOCKER_HOST
+endif
+
+# a registry that is scoped to the current build tree on this host. this enables
+# us to have isolation between concurrent builds on the same system, as in the case
+# of multiple working directories or on a CI system with multiple executors. All images
+# tagged with this build registry can safely be untagged/removed at the end of the build.
+ifeq ($(origin BUILD_REGISTRY), undefined)
+ifeq ($(CI_BUILD_NUMBER),)
+BUILD_REGISTRY := build/$(shell echo $(HOSTNAME)-$(ROOT_DIR) | shasum -a 256 | cut -c1-8)
+else
+BUILD_REGISTRY := build/$(CI_BUILD_NUMBER)
+endif
+endif
+
+# In order to reduce built time especially on jenkins, we maintain a cache
+# of already built images. This cache contains images that can be used to help speed
+# future docker build commands using docker's content addressable schemes.
+# All cached images go in in a 'cache/' local registry and we follow an MRU caching
+# policy -- keeping images that have been referenced around and evicting images
+# that have to been referenced in a while (and according to a policy). Note we can
+# not rely on the image's .CreatedAt date since docker only updates then when the
+# image is created and not referenced. Instead we keep a date in the Tag.
+CACHE_REGISTRY := cache
+
+# prune images that are at least this many hours old
+PRUNE_HOURS ?= 48
+
+# prune keeps at least this many images regardless of how old they are
+PRUNE_KEEP ?= 24
+
+# don't actually prune just show what prune would do.
+PRUNE_DRYRUN ?= 0
+
+# the cached image format
+CACHE_DATE_FORMAT := "%Y-%m-%d.%H%M%S"
+CACHE_PRUNE_DATE := $(shell export TZ="UTC+$(PRUNE_HOURS)"; date +"$(CACHE_DATE_FORMAT)")
+CACHE_TAG := $(shell date -u +"$(CACHE_DATE_FORMAT)")
+
+REGISTRIES ?= $(DOCKER_REGISTRY)
+
+# docker accepted image platform format
+# eg linux/arm64 -> linux/arm64/v8, linux/armv7 -> linux/arm/v7, linux/armv6 -> linux/arm/v6
+dockerify-platform = $(subst armv7,arm/v7,$(subst arm64,arm64/v8,$(1)))
+IMAGE_ARCHS := $(subst linux_,,$(filter linux_%,$(PLATFORMS)))
+IMAGE_PLATFORMS := $(call dockerify-platform,$(subst _,/,$(filter linux_%,$(PLATFORMS))))
+IMAGE_PLATFORM = $(call dockerify-platform,linux/$(ARCH))
+
+IMAGE_TAG ?= $(subst +,-,$(VERSION))
+PROMOTE_TAG := $(if $(PROMOTE_IMAGE_TAG),$(PROMOTE_IMAGE_TAG),$(IMAGE_TAG))
+
+# if set to 1 docker image caching will not be used.
+CACHEBUST ?= 0
+ifeq ($(CACHEBUST),1)
+BUILD_ARGS += --no-cache
+endif
+
+# if V=0 avoid showing verbose output from docker build
+ifeq ($(V),0)
+BUILD_ARGS ?= -q
+endif
+
+# if PULL=1 we will always check if there is a newer base image
+PULL ?= 1
+ifeq ($(PULL),1)
+BUILD_BASE_ARGS += --pull
+endif
+BUILD_BASE_ARGS += $(BUILD_ARGS)
+export PULL
+
+ifeq ($(HOSTOS),Linux)
+SELF_CID := $(shell cat /proc/self/cgroup | grep docker | grep -o -E '[0-9a-f]{64}' | head -n 1)
+endif
+
+# =====================================================================================
+# Image Targets
+
+.do.img.clean:
+ @for i in $(CLEAN_IMAGES); do \
+ if [ -n "$$(docker images -q $$i)" ]; then \
+ for c in $$(docker ps -a -q --no-trunc --filter=ancestor=$$i); do \
+ if [ "$$c" != "$(SELF_CID)" ]; then \
+ $(INFO) stopping and removing container $${c} referencing image $$i; \
+ docker stop $${c}; \
+ docker rm $${c}; \
+ fi; \
+ done; \
+ $(INFO) cleaning image $$i; \
+ docker rmi $$i > /dev/null 2>&1 || true; \
+ fi; \
+ done
+
+# this will clean everything for this build
+.img.clean:
+ @$(INFO) cleaning images for $(BUILD_REGISTRY)
+ @$(MAKE) .do.img.clean CLEAN_IMAGES="$(shell docker images | grep -E '^$(BUILD_REGISTRY)/' | awk '{print $$1":"$$2}')"
+ @$(OK) cleaning images for $(BUILD_REGISTRY)
+
+.img.done:
+ @rm -fr $(IMAGE_TEMP_DIR)
+
+.img.cache:
+ @for i in $(CACHE_IMAGES); do \
+ IMGID=$$(docker images -q $$i); \
+ if [ -n "$$IMGID" ]; then \
+ $(INFO) caching image $$i; \
+ CACHE_IMAGE=$(CACHE_REGISTRY)/$${i#*/}; \
+ docker tag $$i $${CACHE_IMAGE}:$(CACHE_TAG); \
+ for r in $$(docker images --format "{{.ID}}#{{.Repository}}:{{.Tag}}" | grep $$IMGID | grep $(CACHE_REGISTRY)/ | grep -v $${CACHE_IMAGE}:$(CACHE_TAG)); do \
+ docker rmi $${r#*#} > /dev/null 2>&1 || true; \
+ done; \
+ fi; \
+ done
+
+# prune removes old cached images
+img.prune:
+ @$(INFO) pruning images older than $(PRUNE_HOURS) keeping a minimum of $(PRUNE_KEEP) images
+ @EXPIRED=$$(docker images --format "{{.Tag}}#{{.Repository}}:{{.Tag}}" \
+ | grep -E '$(CACHE_REGISTRY)/' \
+ | sort -r \
+ | awk -v i=0 -v cd="$(CACHE_PRUNE_DATE)" -F "#" '{if ($$1 <= cd && i >= $(PRUNE_KEEP)) print $$2; i++ }') &&\
+ for i in $$EXPIRED; do \
+ $(INFO) removing expired cache image $$i; \
+ [ $(PRUNE_DRYRUN) = 1 ] || docker rmi $$i > /dev/null 2>&1 || true; \
+ done
+ @for i in $$(docker images -q -f dangling=true); do \
+ $(INFO) removing dangling image $$i; \
+ docker rmi $$i > /dev/null 2>&1 || true; \
+ done
+ @$(OK) pruning
+
+debug.nuke:
+ @for c in $$(docker ps -a -q --no-trunc); do \
+ if [ "$$c" != "$(SELF_CID)" ]; then \
+ $(INFO) stopping and removing container $${c}; \
+ docker stop $${c}; \
+ docker rm $${c}; \
+ fi; \
+ done
+ @for i in $$(docker images -q); do \
+ $(INFO) removing image $$i; \
+ docker rmi -f $$i > /dev/null 2>&1; \
+ done
+
+
+# 1: registry 2: image, 3: arch
+define repo.targets
+.PHONY: .img.release.build.$(1).$(2).$(3)
+.img.release.build.$(1).$(2).$(3):
+ @$(INFO) docker build $(1)/$(2):$(IMAGE_TAG)-$(3)
+ @docker tag $(BUILD_REGISTRY)/$(2)-$(3) $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL)
+ @$(OK) docker build $(1)/$(2):$(IMAGE_TAG)-$(3)
+.img.release.build: .img.release.build.$(1).$(2).$(3)
+
+.PHONY: .img.release.publish.$(1).$(2).$(3)
+.img.release.publish.$(1).$(2).$(3):
+ @$(INFO) docker push $(1)/$(2):$(IMAGE_TAG)-$(3)
+ @docker push $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL)
+ @$(OK) docker push $(1)/$(2):$(IMAGE_TAG)-$(3)
+.img.release.publish: .img.release.publish.$(1).$(2).$(3)
+
+.PHONY: .img.release.promote.$(1).$(2).$(3)
+.img.release.promote.$(1).$(2).$(3):
+ @$(INFO) docker promote $(1)/$(2):$(IMAGE_TAG)-$(3) to $(1)/$(2):$(CHANNEL)-$(PROMOTE_TAG)-$(3)
+
+ @[ "$(CHANNEL)" = "master" ] ||\
+ docker buildx imagetools create \
+ --tag $(1)/$(2):$(CHANNEL)-$(PROMOTE_TAG)-$(3) \
+ $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL)
+
+ @$(OK) docker promote
+.img.release.promote: .img.release.promote.$(1).$(2).$(3)
+
+.PHONY: .img.release.clean.$(1).$(2).$(3)
+.img.release.clean.$(1).$(2).$(3):
+ @[ -z "$$$$(docker images -q $(1)/$(2):$(IMAGE_TAG)-$(3))" ] || docker rmi $(1)/$(2):$(IMAGE_TAG)-$(3)
+.img.release.clean: .img.release.clean.$(1).$(2).$(3)
+endef
+$(foreach r,$(REGISTRIES), $(foreach i,$(IMAGES), $(foreach a,$(IMAGE_ARCHS),$(eval $(call repo.targets,$(r),$(i),$(a))))))
+
+
+.PHONY: .img.release.manifest.publish.%
+.img.release.manifest.publish.%: .img.release.publish
+ @$(INFO) docker buildx imagetools create \
+ --tag $(DOCKER_REGISTRY)/$*:$(IMAGE_TAG) \
+ $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS))
+
+ @docker buildx imagetools create \
+ --tag $(DOCKER_REGISTRY)/$*:$(IMAGE_TAG) \
+ $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL)
+
+ @$(OK) docker buildx imagetools create
+
+.PHONY: .img.release.manifest.promote.%
+.img.release.manifest.promote.%: .img.release.promote
+ @$(INFO) docker buildx imagetools create --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL) $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS))
+ @[ "$(CHANNEL)" = "master" ] ||\
+ docker buildx imagetools create \
+ --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL)-$(PROMOTE_TAG) \
+ $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL)
+
+ @# Republish images to the PROMOTE_TAG when promoting on stable channel
+ @[ "$(CHANNEL)" != "stable" ] || [ "$(PROMOTE_TAG)" = "$(IMAGE_TAG)" ] ||\
+ docker buildx imagetools create \
+ --tag $(DOCKER_REGISTRY)/$*:$(PROMOTE_TAG) \
+ $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL)
+
+ @docker buildx imagetools create \
+ --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL) \
+ $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL)
+
+ @$(OK) docker buildx imagetools create
+
+.img.release.build: ;@
+.img.release.publish: ;@
+.img.release.promote: ;@
+.img.release.clean: ;@
+
+.PHONY: img.prune .img.done .img.clean .do.img.clean .img.release.build .img.release.publish .img.release.promote
+.PHONY: .img.release.clean .img.cache img.publish
+
+# ====================================================================================
+# Common Targets
+
+# if IMAGES is defined then invoke and build each image identified
+ifneq ($(IMAGES),)
+
+ifeq ($(DOCKER_REGISTRY),)
+$(error the variable DOCKER_REGISTRY must be set prior to including image.mk)
+endif
+
+.do.build.image.%:
+ifeq ($(filter linux_%,$(PLATFORM)),)
+ @$(WARN) skipping docker build for $* on PLATFORM=$(PLATFORM)
+else
+ @$(MAKE) -C $(IMAGE_DIR)/$* PLATFORM=$(PLATFORM)
+endif
+
+.do.build.images: $(foreach i,$(IMAGES), .do.build.image.$(i)) ;
+.build.artifacts.platform: .do.build.images
+.build.done: .img.cache .img.done
+clean: .img.clean .img.release.clean
+
+.publish.init: .img.release.build
+
+img.publish: $(addprefix .img.release.manifest.publish.,$(IMAGES))
+
+# only publish images for master and release branches
+ifneq ($(filter master release-%,$(BRANCH_NAME)),)
+.publish.run: img.publish
+endif
+
+# publish images at tag also
+ifneq ($(TAGS),)
+.publish.run: img.publish
+endif
+
+
+.promote.run: $(addprefix .img.release.manifest.promote.,$(IMAGES))
+
+else # assume this .mk file is being included to build a single image
+
+ifeq ($(PLATFORM),darwin_amd64) # when building docker image on macOS pretend we are building for linux
+PLATFORM := linux_amd64
+endif
+
+ifneq ($(filter $(PLATFORM),$(PLATFORMS)),)
+.build.artifacts.platform: img.build
+.build.done: .img.cache .img.done
+clean: .img.clean
+else # trying to build a docker image for an invalid platform
+.DEFAULT_GOAL := .skip
+.PHONY: .skip
+.skip:
+ @$(WARN) skipping docker build for $(IMAGE) for PLATFORM=$(PLATFORM)
+endif
+
+endif
+
+# ====================================================================================
+# Special Targets
+
+define IMAGE_HELPTEXT
+Image Targets:
+ img.prune Prune orphaned and cached images.
+
+Image Options:
+ PRUNE_HOURS The number of hours from when an image is last used
+ for it to be considered a target for pruning.
+ Default is 48 hours.
+ PRUNE_KEEP The minimum number of cached images to keep.
+ Default is 24 images.
+
+endef
+export IMAGE_HELPTEXT
+
+.img.help:
+ @echo "$$IMAGE_HELPTEXT"
+
+.help: .img.help
+
+.PHONY: .img.help
+
+endif # __DOCKER_MAKEFILE__
diff --git a/build/makelib/k8s-tools.mk b/build/makelib/k8s-tools.mk
new file mode 100644
index 00000000..71afadb9
--- /dev/null
+++ b/build/makelib/k8s-tools.mk
@@ -0,0 +1,37 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __K8S_TOOLS_MAKEFILE__
+__K8S_TOOLS_MAKEFILE__ := included
+
+# ====================================================================================
+# tools
+
+# kubectl download and install
+KUBECTL_VERSION ?= 1.22.4
+KUBECTL_DOWNLOAD_URL ?= https://storage.googleapis.com/kubernetes-release/release/v$(KUBECTL_VERSION)/bin/$(HOSTOS)/$(HOSTARCH)/kubectl
+$(eval $(call tool.download,kubectl,$(KUBECTL_VERSION),$(KUBECTL_DOWNLOAD_URL)))
+
+# kind download and install
+KIND_VERSION ?= 0.12.0
+KIND_DOWNLOAD_URL ?= https://github.com/kubernetes-sigs/kind/releases/download/v$(KIND_VERSION)/kind-$(HOSTOS)-$(HOSTARCH)
+$(eval $(call tool.download,kind,$(KIND_VERSION),$(KIND_DOWNLOAD_URL)))
+
+# kind download and install
+KUSTOMIZE_VERSION ?= 4.5.4
+KUSTOMIZE_DOWNLOAD_URL ?=https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v$(KUSTOMIZE_VERSION)/kustomize_v$(KUSTOMIZE_VERSION)_$(HOST_PLATFORM).tar.gz
+$(eval $(call tool.download.tar.gz,kustomize,$(KUSTOMIZE_VERSION),$(KUSTOMIZE_DOWNLOAD_URL),kustomize,0))
+
+endif # __K8S_TOOLS_MAKEFILE__
+
diff --git a/build/makelib/kubebuilder.mk b/build/makelib/kubebuilder.mk
new file mode 100644
index 00000000..366d4782
--- /dev/null
+++ b/build/makelib/kubebuilder.mk
@@ -0,0 +1,116 @@
+# Copyright 2019 Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __KUBEBUILDER_MAKEFILE__
+__KUBEBUILDER_MAKEFILE__ := included
+
+include $(COMMON_SELF_DIR)/golang.mk
+
+# ====================================================================================
+# Options
+
+CRD_DIR ?= config/crd/bases
+RBAC_DIR ?= config/rbac
+
+BOILERPLATE_FILE ?= hack/boilerplate.go.txt
+
+CONTROLLER_GEN_CRD_OPTIONS ?= crd:generateEmbeddedObjectMeta=true output:crd:artifacts:config=$(CRD_DIR)
+CONTROLLER_GEN_RBAC_OPTIONS ?= rbac:roleName=manager-role output:rbac:artifacts:config=$(RBAC_DIR)
+CONTROLLER_GEN_WEBHOOK_OPTIONS ?= webhook
+CONTROLLER_GEN_OBJECT_OPTIONS ?= object:headerFile=$(BOILERPLATE_FILE)
+CONTROLLER_GEN_PATHS ?= $(foreach t,$(GO_SUBDIRS),paths=./$(t)/...)
+
+KUBEBUILDER_ASSETS_VERSION ?= 1.21.2
+KUBEBUILDER_ASSETS = $(CACHE_DIR)/kubebuilder/k8s/$(KUBEBUILDER_ASSETS_VERSION)-$(HOSTOS)-$(HOSTARCH)
+export KUBEBUILDER_ASSETS
+
+# ====================================================================================
+# tools
+
+# setup-envtest download and install
+SETUP_ENVTEST_VERSION ?= 0.0.0-20220808123420-bcde6f084dd1
+SETUP_ENVTEST_DOWNLOAD_URL ?= sigs.k8s.io/controller-runtime/tools/setup-envtest
+$(eval $(call tool.go.install,setup-envtest,v$(SETUP_ENVTEST_VERSION),$(SETUP_ENVTEST_DOWNLOAD_URL)))
+
+# kubebuilder download and install
+KUBEBUILDER_VERSION ?= 3.6.0
+KUBEBUILDER_DOWNLOAD_URL ?= https://github.com/kubernetes-sigs/kubebuilder/releases/download/v$(KUBEBUILDER_VERSION)/kubebuilder_$(HOST_PLATFORM)
+$(eval $(call tool.download,kubebuilder,$(KUBEBUILDER_VERSION),$(KUBEBUILDER_DOWNLOAD_URL)))
+
+# controller-gen download and install
+CONTROLLER_GEN_VERSION ?= 0.9.2
+CONTROLLER_GEN_DOWNLOAD_URL ?= sigs.k8s.io/controller-tools/cmd/controller-gen
+$(eval $(call tool.go.install,controller-gen,v$(CONTROLLER_GEN_VERSION),$(CONTROLLER_GEN_DOWNLOAD_URL)))
+
+build.tools: |$(KUBEBUILDER_ASSETS)
+$(KUBEBUILDER_ASSETS): $(SETUP_ENVTEST)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} installing kubebuilder assets for Kubernetes $(KUBEBUILDER_ASSETS_VERSION)
+ @$(SETUP_ENVTEST) --bin-dir=$(CACHE_DIR)/kubebuilder --os=$(HOSTOS) --arch=$(HOSTARCH) use $(KUBEBUILDER_ASSETS_VERSION)
+ @$(OK) installing kubebuilder assets for Kubernetes $(KUBEBUILDER_ASSETS_VERSION)
+
+# ====================================================================================
+# Kubebuilder Targets
+
+$(eval $(call common.target,kubebuilder.manifests))
+# Generate manifests e.g. CRD, RBAC etc.
+.do.kubebuilder.manifests: $(CONTROLLER_GEN)
+ @$(INFO) Generating Kubernetes \(CRDs, RBAC, WebhookConfig, etc.\) manifests
+ @$(CONTROLLER_GEN) \
+ $(CONTROLLER_GEN_CRD_OPTIONS) \
+ $(CONTROLLER_GEN_RBAC_OPTIONS) \
+ $(CONTROLLER_CONTROLLER_GEN_WEBHOOK_OPTIONS) \
+ $(CONTROLLER_GEN_PATHS)
+ @$(OK) Generating Kubernetes \(CRDs, RBAC, WebhookConfig, etc.\) manifests
+.PHONY: .do.kubebuilder.manifests
+.kubebuilder.manifests.run: .do.kubebuilder.manifests
+
+$(eval $(call common.target,kubebuilder.code))
+# Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
+.do.kubebuilder.code: $(CONTROLLER_GEN)
+ @$(INFO) Generating DeepCopy, DeepCopyInto, and DeepCopyObject code
+ @$(CONTROLLER_GEN) \
+ $(CONTROLLER_GEN_OBJECT_OPTIONS) \
+ $(CONTROLLER_GEN_PATHS)
+ @$(OK) Generating DeepCopy, DeepCopyInto, and DeepCopyObject code
+.PHONY: .do.kubebuilder.code
+.kubebuilder.code.run: .do.kubebuilder.code
+
+# ====================================================================================
+# Common Targets
+
+.test.init: |$(KUBEBUILDER_ASSETS)
+go.test.unit: |$(KUBEBUILDER_ASSETS)
+go.generate: kubebuilder.code
+.generate.init: .kubebuilder.manifests.init
+.generate.run: .kubebuilder.manifests.run
+.generate.done: .kubebuilder.manifests.done
+
+# ====================================================================================
+# Special Targets
+
+define KUBEBULDER_HELPTEXT
+Kubebuilder Targets:
+ kubebuilder.manifests Generates Kubernetes custom resources manifests (e.g. CRDs RBACs, ...)
+ kubebuilder.code Generates DeepCopy, DeepCopyInto, and DeepCopyObject code
+
+endef
+export KUBEBULDER_HELPTEXT
+
+.kubebuilder.help:
+ @echo "$$KUBEBULDER_HELPTEXT"
+
+.help: .kubebuilder.help
+.PHONY: .kubebuilder.help
+
+endif # __KUBEBUILDER_MAKEFILE__
\ No newline at end of file
diff --git a/build/makelib/nodejs.mk b/build/makelib/nodejs.mk
new file mode 100644
index 00000000..67ee3e96
--- /dev/null
+++ b/build/makelib/nodejs.mk
@@ -0,0 +1,149 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+# Copyright 2019 The Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __NODEJS_MAKEFILE__
+__NODEJS_MAKEFILE__ := included
+
+# ====================================================================================
+# Options
+
+# supported node versions
+NODE_SUPPORTED_VERSIONS ?= 10|12
+NODE := node
+
+SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# The location of node application within this git repo.
+NODE_ROOT_DIR ?= $(SELF_DIR)/../..
+
+# The location of node application source code, relative to the NODE_ROOT_DIR
+NODE_SRC_DIR ?= src
+
+NODE_ENV ?= production
+export NODE_ENV
+
+YARN := yarn
+YARN_MODULE_DIR := $(NODE_ROOT_DIR)/node_modules
+YARN_BIN_DIR := $(abspath $(NODE_ROOT_DIR)/node_modules/.bin)
+YARN_PACKAGE_FILE := $(NODE_ROOT_DIR)/package.json
+YARN_PACKAGE_LOCK_FILE := $(NODE_ROOT_DIR)/yarn.lock
+
+NODE_SRCS ?= $(abspath $(YARN_PACKAGE_FILE)) $(abspath $(YARN_PACKAGE_LOCK_FILE)) $(shell find $(abspath $(NODE_ROOT_DIR)/$(NODE_SRC_DIR)) -type f | grep -v '__tests__')
+
+YARN_CACHE_FOLDER ?= $(CACHE_DIR)/yarn
+export YARN_CACHE_FOLDER
+
+YARN_OUTDIR ?= $(OUTPUT_DIR)/yarn
+export YARN_OUTDIR
+
+EXTEND_ESLINT ?= true
+export EXTEND_ESLINT
+
+ESLINT_OUTPUT_DIR := $(OUTPUT_DIR)/lint/eslint
+
+# ====================================================================================
+# NodeJS Tools Targets
+
+ESLINT := $(YARN_BIN_DIR)/eslint
+$(ESLINT): |yarn.install
+build.tools: $(ESLINT)
+
+# ====================================================================================
+# YARN Targets
+
+.PHONY: .yarn.init
+.yarn.init:
+ @if ! `$(NODE) --version | grep -q -E '^v($(NODE_SUPPORTED_VERSIONS))\.'`; then \
+ $(ERR) unsupported node version. Please install one of the following supported version: '$(NODE_SUPPORTED_VERSIONS)' ;\
+ exit 1 ;\
+ fi
+
+# some node packages like node-sass require platform/arch specific install. we need
+# to run yarn for each platform. As a result we track a stamp file per host
+YARN_INSTALL_STAMP := $(YARN_MODULE_DIR)/.yarn.install.$(HOST_PLATFORM).stamp
+
+# only run "yarn" if the package.json has changed
+$(YARN_INSTALL_STAMP): $(YARN_PACKAGE_FILE) $(YARN_PACKAGE_LOCK_FILE)
+ @echo ${TIME} $(BLUE)[TOOL]$(CNone) yarn install
+ @cd $(NODE_ROOT_DIR); $(YARN) --silent --frozen-lockfile --non-interactive --production=false || $(FAIL)
+ @touch $(YARN_INSTALL_STAMP)
+ @$(OK) yarn install
+
+yarn.install: .yarn.init $(YARN_INSTALL_STAMP)
+
+.yarn.clean:
+ @rm -rf $(YARN_MODULE_DIR)
+
+.PHONY: yarn.install .yarn.clean
+
+# ====================================================================================
+# NodeJS Targets
+
+$(ESLINT_OUTPUT_DIR)/stylecheck.xml: $(ESLINT) $(NODE_SRCS)
+ @$(INFO) eslint
+ @mkdir -p $(ESLINT_OUTPUT_DIR)
+ @cd $(NODE_ROOT_DIR); $(ESLINT) '$(NODE_SRC_DIR)/**/*.{ts,tsx}' --color
+ @touch $@
+ @$(OK) eslint
+
+js.lint: $(ESLINT_OUTPUT_DIR)/stylecheck.xml
+
+js.lint.fix:
+ @$(INFO) eslint fix
+ @cd $(NODE_ROOT_DIR); $(ESLINT) '$(NODE_SRC_DIR)/**/*.{ts,tsx}' --color
+ @$(OK) eslint fix
+
+# common target for building a node js project
+$(eval $(call common.target,js.build))
+
+# common target for testing a node js project
+$(eval $(call common.target,js.test))
+
+.PHONY: js.lint js.lint.fix
+
+# ====================================================================================
+# Common Targets
+
+.build.init: .yarn.init .js.build.init
+.build.check: js.lint
+.build.code: .js.build.run
+.build.done: .js.build.done
+
+.test.init: .js.test.init
+.test.run: .js.test.run
+.test.done: .js.test.done
+
+clean: .yarn.clean
+
+.lint.run: js.lint
+.fmt.run: js.lint.fix
+
+# ====================================================================================
+# Special Targets
+
+define NODEJS_HELPTEXT
+nodejs Targets:
+ yarn.install Installs dependencies in a make friendly manner.
+
+endef
+export NODEJS_HELPTEXT
+
+.PHONY: .js.help
+.js.help:
+ @echo "$$NODEJS_HELPTEXT"
+
+.help: .js.help
+
+endif # __NODEJS_MAKEFILE__
diff --git a/build/makelib/php.mk b/build/makelib/php.mk
new file mode 100644
index 00000000..caef53f2
--- /dev/null
+++ b/build/makelib/php.mk
@@ -0,0 +1,157 @@
+# Copyright 2020 The Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __PHP_MAKEFILE__
+__PHP_MAKEFILE__ := included
+
+# ====================================================================================
+# Options
+
+# supported php versions
+PHP_SUPPORTED_VERSIONS ?= 7.3|7.4|8.0|8.1
+PHP := php
+
+SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# The location of php application within this git repo.
+PHP_ROOT_DIR ?= $(SELF_DIR)/../..
+
+# The location of php application source code, relative to the PHP_ROOT_DIR
+PHP_SRC_DIR ?= src
+
+COMPOSER_VERSION ?= 2.3.5
+COMPOSER_DOWNLOAD_URL ?= https://getcomposer.org/download/$(COMPOSER_VERSION)/composer.phar
+$(eval $(call tool.download,composer,$(COMPOSER_VERSION),$(COMPOSER_DOWNLOAD_URL)))
+
+COMPOSER_INSTALL_ARGS ?= --prefer-dist --classmap-authoritative
+COMPOSER_VENDOR_DIR := $(PHP_ROOT_DIR)/vendor
+COMPOSER_BIN_DIR := $(abspath $(PHP_ROOT_DIR)/vendor/bin)
+COMPOSER_JSON_FILE := $(PHP_ROOT_DIR)/composer.json
+COMPOSER_LOCK_FILE := $(PHP_ROOT_DIR)/composer.lock
+
+COMPOSER_CACHE_DIR := $(CACHE_DIR)/composer
+export COMPOSER_CACHE_DIR
+
+# ====================================================================================
+# PHP Tools Targets
+
+PHPUNIT := $(COMPOSER_BIN_DIR)/phpunit
+$(PHPUNIT): |composer.install
+build.tools: $(PHPUNIT)
+
+PHPCS := $(COMPOSER_BIN_DIR)/phpcs
+$(PHPCS): |composer.install
+build.tools: $(PHPCS)
+
+PHPCBF := $(COMPOSER_BIN_DIR)/phpcbf
+$(PHPCBF): |composer.install
+build.tools: $(PHPCBF)
+
+# ====================================================================================
+# Composer targets
+
+.PHONY: .composer.init
+.composer.init:
+ @if ! `$(PHP) --version | grep -q -E '^PHP ($(PHP_SUPPORTED_VERSIONS))\.'`; then \
+ $(ERR) unsupported PHP version. Please install one of the following supported version: '$(PHP_SUPPORTED_VERSIONS)' ;\
+ exit 1 ;\
+ fi
+$(COMPOSER): .composer.init
+
+COMPOSER_INSTALL_STAMP := $(COMPOSER_VENDOR_DIR)/.composer.install.stamp
+
+# only run "composer" if the composer.json has changed
+$(COMPOSER_INSTALL_STAMP): $(COMPOSER) $(COMPOSER_JSON_FILE) $(COMPOSER_LOCK_FILE)
+ @echo ${TIME} $(BLUE)[TOOL]$(CNone) composer install
+ @cd $(PHP_ROOT_DIR); $(COMPOSER) install --no-interaction || $(FAIL)
+ @touch $(COMPOSER_INSTALL_STAMP)
+ @$(OK) composer install
+
+composer.install: $(COMPOSER_INSTALL_STAMP)
+
+composer.update: $(COMPOSER)
+ @echo ${TIME} $(BLUE)[TOOL]$(CNone) composer update
+ @cd $(PHP_ROOT_DIR); $(COMPOSER) update || $(FAIL)
+ @touch $(COMPOSER_INSTALL_STAMP)
+ @$(OK) composer install
+
+
+.composer.clean:
+ @rm -rf $(COMPOSER_VENDOR_DIR)
+
+.PHONY: composer.install composer.update .composer.clean
+
+# ====================================================================================
+# PHP Targets
+
+php.lint:
+ @$(INFO) phpcs $(PHP_SRC_DIR)
+ @cd $(PHP_ROOT_DIR); $(PHPCS) $(PHP_SRC_DIR)
+ @$(OK) phpcs $(PHP_SRC_DIR)
+
+php.lint.fix:
+ @$(INFO) phpcbf $(PHP_SRC_DIR)
+ @cd $(PHP_ROOT_DIR); $(PHPCBF) $(PHP_SRC_DIR)
+ @$(OK) phpcbf $(PHP_SRC_DIR)
+.PHONY: php.lint php.lint.fix
+
+# common target for building a php project
+$(eval $(call common.target,php.build))
+
+# common target for testing a php project
+$(eval $(call common.target,php.test))
+
+.PHONY: .do.php.test
+.php.test.run: .do.php.test
+.do.php.test: $(PHPUNIT)
+ @$(INFO) phpunit
+ @$(PHPUNIT) $(PHPUNIT_ARGS)
+ @$(OK) phpunit
+
+
+# ====================================================================================
+# Common Targets
+
+.build.init: .composer.init
+.build.check: php.lint
+.build.code: .php.build.run
+.build.done: .php.build.done
+
+.test.init: .php.test.init
+.test.run: .php.test.run
+.test.done: .php.test.done
+
+clean: .composer.clean
+
+.lint.run: php.lint
+.fmt.run: php.lint.fix
+
+# ====================================================================================
+# Special Targets
+
+define PHP_HELPTEXT
+PHP Targets:
+ composer.install Installs dependencies in a make friendly manner.
+ composer.update Updates dependencies in a make friendly manner.
+
+endef
+export PHP_HELPTEXT
+
+.PHONY: .php.help
+.php.help:
+ @echo "$$PHP_HELPTEXT"
+
+.help: .php.help
+
+endif # __PHP_MAKEFILE__
diff --git a/build/makelib/protobuf.mk b/build/makelib/protobuf.mk
new file mode 100644
index 00000000..ce31604a
--- /dev/null
+++ b/build/makelib/protobuf.mk
@@ -0,0 +1,113 @@
+# Copyright 2016 The Upbound Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __PROTOBUF_MAKEFILE__
+__PROTOBUF_MAKEFILE__ := included
+
+# ====================================================================================
+# Setup protobuf environment
+
+PROTOBUF_DIR ?= proto
+PROTOBUF_FILES ?= $(sort $(shell find $(PROTOBUF_DIR) -name "*.proto"))
+
+PROTOC_VERSION ?= 3.10.1
+
+# ====================================================================================
+# Tools install targets
+
+PROTOTOOL_VERSION ?= 1.9.0
+PROTOTOOL_CACHE_PATH := $(TOOLS_HOST_DIR)/prototool
+export PROTOTOOL_CACHE_PATH
+
+PROTOTOOL_DOWNLOAD_URL ?= https://github.com/uber/prototool/releases/download/v$(PROTOTOOL_VERSION)/prototool-$(HOSTOS)-x86_64
+$(eval $(call tool.download,prototool,$(PROTOTOOL_VERSION),$(PROTOTOOL_DOWNLOAD_URL)))
+
+# ====================================================================================
+# Protobuf Targets
+
+build.tools: .pb.prototool.cache.update
+.pb.prototool.cache.update: $(PROTOTOOL_CACHE_PATH)/.update
+$(PROTOTOOL_CACHE_PATH)/.update: $(PROTOBUF_DIR)/prototool.yaml |$(PROTOTOOL)
+ @echo ${TIME} $(BLUE)[TOOL]$(CNone) updating prototool cache
+ @$(PROTOTOOL) cache update $(PROTOBUF_DIR)
+ @touch $@
+ @$(OK) updating prototool cache
+
+.pb.init: .pb.prototool.cache.update
+
+pb.lint: $(PROTOTOOL)
+ @$(INFO) prototool lint
+ @$(PROTOTOOL) lint $(PROTOBUF_DIR) || $(FAIL)
+ @$(OK) prototool lint
+
+pb.fmt.verify: $(PROTOTOOL)
+ @$(INFO) prototool format verify
+ @$(PROTOTOOL) format -l $(PROTOBUF_DIR) || $(FAIL)
+ @$(OK) prototool format verify
+
+pb.fmt: $(PROTOTOOL)
+ @$(INFO) prototool format
+ @$(PROTOTOOL) format -w $(PROTOBUF_DIR) || $(FAIL)
+ @$(OK) prototool format
+
+# expose as common target so that we can hook in other generators
+# eg. https://github.com/dcodeIO/protobuf.js
+$(eval $(call common.target,pb.generate))
+
+.pb.prototool.generate:
+ @$(INFO) prototool generate
+ @$(PROTOTOOL) generate $(PROTOBUF_DIR)
+ @$(OK) prototool generate
+
+.pb.generate.init: .pb.init
+.pb.generate.run: .pb.prototool.generate
+
+.PHONY: .go.init go.lint go.fmt go.generate .pb.clean .pb.distclean
+.PHONY: .pb.prototool.cache.update .pb.prototool.generate
+
+# ====================================================================================
+# Common Targets
+
+.lint.init: .pb.init
+.lint.run: pb.fmt.verify pb.lint
+
+.fmt.run: pb.fmt
+
+.generate.init: .pb.init
+.generate.run: pb.generate
+
+# ====================================================================================
+# Special Targets
+
+define PROTOBUF_HELPTEXT
+Protobuf Targets:
+ pb.generate Generate code from protobuf files in $(PROTOBUF_DIR)
+
+endef
+export PROTOBUF_HELPTEXT
+
+.PHONY: .go.help
+.pb.help:
+ @echo "$$PROTOBUF_HELPTEXT"
+
+.help: .pb.help
+
+
+# # we use a consistent version of gofmt even while running different go compilers.
+# # see https://github.com/golang/go/issues/26397 for more details
+# PROTOC_VERSION ?= 3.10.1
+# PROTOC_DOWNLOAD_URL ?= https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VERSION)/protoc-$(PROTOC_VERSION)-$(HOSTOS)-$(HOSTARCH).zip
+# $(eval $(call tool.download.zip,protoc,$(PROTOC_VERSION),$(PROTOC_DOWNLOAD_URL),bin/protoc))
+
+endif # __PROTOBUF_MAKEFILE__
diff --git a/build/makelib/react.mk b/build/makelib/react.mk
new file mode 100644
index 00000000..cedec8e0
--- /dev/null
+++ b/build/makelib/react.mk
@@ -0,0 +1,114 @@
+# Copyright 2019 The Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __REACT_MAKEFILE__
+__REACT_MAKEFILE__ := included
+
+SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+include $(SELF_DIR)/nodejs.mk
+
+# ====================================================================================
+# Options
+
+REACT_OUTPUT_DIR ?= $(OUTPUT_DIR)/react
+
+REACT_LOCALE_PREFIX ?= messages
+
+# ====================================================================================
+# React app Targets
+
+REACT := $(YARN_BIN_DIR)/react-scripts --max_old_space_size=4096
+$(REACT): yarn.install
+build.tools: $(REACT)
+
+$(REACT_OUTPUT_DIR)/index.html: $(REACT) $(NODE_SRCS)
+ @$(INFO) react-scripts build
+ @cd $(NODE_ROOT_DIR); $(REACT) build
+ @mkdir -p $(REACT_OUTPUT_DIR)
+ @rm -rf $(REACT_OUTPUT_DIR)
+ @mv $(NODE_ROOT_DIR)/build $(REACT_OUTPUT_DIR)
+ @$(OK) react-scripts build
+react.build: $(REACT_OUTPUT_DIR)/index.html
+
+react.test: $(REACT)
+ @$(INFO) react-scripts test
+ @cd $(NODE_ROOT_DIR); TZ='UTC' $(REACT) test --env=jsdom --verbose --colors
+ @$(OK) react-scripts test
+
+react.run: $(REACT)
+ @cd $(NODE_ROOT_DIR); NODE_ENV=development BROWSER=none $(REACT) start
+
+.react.clean:
+ @rm -rf $(REACT_OUTPUT_DIR)
+
+.PHONY: react.build react.test .react.clean
+
+ifneq ($(LANGUAGES),)
+I18NEXT_CONV := $(YARN_BIN_DIR)/i18next-conv
+REACT_GETTEXT_PARSER := $(YARN_BIN_DIR)/react-gettext-parser
+
+$(I18NEXT_CONV): yarn.install
+$(REACT_GETTEXT_PARSER): yarn.install
+build.tools: $(REACT_GETTEXT_PARSER) $(I18NEXT_CONV)
+
+.PHONY: react.collect-translations
+react.collect-translations: $(REACT_GETTEXT_PARSER) |$(WORK_DIR)
+ @$(INFO) react-gettext-parser collect translations
+ @cd $(NODE_ROOT_DIR); $(REACT_GETTEXT_PARSER) --config .gettextparser --no-wrap --output $(abspath $(WORK_DIR))/$(REACT_LOCALE_PREFIX).pot '$(NODE_SRC_DIR)/**/*.{js,ts,tsx}'
+# Update the .pot file only if there are changes to actual messages. We need this because the collector always updates
+# the POT-Creation-Date
+#
+ @$(MAKELIB_BIN_DIR)/po-diff.sh $(LOCALES_DIR)/$(REACT_LOCALE_PREFIX).pot $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot || \
+ mv $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot $(LOCALES_DIR)/$(REACT_LOCALE_PREFIX).pot
+ @rm -f $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot
+#
+ @$(OK) react-gettext-parser collect translations
+
+react.convert-translations: $(I18NEXT_CONV)
+ @$(INFO) i18next convert translations to json
+ $(foreach l,$(LANGUAGES),@$(I18NEXT_CONV) --language $(l) --skipUntranslated \
+ --source $(LOCALES_DIR)/$(l)/$(REACT_LOCALE_PREFIX).po \
+ --target $(NODE_ROOT_DIR)/$(NODE_SRC_DIR)/locales/$(l).json \
+ > /dev/null || $(FAIL) ${\n}\
+ )
+ @$(OK) i18next convert translations to json
+
+.translations.init: react.collect-translations
+.translations.done: react.convert-translations
+endif
+
+# ====================================================================================
+# Common Targets
+
+.js.build.run: react.build
+.js.test.run: react.test
+clean: .react.clean
+
+# ====================================================================================
+# Special Targets
+
+define REACT_HELPTEXT
+React Targets:
+ react.run Run the react application for development.
+
+endef
+export REACT_HELPTEXT
+
+.PHONY: .react.help
+.react.help:
+ @echo "$$REACT_HELPTEXT"
+
+.help: .react.help
+
+endif # __REACT_MAKEFILE__
diff --git a/build/makelib/utils.mk b/build/makelib/utils.mk
new file mode 100644
index 00000000..1d0149c6
--- /dev/null
+++ b/build/makelib/utils.mk
@@ -0,0 +1,84 @@
+# Copyright 2019 Pressinfra SRL. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __UTILS_MAKEFILE__
+__UTILS_MAKEFILE__ := included
+
+COMMA := ,
+noop=
+SPACE = $(noop) $(noop)
+
+# define a newline
+define \n
+
+
+endef
+
+lower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
+upper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
+list-join = $(subst $(SPACE),$(1),$(strip $(2)))
+
+# ====================================================================================
+# Tools macros
+#
+# Theses macros are used to install tools in an idempotent, cache friendly way.
+
+define tool
+$(subst -,_,$(call upper,$(1))) := $$(TOOLS_BIN_DIR)/$(1)
+
+build.tools: $$(TOOLS_BIN_DIR)/$(1)
+$$(TOOLS_BIN_DIR)/$(1): $$(TOOLS_HOST_DIR)/$(1)-v$(2) |$$(TOOLS_BIN_DIR)
+ @ln -sf $$< $$@
+endef
+
+# Creates a target for downloading a tool from a given url
+# 1 tool, 2 version, 3 download url
+define tool.download
+$(call tool,$(1),$(2))
+
+$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} installing $(1) version $(2) from $(3)
+ @curl -fsSLo $$@ $(3) || $$(FAIL)
+ @chmod +x $$@
+ @$$(OK) installing $(1) version $(2) from $(3)
+endef # tool.download
+
+# Creates a target for downloading and unarchiving a tool from a given url
+# 1 tool, 2 version, 3 download url, 4 tool path within archive, 5 tar strip components
+define tool.download.tar.gz
+$(call tool,$(1),$(2))
+
+ifeq ($(4),)
+$(1)_TOOL_ARCHIVE_PATH = $(1)
+else
+$(1)_TOOL_ARCHIVE_PATH = $(4)
+endif
+
+
+$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR)
+ @echo ${TIME} ${BLUE}[TOOL]${CNone} installing $(1) version $(2) from $(3)
+ @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL)
+ifeq ($(5),)
+ @curl -fsSL $(3) | tar -xz --strip-components=1 -C $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL)
+else
+ @curl -fsSL $(3) | tar -xz --strip-components=$(5) -C $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL)
+endif
+ @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/$$($(1)_TOOL_ARCHIVE_PATH) $$@ || $(FAIL)
+ @chmod +x $$@
+ @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)
+ @$$(OK) installing $(1) version $(2) from $(3)
+endef # tool.download.tar.gz
+
+
+endif # __UTILS_MAKEFILE__
diff --git a/build/makelib/wordpress.mk b/build/makelib/wordpress.mk
new file mode 100644
index 00000000..d9e62f3b
--- /dev/null
+++ b/build/makelib/wordpress.mk
@@ -0,0 +1,98 @@
+# Copyright 2020 The Pressinfra Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifndef __WORDPRESS_MAKEFILE__
+__WORDPRESS_MAKEFILE__ := included
+
+SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+include $(SELF_DIR)/php.mk
+
+# ====================================================================================
+# Options
+
+WP_VERSION ?= master
+
+WP_OUTPUT_DIR := $(OUTPUT_DIR)/wordpress-$(WP_VERSION)
+
+ifeq ($(WP_VERSION),master)
+WP_DOWNLOAD_URL ?= https://github.com/WordPress/wordpress-develop/archive/$(WP_VERSION).tar.gz
+else
+WP_DOWNLOAD_URL ?= https://wordpress.org/wordpress-$(WP_VERSION).tar.gz
+endif
+WP_ARCHIVE := $(CACHE_DIR)/wordpress-$(WP_VERSION).tar.gz
+
+
+WP_TESTS_VERSION ?= $(WP_VERSION)
+WP_TESTS_DIR ?= $(WORK_DIR)/wordpress-develop-$(WP_VERSION)
+WP_TESTS_CONFIG ?= $(abspath $(PHP_ROOT_DIR))/tests/wp-tests-config.php
+WP_TESTS_DOWNLOAD_URL ?= https://github.com/WordPress/wordpress-develop/archive/$(WP_VERSION).tar.gz
+WP_TESTS_ARCHIVE := $(CACHE_DIR)/wordpress-develop-$(WP_VERSION).tar.gz
+
+# =====================================================================================
+# WordPress Targets
+
+$(WP_TESTS_ARCHIVE):
+ @$(INFO) fetching $(notdir $@) from $(WP_TESTS_DOWNLOAD_URL)
+ @curl -sLo "$@" "$(WP_TESTS_DOWNLOAD_URL)" || $(FAIL)
+ @$(OK) fetching $(notdir $@) from $(WP_TESTS_DOWNLOAD_URL)
+
+$(WP_TESTS_DIR)/src/wp-includes/version.php: $(WP_TESTS_ARCHIVE)
+ @$(INFO) unpacking $<
+ @rm -rf $(WP_TESTS_DIR) && mkdir -p $(WP_TESTS_DIR)
+ @tar -zxf $< -C $(WP_TESTS_DIR) --strip-components 1
+ @cp tests/wp-tests-config.php $(WP_TESTS_DIR)
+ @mkdir -p $(WP_TESTS_DIR)/src/wp-content/uploads
+ @test -f $@ && touch $@ || $(FAIL)
+ @$(OK) unpacking $<
+
+$(WP_TESTS_DIR)/wp-tests-config.php: $(WP_TESTS_CONFIG) $(WP_TESTS_DIR)/src/wp-includes/version.php
+ @cp $(WP_TESTS_CONFIG) $@
+
+$(WP_TESTS_DIR)/includes: $(WP_TESTS_DIR)
+ @cp -r $(WP_TESTS_DIR)/tests/phpunit/includes $@
+
+$(WP_TESTS_DIR)/data: $(WP_TESTS_DIR)
+ @cp -r $(WP_TESTS_DIR)/tests/phpunit/data $@
+
+
+# add WP_TESTS_DIR env var for running tests
+.do.php.test: PHPUNIT:=WP_TESTS_DIR=$(WP_TESTS_DIR) $(PHPUNIT)
+
+$(WP_ARCHIVE):
+ @$(INFO) fetching $(notdir $@) from $(WP_DOWNLOAD_URL)
+ @curl -sLo "$@" "$(WP_DOWNLOAD_URL)" || $(FAIL)
+ @$(OK) fetching $(notdir $@) from $(WP_DOWNLOAD_URL)
+
+$(WP_OUTPUT_DIR)/wp-includes/version.php: $(WP_ARCHIVE)
+ @$(INFO) unpacking $<
+ @rm -rf $(WP_OUTPUT_DIR) && mkdir -p $(WP_OUTPUT_DIR)
+ @tar -zxf $< -C $(WP_OUTPUT_DIR) --strip-components 1
+ @test -f $@ && touch $@ || $(FAIL)
+ @$(OK) unpacking $<
+
+$(eval $(call common.target,wordpress.build))
+.wordpress.build.init: $(WP_OUTPUT_DIR)/wp-includes/version.php
+
+# ====================================================================================
+# Common Targets
+
+.php.test.init: $(WP_TESTS_DIR)/wp-tests-config.php .php.test.init.composer
+
+.php.test.init.composer:
+ @# run composer install to fix: Error: The PHPUnit Polyfills library is a requirement
+ cd $(WP_TESTS_DIR) && composer install
+
+.build.artifacts: wordpress.build
+
+endif # __WORDPRESS_MAKEFILE__
diff --git a/src/composer.json b/composer.json
similarity index 82%
rename from src/composer.json
rename to composer.json
index fd478c3e..f75bf6b6 100755
--- a/src/composer.json
+++ b/composer.json
@@ -15,8 +15,12 @@
}
],
"require": {
- "php": "~7.0",
- "google/apiclient": "^2.10"
+ "php": ">=7.4 <8.2",
+ "google/apiclient": "^2.12"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "<10",
+ "yoast/phpunit-polyfills": "^1.0"
},
"scripts": {
"pre-autoload-dump": "Google\\Task\\Composer::cleanup"
@@ -27,7 +31,7 @@
]
},
"autoload": {
- "psr-4": {"Toplytics\\": "components"}
+ "psr-4": {"Toplytics\\": "src/components"}
},
"minimum-stability": "dev",
"prefer-stable": true
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 00000000..730fea26
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,3352 @@
+{
+ "_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#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "ca5766db17fe777b97d0088ad90896ca",
+ "packages": [
+ {
+ "name": "firebase/php-jwt",
+ "version": "v6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8",
+ "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1||^8.0"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^6.5||^7.4",
+ "phpspec/prophecy-phpunit": "^1.1",
+ "phpunit/phpunit": "^7.5||^9.5",
+ "psr/cache": "^1.0||^2.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "keywords": [
+ "jwt",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/firebase/php-jwt/issues",
+ "source": "https://github.com/firebase/php-jwt/tree/v6.3.0"
+ },
+ "time": "2022-07-15T16:48:45+00:00"
+ },
+ {
+ "name": "google/apiclient",
+ "version": "v2.12.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/googleapis/google-api-php-client.git",
+ "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/f92aa126903a9e2da5bd41a280d9633cb249e79e",
+ "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0||~6.0",
+ "google/apiclient-services": "~0.200",
+ "google/auth": "^1.10",
+ "guzzlehttp/guzzle": "~5.3.3||~6.0||~7.0",
+ "guzzlehttp/psr7": "^1.8.4||^2.2.1",
+ "monolog/monolog": "^1.17||^2.0||^3.0",
+ "php": "^5.6|^7.0|^8.0",
+ "phpseclib/phpseclib": "~2.0||^3.0.2"
+ },
+ "require-dev": {
+ "cache/filesystem-adapter": "^0.3.2|^1.1",
+ "composer/composer": "^1.10.22",
+ "phpcompatibility/php-compatibility": "^9.2",
+ "phpspec/prophecy-phpunit": "^1.1||^2.0",
+ "phpunit/phpunit": "^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.0",
+ "symfony/css-selector": "~2.1",
+ "symfony/dom-crawler": "~2.1",
+ "yoast/phpunit-polyfills": "^1.0"
+ },
+ "suggest": {
+ "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/aliases.php"
+ ],
+ "psr-4": {
+ "Google\\": "src/"
+ },
+ "classmap": [
+ "src/aliases.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "support": {
+ "issues": "https://github.com/googleapis/google-api-php-client/issues",
+ "source": "https://github.com/googleapis/google-api-php-client/tree/v2.12.6"
+ },
+ "time": "2022-06-06T20:00:19+00:00"
+ },
+ {
+ "name": "google/apiclient-services",
+ "version": "v0.261.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/googleapis/google-api-php-client-services.git",
+ "reference": "c91c5a694e3b8bca37136b830072a23f2c1250fa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/c91c5a694e3b8bca37136b830072a23f2c1250fa",
+ "reference": "c91c5a694e3b8bca37136b830072a23f2c1250fa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7||^8.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "autoload.php"
+ ],
+ "psr-4": {
+ "Google\\Service\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "support": {
+ "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
+ "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.261.0"
+ },
+ "time": "2022-08-08T01:28:12+00:00"
+ },
+ {
+ "name": "google/auth",
+ "version": "v1.21.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/googleapis/google-auth-library-php.git",
+ "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/aa3b9ca29258ac6347ce3c8937a2418c5d78f840",
+ "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "^5.5||^6.0",
+ "guzzlehttp/guzzle": "^6.2.1|^7.0",
+ "guzzlehttp/psr7": "^1.7|^2.0",
+ "php": "^7.1||^8.0",
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "guzzlehttp/promises": "0.1.1|^1.3",
+ "kelvinmo/simplejwt": "^0.2.5|^0.5.1",
+ "phpseclib/phpseclib": "^2.0.31",
+ "phpspec/prophecy-phpunit": "^1.1",
+ "phpunit/phpunit": "^7.5||^8.5",
+ "sebastian/comparator": ">=1.2.3",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "suggest": {
+ "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Google\\Auth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Google Auth Library for PHP",
+ "homepage": "http://github.com/google/google-auth-library-php",
+ "keywords": [
+ "Authentication",
+ "google",
+ "oauth2"
+ ],
+ "support": {
+ "docs": "https://googleapis.github.io/google-auth-library-php/main/",
+ "issues": "https://github.com/googleapis/google-auth-library-php/issues",
+ "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.1"
+ },
+ "time": "2022-05-16T19:34:15+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
+ "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5",
+ "guzzlehttp/psr7": "^1.9 || ^2.4",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.4-dev"
+ }
+ },
+ "autoload": {
+ "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",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.4.5"
+ },
+ "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:13+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
+ "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5-dev"
+ }
+ },
+ "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"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/1.5.1"
+ },
+ "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": "2021-10-22T20:56:57+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "13388f00956b1503577598873fffb5ae994b5737"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737",
+ "reference": "13388f00956b1503577598873fffb5ae994b5737",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.8 || ^9.3.10"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "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"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.4.0"
+ },
+ "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": "2022-06-20T21:43:11+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "305444bc6fb6c89e490f4b34fa6e979584d7fa81"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/305444bc6fb6c89e490f4b34fa6e979584d7fa81",
+ "reference": "305444bc6fb6c89e490f4b34fa6e979584d7fa81",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2",
+ "guzzlehttp/guzzle": "^7.4",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^9.5.16",
+ "predis/predis": "^1.1",
+ "ruflin/elastica": "^7",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-07-24T12:00:55+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": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@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": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+ "keywords": [
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
+ ],
+ "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": "paragonie/random_compat",
+ "version": "v9.99.100",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "3.0.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
+ "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1|^2",
+ "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
+ "php": ">=5.6.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib3\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/phpseclib/phpseclib/issues",
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-04T05:15:45+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/master"
+ },
+ "time": "2020-06-29T06:28:15+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.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": "http://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/master"
+ },
+ "time": "2019-04-30T12:38:16+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.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": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "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": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.0"
+ },
+ "time": "2021-07-14T16:46:02+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "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": "symfony/deprecation-contracts",
+ "version": "v3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-25T11:15:52+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
+ "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9",
+ "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.22"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
+ },
+ "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-03-03T08:28:38+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "shasum": ""
+ },
+ "require": {
+ "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.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/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T13:19:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.14.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
+ },
+ "time": "2022-05-31T20:59:12+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.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/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.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/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2",
+ "psalm/phar": "^4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
+ },
+ "time": "2021-10-19T17:43:47+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "77a32518733312af16a44300404e945338981de3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
+ "reference": "77a32518733312af16a44300404e945338981de3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "psalm/phar": "^4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
+ },
+ "time": "2022-03-15T21:29:03+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+ "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.2",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0 || ^7.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
+ },
+ "time": "2021-12-08T12:19:24+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.15",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
+ "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.13.0",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-03-07T09:28:20+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1",
+ "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.13",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.0",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-06-19T12:14:25+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "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",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-04-03T09:37:03+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
+ "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-11-11T14:18:36+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-14T08:28:10+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "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/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "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/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "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/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+ "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-03-15T09:54:48+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "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/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.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"
+ }
+ ],
+ "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/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ },
+ {
+ "name": "yoast/phpunit-polyfills",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Yoast/PHPUnit-Polyfills.git",
+ "reference": "5ea3536428944955f969bc764bbe09738e151ada"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/5ea3536428944955f969bc764bbe09738e151ada",
+ "reference": "5ea3536428944955f969bc764bbe09738e151ada",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "require-dev": {
+ "yoast/yoastcs": "^2.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev",
+ "dev-develop": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "phpunitpolyfills-autoload.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Team Yoast",
+ "email": "support@yoast.com",
+ "homepage": "https://yoast.com"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors"
+ }
+ ],
+ "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests",
+ "homepage": "https://github.com/Yoast/PHPUnit-Polyfills",
+ "keywords": [
+ "phpunit",
+ "polyfill",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues",
+ "source": "https://github.com/Yoast/PHPUnit-Polyfills"
+ },
+ "time": "2021-11-23T01:37:03+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": [],
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.4 <8.2"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/phpunit.xml b/phpunit.xml
index 23a6bdc4..fbe233ac 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -6,15 +6,10 @@
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
- >
-
-
- ./tests/
-
-
-
+>
+
+
+ ./tests/
+
+
diff --git a/src/composer.lock b/src/composer.lock
deleted file mode 100644
index 15fe05b8..00000000
--- a/src/composer.lock
+++ /dev/null
@@ -1,1278 +0,0 @@
-{
- "_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#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "5bb48cfc408710b4be0eb405071842c4",
- "packages": [
- {
- "name": "firebase/php-jwt",
- "version": "v6.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/firebase/php-jwt.git",
- "reference": "d28e6df83830252650da4623c78aaaf98fb385f3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d28e6df83830252650da4623c78aaaf98fb385f3",
- "reference": "d28e6df83830252650da4623c78aaaf98fb385f3",
- "shasum": ""
- },
- "require": {
- "php": "^7.1||^8.0"
- },
- "require-dev": {
- "guzzlehttp/guzzle": "^6.5||^7.4",
- "phpspec/prophecy-phpunit": "^1.1",
- "phpunit/phpunit": "^7.5||^9.5",
- "psr/cache": "^1.0||^2.0",
- "psr/http-client": "^1.0",
- "psr/http-factory": "^1.0"
- },
- "suggest": {
- "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Firebase\\JWT\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Neuman Vong",
- "email": "neuman+pear@twilio.com",
- "role": "Developer"
- },
- {
- "name": "Anant Narayanan",
- "email": "anant@php.net",
- "role": "Developer"
- }
- ],
- "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
- "homepage": "https://github.com/firebase/php-jwt",
- "keywords": [
- "jwt",
- "php"
- ],
- "support": {
- "issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.2.0"
- },
- "time": "2022-05-13T20:54:50+00:00"
- },
- {
- "name": "google/apiclient",
- "version": "v2.12.6",
- "source": {
- "type": "git",
- "url": "https://github.com/googleapis/google-api-php-client.git",
- "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/f92aa126903a9e2da5bd41a280d9633cb249e79e",
- "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e",
- "shasum": ""
- },
- "require": {
- "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0||~6.0",
- "google/apiclient-services": "~0.200",
- "google/auth": "^1.10",
- "guzzlehttp/guzzle": "~5.3.3||~6.0||~7.0",
- "guzzlehttp/psr7": "^1.8.4||^2.2.1",
- "monolog/monolog": "^1.17||^2.0||^3.0",
- "php": "^5.6|^7.0|^8.0",
- "phpseclib/phpseclib": "~2.0||^3.0.2"
- },
- "require-dev": {
- "cache/filesystem-adapter": "^0.3.2|^1.1",
- "composer/composer": "^1.10.22",
- "phpcompatibility/php-compatibility": "^9.2",
- "phpspec/prophecy-phpunit": "^1.1||^2.0",
- "phpunit/phpunit": "^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
- "squizlabs/php_codesniffer": "^3.0",
- "symfony/css-selector": "~2.1",
- "symfony/dom-crawler": "~2.1",
- "yoast/phpunit-polyfills": "^1.0"
- },
- "suggest": {
- "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "2.x-dev"
- }
- },
- "autoload": {
- "files": [
- "src/aliases.php"
- ],
- "psr-4": {
- "Google\\": "src/"
- },
- "classmap": [
- "src/aliases.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "description": "Client library for Google APIs",
- "homepage": "http://developers.google.com/api-client-library/php",
- "keywords": [
- "google"
- ],
- "support": {
- "issues": "https://github.com/googleapis/google-api-php-client/issues",
- "source": "https://github.com/googleapis/google-api-php-client/tree/v2.12.6"
- },
- "time": "2022-06-06T20:00:19+00:00"
- },
- {
- "name": "google/apiclient-services",
- "version": "v0.252.0",
- "source": {
- "type": "git",
- "url": "https://github.com/googleapis/google-api-php-client-services.git",
- "reference": "9941c959f6a1f781e49019b78f453d54554dff73"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/9941c959f6a1f781e49019b78f453d54554dff73",
- "reference": "9941c959f6a1f781e49019b78f453d54554dff73",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "require-dev": {
- "phpunit/phpunit": "^5.7||^8.5.13"
- },
- "type": "library",
- "autoload": {
- "files": [
- "autoload.php"
- ],
- "psr-4": {
- "Google\\Service\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "description": "Client library for Google APIs",
- "homepage": "http://developers.google.com/api-client-library/php",
- "keywords": [
- "google"
- ],
- "support": {
- "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
- "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.252.0"
- },
- "time": "2022-06-06T01:20:11+00:00"
- },
- {
- "name": "google/auth",
- "version": "v1.21.0",
- "source": {
- "type": "git",
- "url": "https://github.com/googleapis/google-auth-library-php.git",
- "reference": "73392bad2eb6852eea9084b6bbdec752515cb849"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/73392bad2eb6852eea9084b6bbdec752515cb849",
- "reference": "73392bad2eb6852eea9084b6bbdec752515cb849",
- "shasum": ""
- },
- "require": {
- "firebase/php-jwt": "^5.5||^6.0",
- "guzzlehttp/guzzle": "^6.2.1|^7.0",
- "guzzlehttp/psr7": "^1.7|^2.0",
- "php": "^7.1||^8.0",
- "psr/cache": "^1.0|^2.0|^3.0",
- "psr/http-message": "^1.0"
- },
- "require-dev": {
- "guzzlehttp/promises": "0.1.1|^1.3",
- "kelvinmo/simplejwt": "^0.2.5|^0.5.1",
- "phpseclib/phpseclib": "^2.0.31",
- "phpspec/prophecy-phpunit": "^1.1",
- "phpunit/phpunit": "^7.5||^8.5",
- "sebastian/comparator": ">=1.2.3",
- "squizlabs/php_codesniffer": "^3.5"
- },
- "suggest": {
- "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Google\\Auth\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "description": "Google Auth Library for PHP",
- "homepage": "http://github.com/google/google-auth-library-php",
- "keywords": [
- "Authentication",
- "google",
- "oauth2"
- ],
- "support": {
- "docs": "https://googleapis.github.io/google-auth-library-php/main/",
- "issues": "https://github.com/googleapis/google-auth-library-php/issues",
- "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.0"
- },
- "time": "2022-04-13T20:35:52+00:00"
- },
- {
- "name": "guzzlehttp/guzzle",
- "version": "7.4.4",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/guzzle.git",
- "reference": "e3ff079b22820c2029d4c2a87796b6a0b8716ad8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/e3ff079b22820c2029d4c2a87796b6a0b8716ad8",
- "reference": "e3ff079b22820c2029d4c2a87796b6a0b8716ad8",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "guzzlehttp/promises": "^1.5",
- "guzzlehttp/psr7": "^1.8.3 || ^2.1",
- "php": "^7.2.5 || ^8.0",
- "psr/http-client": "^1.0",
- "symfony/deprecation-contracts": "^2.2 || ^3.0"
- },
- "provide": {
- "psr/http-client-implementation": "1.0"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "ext-curl": "*",
- "php-http/client-integration-tests": "^3.0",
- "phpunit/phpunit": "^8.5.5 || ^9.3.5",
- "psr/log": "^1.1 || ^2.0 || ^3.0"
- },
- "suggest": {
- "ext-curl": "Required for CURL handler support",
- "ext-intl": "Required for Internationalized Domain Name (IDN) support",
- "psr/log": "Required for using the Log middleware"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "7.4-dev"
- }
- },
- "autoload": {
- "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",
- "keywords": [
- "client",
- "curl",
- "framework",
- "http",
- "http client",
- "psr-18",
- "psr-7",
- "rest",
- "web service"
- ],
- "support": {
- "issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.4.4"
- },
- "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-09T21:39:15+00:00"
- },
- {
- "name": "guzzlehttp/promises",
- "version": "1.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/promises.git",
- "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
- "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
- "shasum": ""
- },
- "require": {
- "php": ">=5.5"
- },
- "require-dev": {
- "symfony/phpunit-bridge": "^4.4 || ^5.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.5-dev"
- }
- },
- "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"
- ],
- "support": {
- "issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/1.5.1"
- },
- "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": "2021-10-22T20:56:57+00:00"
- },
- {
- "name": "guzzlehttp/psr7",
- "version": "2.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/psr7.git",
- "reference": "83260bb50b8fc753c72d14dc1621a2dac31877ee"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/83260bb50b8fc753c72d14dc1621a2dac31877ee",
- "reference": "83260bb50b8fc753c72d14dc1621a2dac31877ee",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5 || ^8.0",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0",
- "ralouphie/getallheaders": "^3.0"
- },
- "provide": {
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.8 || ^9.3.10"
- },
- "suggest": {
- "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.3-dev"
- }
- },
- "autoload": {
- "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"
- },
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://sagikazarmark.hu"
- }
- ],
- "description": "PSR-7 message implementation that also provides common utility methods",
- "keywords": [
- "http",
- "message",
- "psr-7",
- "request",
- "response",
- "stream",
- "uri",
- "url"
- ],
- "support": {
- "issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.3.0"
- },
- "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": "2022-06-09T08:26:02+00:00"
- },
- {
- "name": "monolog/monolog",
- "version": "2.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/Seldaek/monolog.git",
- "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524",
- "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2",
- "psr/log": "^1.0.1 || ^2.0 || ^3.0"
- },
- "provide": {
- "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
- },
- "require-dev": {
- "aws/aws-sdk-php": "^2.4.9 || ^3.0",
- "doctrine/couchdb": "~1.0@dev",
- "elasticsearch/elasticsearch": "^7 || ^8",
- "ext-json": "*",
- "graylog2/gelf-php": "^1.4.2",
- "guzzlehttp/guzzle": "^7.4",
- "guzzlehttp/psr7": "^2.2",
- "mongodb/mongodb": "^1.8",
- "php-amqplib/php-amqplib": "~2.4 || ^3",
- "php-console/php-console": "^3.1.3",
- "phpspec/prophecy": "^1.15",
- "phpstan/phpstan": "^0.12.91",
- "phpunit/phpunit": "^8.5.14",
- "predis/predis": "^1.1",
- "rollbar/rollbar": "^1.3 || ^2 || ^3",
- "ruflin/elastica": "^7",
- "swiftmailer/swiftmailer": "^5.3|^6.0",
- "symfony/mailer": "^5.4 || ^6",
- "symfony/mime": "^5.4 || ^6"
- },
- "suggest": {
- "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
- "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
- "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
- "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
- "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
- "ext-mbstring": "Allow to work properly with unicode symbols",
- "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
- "ext-openssl": "Required to send log messages using SSL",
- "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
- "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
- "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
- "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
- "php-console/php-console": "Allow sending log messages to Google Chrome",
- "rollbar/rollbar": "Allow sending log messages to Rollbar",
- "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "2.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Monolog\\": "src/Monolog"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "https://seld.be"
- }
- ],
- "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
- "homepage": "https://github.com/Seldaek/monolog",
- "keywords": [
- "log",
- "logging",
- "psr-3"
- ],
- "support": {
- "issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/2.7.0"
- },
- "funding": [
- {
- "url": "https://github.com/Seldaek",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
- "type": "tidelift"
- }
- ],
- "time": "2022-06-09T08:59:12+00:00"
- },
- {
- "name": "paragonie/constant_time_encoding",
- "version": "v2.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "3f3bf06406244a94aeffd5818ba05b41a1754ae5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/3f3bf06406244a94aeffd5818ba05b41a1754ae5",
- "reference": "3f3bf06406244a94aeffd5818ba05b41a1754ae5",
- "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": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Paragon Initiative Enterprises",
- "email": "security@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": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
- "keywords": [
- "base16",
- "base32",
- "base32_decode",
- "base32_encode",
- "base64",
- "base64_decode",
- "base64_encode",
- "bin2hex",
- "encoding",
- "hex",
- "hex2bin",
- "rfc4648"
- ],
- "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-10T07:38:28+00:00"
- },
- {
- "name": "paragonie/random_compat",
- "version": "v9.99.100",
- "source": {
- "type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
- "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
- "shasum": ""
- },
- "require": {
- "php": ">= 7"
- },
- "require-dev": {
- "phpunit/phpunit": "4.*|5.*",
- "vimeo/psalm": "^1"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
- },
- "type": "library",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
- }
- ],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
- "keywords": [
- "csprng",
- "polyfill",
- "pseudorandom",
- "random"
- ],
- "support": {
- "email": "info@paragonie.com",
- "issues": "https://github.com/paragonie/random_compat/issues",
- "source": "https://github.com/paragonie/random_compat"
- },
- "time": "2020-10-15T08:29:30+00:00"
- },
- {
- "name": "phpseclib/phpseclib",
- "version": "3.0.14",
- "source": {
- "type": "git",
- "url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
- "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
- "shasum": ""
- },
- "require": {
- "paragonie/constant_time_encoding": "^1|^2",
- "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
- "php": ">=5.6.1"
- },
- "require-dev": {
- "phpunit/phpunit": "*"
- },
- "suggest": {
- "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
- "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
- "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
- "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
- },
- "type": "library",
- "autoload": {
- "files": [
- "phpseclib/bootstrap.php"
- ],
- "psr-4": {
- "phpseclib3\\": "phpseclib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jim Wigginton",
- "email": "terrafrost@php.net",
- "role": "Lead Developer"
- },
- {
- "name": "Patrick Monnerat",
- "email": "pm@datasphere.ch",
- "role": "Developer"
- },
- {
- "name": "Andreas Fischer",
- "email": "bantu@phpbb.com",
- "role": "Developer"
- },
- {
- "name": "Hans-Jürgen Petrich",
- "email": "petrich@tronic-media.com",
- "role": "Developer"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com",
- "role": "Developer"
- }
- ],
- "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
- "homepage": "http://phpseclib.sourceforge.net",
- "keywords": [
- "BigInteger",
- "aes",
- "asn.1",
- "asn1",
- "blowfish",
- "crypto",
- "cryptography",
- "encryption",
- "rsa",
- "security",
- "sftp",
- "signature",
- "signing",
- "ssh",
- "twofish",
- "x.509",
- "x509"
- ],
- "support": {
- "issues": "https://github.com/phpseclib/phpseclib/issues",
- "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14"
- },
- "funding": [
- {
- "url": "https://github.com/terrafrost",
- "type": "github"
- },
- {
- "url": "https://www.patreon.com/phpseclib",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
- "type": "tidelift"
- }
- ],
- "time": "2022-04-04T05:15:45+00:00"
- },
- {
- "name": "psr/cache",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/cache.git",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for caching libraries",
- "keywords": [
- "cache",
- "psr",
- "psr-6"
- ],
- "support": {
- "source": "https://github.com/php-fig/cache/tree/master"
- },
- "time": "2016-08-06T20:24:11+00:00"
- },
- {
- "name": "psr/http-client",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-client.git",
- "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
- "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
- "shasum": ""
- },
- "require": {
- "php": "^7.0 || ^8.0",
- "psr/http-message": "^1.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Http\\Client\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for HTTP clients",
- "homepage": "https://github.com/php-fig/http-client",
- "keywords": [
- "http",
- "http-client",
- "psr",
- "psr-18"
- ],
- "support": {
- "source": "https://github.com/php-fig/http-client/tree/master"
- },
- "time": "2020-06-29T06:28:15+00:00"
- },
- {
- "name": "psr/http-factory",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-factory.git",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
- "shasum": ""
- },
- "require": {
- "php": ">=7.0.0",
- "psr/http-message": "^1.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": "http://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/master"
- },
- "time": "2019-04-30T12:38:16+00:00"
- },
- {
- "name": "psr/http-message",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.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": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for HTTP messages",
- "homepage": "https://github.com/php-fig/http-message",
- "keywords": [
- "http",
- "http-message",
- "psr",
- "psr-7",
- "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.1.4",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
- "support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
- },
- "time": "2021-05-03T11:20:27+00:00"
- },
- {
- "name": "ralouphie/getallheaders",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/ralouphie/getallheaders.git",
- "reference": "120b605dfeb996808c31b6477290a714d356e822"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
- "reference": "120b605dfeb996808c31b6477290a714d356e822",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "require-dev": {
- "php-coveralls/php-coveralls": "^2.1",
- "phpunit/phpunit": "^5 || ^6.5"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/getallheaders.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ralph Khattar",
- "email": "ralph.khattar@gmail.com"
- }
- ],
- "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": "symfony/deprecation-contracts",
- "version": "v2.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
- "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "2.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
- }
- },
- "autoload": {
- "files": [
- "function.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "A generic function and convention to trigger deprecation notices",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2022-01-02T09:53:40+00:00"
- }
- ],
- "packages-dev": [],
- "aliases": [],
- "minimum-stability": "dev",
- "stability-flags": [],
- "prefer-stable": true,
- "prefer-lowest": false,
- "platform": {
- "php": "~7.0"
- },
- "platform-dev": [],
- "plugin-api-version": "2.1.0"
-}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 8afeccc4..ddce2c58 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,31 +1,38 @@