From b38e41c98618d7d5c39edbe087556dacd4c01ec7 Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Mon, 19 Feb 2024 19:58:53 -0300 Subject: [PATCH] First commit Signed-off-by: Vitor Mattos --- .editorconfig | 25 + .github/CONTRIBUTING.md | 11 + .github/ISSUE_TEMPLATE/feature_request.md | 27 + .github/config.yml | 2 + .github/dependabot.yml | 32 + .github/pull_request_template.md | 25 + .github/workflows/appstore-build-publish.yml | 167 ++ .github/workflows/command-rebase.yml | 51 + .../workflows/dependabot-approve-merge.yml | 40 + .../workflows/lint-eslint-when-unrelated.yml | 39 + .github/workflows/lint-eslint.yml | 62 + .github/workflows/lint-info-xml.yml | 39 + .github/workflows/lint-php-cs.yml | 40 + .github/workflows/lint-php.yml | 60 + .github/workflows/lint-stylelint.yml | 46 + .github/workflows/node-when-unrelated.yml | 43 + .github/workflows/node.yml | 90 + .github/workflows/phpunit-sqlite.yml | 148 ++ .../phpunit-summary-when-unrelated.yml | 68 + .github/workflows/psalm.yml | 52 + .github/workflows/update-nextcloud-ocp.yml | 83 + .gitignore | 18 + .l10nignore | 4 + .php-cs-fixer.dist.php | 17 + .tx/config | 10 + CHANGELOG.md | 20 + CODE_OF_CONDUCT.md | 128 ++ LICENSE | 661 ++++++ README.md | 69 + appinfo/info.xml | 39 + composer.json | 60 + composer.lock | 1061 +++++++++ composer/autoload.php | 25 + l10n/pt_BR.js | 21 + l10n/pt_BR.json | 19 + lib/AppInfo/Application.php | 51 + lib/Backend/SystemGroupBackend.php | 263 +++ lib/Command/Company/Add.php | 67 + lib/Command/Company/Disable.php | 46 + lib/Command/Company/ListCommand.php | 45 + lib/Command/Developer/L10n.php | 77 + lib/Middleware/InjectionMiddleware.php | 89 + lib/Migration/InstallDefaultTheme.php | 50 + lib/Service/CompanyService.php | 186 ++ psalm.xml | 33 + tests/php/bootstrap.php | 31 + tests/php/phpunit.xml | 27 + tests/psalm-baseline.xml | 14 + themes/default/core/img/background.jpg | Bin 0 -> 190294 bytes themes/default/core/img/logo.svg | 424 ++++ .../core/templates/untrustedDomain.php | 9 + themes/default/defaults.php | 6 + vendor-bin/cs-fixer/composer.json | 9 + vendor-bin/cs-fixer/composer.lock | 1867 +++++++++++++++ vendor-bin/phpunit/composer.json | 5 + vendor-bin/phpunit/composer.lock | 1753 ++++++++++++++ vendor-bin/psalm/composer.json | 8 + vendor-bin/psalm/composer.lock | 2014 +++++++++++++++++ 58 files changed, 10376 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/config.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/appstore-build-publish.yml create mode 100644 .github/workflows/command-rebase.yml create mode 100644 .github/workflows/dependabot-approve-merge.yml create mode 100644 .github/workflows/lint-eslint-when-unrelated.yml create mode 100644 .github/workflows/lint-eslint.yml create mode 100644 .github/workflows/lint-info-xml.yml create mode 100644 .github/workflows/lint-php-cs.yml create mode 100644 .github/workflows/lint-php.yml create mode 100644 .github/workflows/lint-stylelint.yml create mode 100644 .github/workflows/node-when-unrelated.yml create mode 100644 .github/workflows/node.yml create mode 100644 .github/workflows/phpunit-sqlite.yml create mode 100644 .github/workflows/phpunit-summary-when-unrelated.yml create mode 100644 .github/workflows/psalm.yml create mode 100644 .github/workflows/update-nextcloud-ocp.yml create mode 100644 .gitignore create mode 100644 .l10nignore create mode 100644 .php-cs-fixer.dist.php create mode 100644 .tx/config create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 appinfo/info.xml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 composer/autoload.php create mode 100644 l10n/pt_BR.js create mode 100644 l10n/pt_BR.json create mode 100644 lib/AppInfo/Application.php create mode 100644 lib/Backend/SystemGroupBackend.php create mode 100644 lib/Command/Company/Add.php create mode 100644 lib/Command/Company/Disable.php create mode 100644 lib/Command/Company/ListCommand.php create mode 100644 lib/Command/Developer/L10n.php create mode 100644 lib/Middleware/InjectionMiddleware.php create mode 100644 lib/Migration/InstallDefaultTheme.php create mode 100644 lib/Service/CompanyService.php create mode 100644 psalm.xml create mode 100644 tests/php/bootstrap.php create mode 100644 tests/php/phpunit.xml create mode 100644 tests/psalm-baseline.xml create mode 100644 themes/default/core/img/background.jpg create mode 100644 themes/default/core/img/logo.svg create mode 100644 themes/default/core/templates/untrustedDomain.php create mode 100644 themes/default/defaults.php create mode 100644 vendor-bin/cs-fixer/composer.json create mode 100644 vendor-bin/cs-fixer/composer.lock create mode 100644 vendor-bin/phpunit/composer.json create mode 100644 vendor-bin/phpunit/composer.lock create mode 100644 vendor-bin/psalm/composer.json create mode 100644 vendor-bin/psalm/composer.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..51117a6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.feature] +indent_size = 2 +indent_style = space + +[*.yml] +indent_size = 2 +indent_style = space + +[*.md] +trim_trailing_whitespace = false + +[*.svg] +insert_final_newline = false diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..52efc2e --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# How to contribute? + +Fork and pull request! πŸ˜ƒ + +NOTE: If the project does not have an issue for what you want to do, create an issue first. + +Feel free to submit [Github Issues](https://github.com/LibreCodeCoop/custom_domain/issues) or pull requests. + +The documentation website is build from the docs folder with vuepress. + +Read more in composer.json scripts section diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..e7e9a4b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,27 @@ +--- +name: πŸš€ Feature request +about: Suggest an idea for Custom Domain app +labels: 0. Needs triage, enhancement +--- + + + +### How to use GitHub + +* Please use the πŸ‘ [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to show that you are interested into the same feature. +* Please don't comment if you have no relevant information to add. It's just extra noise for everyone subscribed to this issue. +* Subscribe to receive notifications on status change and new comments. + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 0000000..7971aba --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,2 @@ +# Comment to be posted to on PRs from first time contributors in your repository +newPRWelcomeComment: "Thanks for opening your first pull request in this repository! :v:" diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..e9d4919 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,32 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + # Maintain dependencies for Composer + - package-ecosystem: "composer" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: weekly + day: saturday + time: "03:00" + timezone: America/Sao_Paulo + open-pull-requests-limit: 10 + labels: + - 3. to review + - dependencies + + # Maintain dependencies for npm + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: weekly + day: saturday + time: "03:00" + timezone: America/Sao_Paulo + open-pull-requests-limit: 10 + labels: + - 3. to review + - dependencies diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..82341aa --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +### β˜‘οΈ Resolves + +* Fix # + + + +### πŸ–ΌοΈ Screenshots + +🏚️ Before | 🏑 After +---|--- +B | A + + +### 🚧 Tasks + +- [ ] ... + +### 🏁 Checklist + +- Code is [properly formatted](https://docs.nextcloud.com/server/latest/developer_manual/digging_deeper/continuous_integration.html#linting) +- [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits +- [ ] ⛑️ Tests (unit and/or integration) are included or not required +- [ ] πŸ“· Screenshots before/after for front-end changes +- [ ] πŸ“˜ Documentation has been updated or is not required +- [ ] [Backports requested](https://github.com/nextcloud/backportbot/#usage) where applicable (ex: critical bugfixes) diff --git a/.github/workflows/appstore-build-publish.yml b/.github/workflows/appstore-build-publish.yml new file mode 100644 index 0000000..818eb32 --- /dev/null +++ b/.github/workflows/appstore-build-publish.yml @@ -0,0 +1,167 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Build and publish app release + +on: + release: + types: [published] + +env: + PHP_VERSION: 8.1 + +jobs: + build_and_publish: + runs-on: ubuntu-latest + + # # Only allowed to be run on nextcloud-releases repositories + # if: ${{ github.repository_owner == 'nextcloud-releases' }} + + steps: + - name: Check actor permission + uses: skjnldsv/check-actor-permission@e591dbfe838300c007028e1219ca82cc26e8d7c5 # v2.1 + with: + require: write + + - name: Set app env + run: | + # Split and keep last + echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV + echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 + with: + path: ${{ env.APP_NAME }} + + - name: Get appinfo data + id: appinfo + uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master + with: + filename: ${{ env.APP_NAME }}/appinfo/info.xml + expression: "//info//dependencies//nextcloud/@min-version" + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@1bdcee71fa343c46b18dc6aceffb4cd1e35209c6 # v1.2 + id: versions + # Continue if no package.json + continue-on-error: true + with: + path: ${{ env.APP_NAME }} + fallbackNode: "^16" + fallbackNpm: "^7" + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + # Skip if no package.json + if: ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # v3 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + # Skip if no package.json + if: ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Set up php ${{ env.PHP_VERSION }} + uses: shivammathur/setup-php@1a18b2267f80291a81ca1d33e7c851fe09e7dfc4 # v2 + with: + php-version: ${{ env.PHP_VERSION }} + coverage: none + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check composer.json + id: check_composer + uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2 + with: + files: "${{ env.APP_NAME }}/composer.json" + + - name: Install composer dependencies + if: steps.check_composer.outputs.files_exists == 'true' + run: | + cd ${{ env.APP_NAME }} + composer install --no-dev + + - name: Build ${{ env.APP_NAME }} + # Skip if no package.json + if: ${{ steps.versions.outputs.nodeVersion }} + run: | + cd ${{ env.APP_NAME }} + npm ci + npm run build + + - name: Check Krankerl config + id: krankerl + uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2 + with: + files: ${{ env.APP_NAME }}/krankerl.toml + + - name: Install Krankerl + if: steps.krankerl.outputs.files_exists == 'true' + run: | + wget https://github.com/ChristophWurst/krankerl/releases/download/v0.14.0/krankerl_0.14.0_amd64.deb + sudo dpkg -i krankerl_0.14.0_amd64.deb + + - name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }} with krankerl + if: steps.krankerl.outputs.files_exists == 'true' + run: | + cd ${{ env.APP_NAME }} + krankerl package + + - name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }} with makefile + if: steps.krankerl.outputs.files_exists != 'true' + run: | + cd ${{ env.APP_NAME }} + make appstore + + - name: Checkout server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }} + continue-on-error: true + id: server-checkout + run: | + NCVERSION=${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }} + wget --quiet https://download.nextcloud.com/server/releases/latest-$NCVERSION.zip + unzip latest-$NCVERSION.zip + + - name: Checkout server master fallback + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 + if: ${{ steps.server-checkout.outcome != 'success' }} + with: + submodules: true + repository: nextcloud/server + path: nextcloud + + - name: Sign app + run: | + # Extracting release + cd ${{ env.APP_NAME }}/build/artifacts + tar -xvf ${{ env.APP_NAME }}.tar.gz + cd ../../../ + # Setting up keys + echo "${{ secrets.APP_PRIVATE_KEY }}" > ${{ env.APP_NAME }}.key + wget --quiet "https://github.com/nextcloud/app-certificate-requests/raw/master/${{ env.APP_NAME }}/${{ env.APP_NAME }}.crt" + # Signing + php nextcloud/occ integrity:sign-app --privateKey=../${{ env.APP_NAME }}.key --certificate=../${{ env.APP_NAME }}.crt --path=../${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }} + # Rebuilding archive + cd ${{ env.APP_NAME }}/build/artifacts + tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }} + + - name: Attach tarball to github release + uses: svenstaro/upload-release-action@133984371c30d34e38222a64855679a414cb7575 # v2 + id: attach_to_release + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}.tar.gz + asset_name: ${{ env.APP_NAME }}-${{ env.APP_VERSION }}.tar.gz + tag: ${{ github.ref }} + overwrite: true + + - name: Upload app to Nextcloud appstore + uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1 + with: + app_name: ${{ env.APP_NAME }} + appstore_token: ${{ secrets.APPSTORE_TOKEN }} + download_url: ${{ steps.attach_to_release.outputs.browser_download_url }} + app_private_key: ${{ secrets.APP_PRIVATE_KEY }} diff --git a/.github/workflows/command-rebase.yml b/.github/workflows/command-rebase.yml new file mode 100644 index 0000000..1b38843 --- /dev/null +++ b/.github/workflows/command-rebase.yml @@ -0,0 +1,51 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Rebase command + +on: + issue_comment: + types: created + +permissions: + contents: read + +jobs: + rebase: + runs-on: ubuntu-latest + permissions: + contents: none + + # On pull requests and if the comment starts with `/rebase` + if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase') + + steps: + - name: Add reaction on start + uses: peter-evans/create-or-update-comment@5adcb0bb0f9fb3f95ef05400558bdb3f329ee808 # v2.1.0 + with: + token: ${{ secrets.COMMAND_BOT_PAT }} + repository: ${{ github.event.repository.full_name }} + comment-id: ${{ github.event.comment.id }} + reaction-type: "+1" + + - name: Checkout the latest code + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 + with: + fetch-depth: 0 + token: ${{ secrets.COMMAND_BOT_PAT }} + + - name: Automatic Rebase + uses: cirrus-actions/rebase@6e572f08c244e2f04f9beb85a943eb618218714d # 1.7 + env: + GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }} + + - name: Add reaction on failure + uses: peter-evans/create-or-update-comment@5adcb0bb0f9fb3f95ef05400558bdb3f329ee808 # v2.1.0 + if: failure() + with: + token: ${{ secrets.COMMAND_BOT_PAT }} + repository: ${{ github.event.repository.full_name }} + comment-id: ${{ github.event.comment.id }} + reaction-type: "-1" diff --git a/.github/workflows/dependabot-approve-merge.yml b/.github/workflows/dependabot-approve-merge.yml new file mode 100644 index 0000000..9951547 --- /dev/null +++ b/.github/workflows/dependabot-approve-merge.yml @@ -0,0 +1,40 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Dependabot + +on: + pull_request_target: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: dependabot-approve-merge-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + auto-approve-merge: + if: github.actor == 'dependabot[bot]' + runs-on: ubuntu-latest + permissions: + # for hmarr/auto-approve-action to approve PRs + pull-requests: write + + steps: + # Github actions bot approve + - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + # Nextcloud bot approve and merge request + - uses: ahmadnassri/action-dependabot-auto-merge@45fc124d949b19b6b8bf6645b6c9d55f4f9ac61a # v2 + with: + target: minor + github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }} diff --git a/.github/workflows/lint-eslint-when-unrelated.yml b/.github/workflows/lint-eslint-when-unrelated.yml new file mode 100644 index 0000000..7a2e9f0 --- /dev/null +++ b/.github/workflows/lint-eslint-when-unrelated.yml @@ -0,0 +1,39 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization +# +# Use lint-eslint together with lint-eslint-when-unrelated to make eslint a required check for GitHub actions +# https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks + +name: Lint eslint + +on: + pull_request: + paths-ignore: + - '.github/workflows/**' + - 'src/**' + - 'appinfo/info.xml' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - '.eslintrc.*' + - '.eslintignore' + - '**.js' + - '**.ts' + - '**.vue' + +permissions: + contents: read + +jobs: + lint: + permissions: + contents: none + + runs-on: ubuntu-latest + + name: eslint + + steps: + - run: 'echo "No eslint required"' diff --git a/.github/workflows/lint-eslint.yml b/.github/workflows/lint-eslint.yml new file mode 100644 index 0000000..96896e3 --- /dev/null +++ b/.github/workflows/lint-eslint.yml @@ -0,0 +1,62 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization +# +# Use lint-eslint together with lint-eslint-when-unrelated to make eslint a required check for GitHub actions +# https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks + +name: Lint eslint + +on: + pull_request: + paths: + - '.github/workflows/**' + - 'src/**' + - 'appinfo/info.xml' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - '.eslintrc.*' + - '.eslintignore' + - '**.js' + - '**.ts' + - '**.vue' + +permissions: + contents: read + +concurrency: + group: lint-eslint-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + + name: eslint + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2 + id: versions + with: + fallbackNode: '^20' + fallbackNpm: '^9' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint diff --git a/.github/workflows/lint-info-xml.yml b/.github/workflows/lint-info-xml.yml new file mode 100644 index 0000000..84d5a87 --- /dev/null +++ b/.github/workflows/lint-info-xml.yml @@ -0,0 +1,39 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Lint info.xml + +on: + pull_request: + push: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: lint-info-xml-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + xml-linters: + runs-on: ubuntu-latest + + name: info.xml lint + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Download schema + run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd + + - name: Lint info.xml + uses: ChristophWurst/xmllint-action@39155a91429af431d65fafc21fa52ba5c4f5cb71 # v1.1 + with: + xml-file: ./appinfo/info.xml + xml-schema-file: ./info.xsd diff --git a/.github/workflows/lint-php-cs.yml b/.github/workflows/lint-php-cs.yml new file mode 100644 index 0000000..0fdb3eb --- /dev/null +++ b/.github/workflows/lint-php-cs.yml @@ -0,0 +1,40 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Lint php-cs + +on: pull_request + +permissions: + contents: read + +concurrency: + group: lint-php-cs-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + + name: php-cs + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Set up php + uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2 + with: + php-version: 8.1 + coverage: none + ini-file: development + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install dependencies + run: composer i + + - name: Lint + run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 ) diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml new file mode 100644 index 0000000..22f8612 --- /dev/null +++ b/.github/workflows/lint-php.yml @@ -0,0 +1,60 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Lint php + +on: + pull_request: + push: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: lint-php-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + php-lint: + runs-on: ubuntu-latest + strategy: + matrix: + php-versions: [ "8.0", "8.1", "8.2" ] + + name: php-lint + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2 + with: + php-version: ${{ matrix.php-versions }} + coverage: none + ini-file: development + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Lint + run: composer run lint + + summary: + permissions: + contents: none + runs-on: ubuntu-latest + needs: php-lint + + if: always() + + name: php-lint-summary + + steps: + - name: Summary status + run: if ${{ needs.php-lint.result != 'success' && needs.php-lint.result != 'skipped' }}; then exit 1; fi diff --git a/.github/workflows/lint-stylelint.yml b/.github/workflows/lint-stylelint.yml new file mode 100644 index 0000000..ae6771b --- /dev/null +++ b/.github/workflows/lint-stylelint.yml @@ -0,0 +1,46 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Lint stylelint + +on: pull_request + +permissions: + contents: read + +concurrency: + group: lint-stylelint-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + + name: stylelint + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2 + id: versions + with: + fallbackNode: '^20' + fallbackNpm: '^9' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run stylelint diff --git a/.github/workflows/node-when-unrelated.yml b/.github/workflows/node-when-unrelated.yml new file mode 100644 index 0000000..db32b0d --- /dev/null +++ b/.github/workflows/node-when-unrelated.yml @@ -0,0 +1,43 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization +# +# Use node together with node-when-unrelated to make eslint a required check for GitHub actions +# https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks + +name: Node + +on: + pull_request: + paths-ignore: + - '.github/workflows/**' + - 'src/**' + - 'appinfo/info.xml' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - '**.js' + - '**.ts' + - '**.vue' + push: + branches: + - main + - master + - stable* + +concurrency: + group: node-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + permissions: + contents: none + + runs-on: ubuntu-latest + + name: node + steps: + - name: Skip + run: 'echo "No JS/TS files changed, skipped Node"' diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml new file mode 100644 index 0000000..c4dabd8 --- /dev/null +++ b/.github/workflows/node.yml @@ -0,0 +1,90 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Node + +on: + pull_request: + paths: + - '.github/workflows/**' + - 'src/**' + - 'appinfo/info.xml' + - 'package.json' + - 'package-lock.json' + - 'tsconfig.json' + - '**.js' + - '**.ts' + - '**.vue' + push: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: node-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + + name: node + strategy: + matrix: + server-versions: ['master'] + steps: + - name: Set app env + run: | + # Split and keep last + echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV + + - name: Checkout server + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: true + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + path: apps/${{ env.APP_NAME }} + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2 + id: versions + with: + fallbackNode: '^20' + fallbackNpm: '^9' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install dependencies & build + working-directory: apps/${{ env.APP_NAME }} + run: | + npm ci + npm run build --if-present + + - name: Check webpack build changes + working-directory: apps/${{ env.APP_NAME }} + run: | + bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" + + - name: Show changes on failure + if: failure() + run: | + git status + git --no-pager diff + exit 1 # make it red to grab attention diff --git a/.github/workflows/phpunit-sqlite.yml b/.github/workflows/phpunit-sqlite.yml new file mode 100644 index 0000000..35463b0 --- /dev/null +++ b/.github/workflows/phpunit-sqlite.yml @@ -0,0 +1,148 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: PHPUnit sqlite + +on: + pull_request: + paths: + - '.github/workflows/**' + - 'appinfo/**' + - 'lib/**' + - 'templates/**' + - 'tests/**' + - 'vendor/**' + - 'vendor-bin/**' + - '.php-cs-fixer.dist.php' + - 'composer.json' + - 'composer.lock' + + push: + branches: + - main + - master + - stable* + +permissions: + contents: read + +concurrency: + group: phpunit-sqlite-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + phpunit-sqlite: + runs-on: ubuntu-latest + + strategy: + matrix: + php-versions: ['8.0'] + server-versions: ['master'] + + steps: + - name: Set app env + run: | + # Split and keep last + echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV + + - name: Checkout server + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: true + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + + - name: Checkout app + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + path: apps/${{ env.APP_NAME }} + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2 + with: + php-version: ${{ matrix.php-versions }} + # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation + extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite + coverage: none + ini-file: development + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check composer file existence + id: check_composer + uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2 + with: + files: apps/${{ env.APP_NAME }}/composer.json + + - name: Set up dependencies + # Only run if phpunit config file exists + if: steps.check_composer.outputs.files_exists == 'true' + working-directory: apps/${{ env.APP_NAME }} + run: composer i + + - name: Set up Nextcloud + env: + DB_PORT: 4444 + run: | + mkdir data + ./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin + ./occ app:enable --force ${{ env.APP_NAME }} + + - name: Check PHPUnit script is defined + id: check_phpunit + continue-on-error: true + working-directory: apps/${{ env.APP_NAME }} + run: | + composer run --list | grep "^ test:unit " | wc -l | grep 1 + + - name: PHPUnit + # Only run if phpunit config file exists + if: steps.check_phpunit.outcome == 'success' + working-directory: apps/${{ env.APP_NAME }} + run: composer run test:unit + + - name: Check PHPUnit integration script is defined + id: check_integration + continue-on-error: true + working-directory: apps/${{ env.APP_NAME }} + run: | + composer run --list | grep "^ test:integration " | wc -l | grep 1 + + - name: Run Nextcloud + # Only run if phpunit integration config file exists + if: steps.check_integration.outcome == 'success' + run: php -S localhost:8080 & + + - name: PHPUnit integration + # Only run if phpunit integration config file exists + if: steps.check_integration.outcome == 'success' + working-directory: apps/${{ env.APP_NAME }} + run: composer run test:integration + + - name: Print logs + if: always() + run: | + cat data/nextcloud.log + + - name: Skipped + # Fail the action when neither unit nor integration tests ran + if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure' + run: | + echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts' + exit 1 + + summary: + permissions: + contents: none + runs-on: ubuntu-latest + needs: phpunit-sqlite + + if: always() + + name: phpunit-sqlite-summary + + steps: + - name: Summary status + run: if ${{ needs.phpunit-sqlite.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/phpunit-summary-when-unrelated.yml b/.github/workflows/phpunit-summary-when-unrelated.yml new file mode 100644 index 0000000..484fdbb --- /dev/null +++ b/.github/workflows/phpunit-summary-when-unrelated.yml @@ -0,0 +1,68 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: PHPUnit summary + +on: + pull_request: + paths-ignore: + - '.github/workflows/**' + - 'appinfo/**' + - 'lib/**' + - 'templates/**' + - 'tests/**' + - 'vendor/**' + - 'vendor-bin/**' + - '.php-cs-fixer.dist.php' + - 'composer.json' + - 'composer.lock' + +permissions: + contents: read + +jobs: + summary-mysql: + permissions: + contents: none + runs-on: ubuntu-latest + + name: phpunit-mysql-summary + + steps: + - name: Summary status + run: 'echo "No PHP files changed, skipped PHPUnit"' + + summary-oci: + permissions: + contents: none + runs-on: ubuntu-latest + + name: phpunit-oci-summary + + steps: + - name: Summary status + run: 'echo "No PHP files changed, skipped PHPUnit"' + + summary-pgsql: + permissions: + contents: none + runs-on: ubuntu-latest + + name: phpunit-pgsql-summary + + steps: + - name: Summary status + run: 'echo "No PHP files changed, skipped PHPUnit"' + + summary-sqlite: + permissions: + contents: none + runs-on: ubuntu-latest + + name: phpunit-sqlite-summary + + steps: + - name: Summary status + run: 'echo "No PHP files changed, skipped PHPUnit"' diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml new file mode 100644 index 0000000..28ed862 --- /dev/null +++ b/.github/workflows/psalm.yml @@ -0,0 +1,52 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Static analysis + +on: + pull_request: + paths: + - '.github/workflows/**' + - 'appinfo/**' + - 'lib/**' + - 'templates/**' + - 'tests/**' + - 'vendor/**' + - 'vendor-bin/**' + - '.php-cs-fixer.dist.php' + - 'composer.json' + - 'composer.lock' + push: + branches: + - master + - main + - stable* + +concurrency: + group: psalm-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + static-analysis: + runs-on: ubuntu-latest + + name: Nextcloud + steps: + - name: Checkout + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 + + - name: Set up php + uses: shivammathur/setup-php@1a18b2267f80291a81ca1d33e7c851fe09e7dfc4 # v2 + with: + php-version: 8.1 + coverage: none + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install dependencies + run: composer i + + - name: Run coding standards check + run: composer run psalm diff --git a/.github/workflows/update-nextcloud-ocp.yml b/.github/workflows/update-nextcloud-ocp.yml new file mode 100644 index 0000000..0cf3140 --- /dev/null +++ b/.github/workflows/update-nextcloud-ocp.yml @@ -0,0 +1,83 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization + +name: Update nextcloud/ocp + +on: + workflow_dispatch: + schedule: + - cron: "5 2 * * 0" + +jobs: + update-nextcloud-ocp: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + branches: ["main", "master", "stable27", "stable26", "stable25"] + + name: update-nextcloud-ocp-${{ matrix.branches }} + + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + ref: ${{ matrix.branches }} + submodules: true + + - name: Set up php8.1 + uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2 + with: + php-version: 8.1 + # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation + extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite + coverage: none + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Composer install + run: composer install + + - name: Composer update nextcloud/ocp + if: matrix.branches != 'main' + run: composer require --dev nextcloud/ocp:dev-${{ matrix.branches }} + + - name: Composer update nextcloud/ocp + if: matrix.branches == 'main' + run: composer require --dev nextcloud/ocp:dev-master + + - name: Reset checkout 3rdparty + run: | + git clean -f 3rdparty + git checkout 3rdparty + continue-on-error: true + + - name: Reset checkout vendor + run: | + git clean -f vendor + git checkout vendor + continue-on-error: true + + - name: Reset checkout vendor-bin + run: | + git clean -f vendor-bin + git checkout vendor-bin + continue-on-error: true + + - name: Create Pull Request + uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # v3 + with: + token: ${{ secrets.COMMAND_BOT_PAT }} + commit-message: "chore(dev-deps): Bump nextcloud/ocp package" + committer: GitHub + author: nextcloud-command + signoff: true + branch: automated/noid/${{ matrix.branches }}-update-nextcloud-ocp + title: "[${{ matrix.branches }}] Update nextcloud/ocp dependency" + body: | + Auto-generated update of [nextcloud/ocp](https://github.com/nextcloud-deps/ocp/) dependency + labels: | + dependencies + 3. to review diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..550b740 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +/build + +# PHP +/vendor +/vendor-bin/*/vendor +/lib/Vendor +/.php-cs-fixer.cache +.phpunit.result.cache + +# PHPStorm +.idea +*.iml + +# VScode settings +.vscode +*.code-workspace + +/translationfiles/ diff --git a/.l10nignore b/.l10nignore new file mode 100644 index 0000000..cb3bb12 --- /dev/null +++ b/.l10nignore @@ -0,0 +1,4 @@ +build/ +tests/ +vendor/ +vendor-bin/ diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..a60aedd --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,17 @@ +getFinder() + ->ignoreVCSIgnored(true) + ->notPath('build') + ->notPath('l10n') + ->notPath('vendor') + ->in(__DIR__); +return $config; diff --git a/.tx/config b/.tx/config new file mode 100644 index 0000000..816e54c --- /dev/null +++ b/.tx/config @@ -0,0 +1,10 @@ +[main] +host = https://www.transifex.com +lang_map = hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi + +[o:nextcloud:p:nextcloud:r:custom_domain] +file_filter = translationfiles//custom_domain.po +source_file = translationfiles/templates/custom_domain.pot +source_lang = en +type = PO + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2b714b5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and follows the requirements of the [Nextcloud Appstore Metadata specification](https://nextcloudappstore.readthedocs.io/en/latest/developer.html#changelog). + +Types of changes: +- *Added* for new features. +- *Changed* for changes in existing functionality. +- *Deprecated* for soon-to-be removed features. +- *Removed* for now removed features. +- *Fixed* for any bug fixes. +- *Security* in case of vulnerabilities. + + +## [0.0.1-dev] - 2024-02-19 + +### Added + +- First release diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..14f00d9 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +contact@librecode.coop. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fbdf310 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + libresign + Copyright (C) 2020 LibreCode Coop + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fae4d40 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +[![Start contributing](https://img.shields.io/github/issues/LibreCodeCoop/custom_domain/good%20first%20issue?color=7057ff&label=Contribute)](https://github.com/LibreCodeCoop/custom_domain/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22) + +# Custom Domain + +Use custom domains at Nextcloud instance + +## Setup + +* Install this app +* Configuration +* go to root folder of your nextcloud instance and run the follow commands: +```bash +# Group folders +occ app:enable --force groupfolders + +## Customizations + +Not mandatory, but maybe is important +```bash +# Hide development notice +occ config:system:set has_valid_subscription --value true --type boolean + +# registration +occ app:enable --force registration +occ config:app:set registration show_fullname --value yes +occ config:app:set registration email_is_optional --value no +occ config:app:set registration disable_email_verification --value no +occ config:app:set registration enforce_fullname --value yes +occ config:app:set core shareapi_only_share_with_group_members --value yes + +occ config:app:set files default_quota --value "50 MB" + +occ config:app:set core shareapi_allow_share_dialog_user_enumeration --value yes + +# System settings +## Set the min length of password +occ config:app:set password_policy minLength --value 8 +## Disable Nextcloud knowledge database (help) +occ config:system:set knowledgebaseenabled --value false --type boolean +## use custom domain insteadof localhost when use occ commands +occ config:system:set overwrite.cli.url --value "https://CustomDomain.coop" + +# Skeleton directory +# First, go to root folder of Nextcloud +mkdir -p data/appdata_`occ config:system:get instanceid`/custom_domain/skeleton +occ config:system:set skeletondirectory --value /data/appdata_`occ config:system:get instanceid`/custom_domain/skeleton + +# Theme +occ config:app:set theming name --value "Custom Domain" +occ config:app:set theming slogan --value "Made with ❀️" +occ config:app:set theming url --value "https://CustomDomain.coop" +occ config:app:set theming color --value "#0082c9" +## This is mandatory if you want to use custom logo and background by domain +occ config:app:set theming logoMime --value "image/png" +occ config:app:set theming backgroundMime --value "image/jpg" + +``` +## Theming +* Inside the folder `appdata_/custom_domain/theming` you will need go create a folder with the domain of company +* Inside the folder of company, create the file `background` and `logo` without extension. + > Logo need to be PNG and background need to be PNG to follow the defined at `theming` app at `logoMime` and `backgroundMime` setting +* Refresh the cache of app data folder to update the metadata of new images: + ```bash + occ files:scan-app-data + ``` + +## Contributing + +[here](.github/CONTRIBUTING.md) diff --git a/appinfo/info.xml b/appinfo/info.xml new file mode 100644 index 0000000..4250dac --- /dev/null +++ b/appinfo/info.xml @@ -0,0 +1,39 @@ + + + custom_domain + Custom Domain + Use custom domains + + + 0.0.1-dev + agpl + LibreCode + CustomDomain + + https://github.com/librecodecoop/custom_domain/blob/master/README.md + + organization + tools + https://github.com/librecodecoop/custom_domain + https://t.me/librecodecoop + https://github.com/librecodecoop/custom_domain/issues + https://github.com/librecodecoop/custom_domain + + + + + + + OCA\CustomDomain\Migration\InstallDefaultTheme + + + OCA\CustomDomain\Migration\InstallDefaultTheme + + + + OCA\CustomDomain\Command\Company\Add + OCA\CustomDomain\Command\Company\Disable + OCA\CustomDomain\Command\Company\ListCommand + OCA\CustomDomain\Command\Developer\L10n + + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..72a5fdb --- /dev/null +++ b/composer.json @@ -0,0 +1,60 @@ +{ + "name": "librecode/custom_domain", + "description": "Use custom domains", + "type": "project", + "license": "AGPL", + "authors": [ + { + "name": "Vitor Mattos", + "email": "vitor@php.rio" + } + ], + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", + "nextcloud/ocp": "dev-master", + "roave/security-advisories": "dev-master" + }, + "config": { + "autoloader-suffix": "custom_domain", + "optimize-autoloader": true, + "classmap-authoritative": true, + "sort-packages": true, + "allow-plugins": { + "bamarni/composer-bin-plugin": true + } + }, + "scripts": { + "bin": "echo 'bin not installed'", + "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './vendor-bin/*' -not -path './node_modules/*' -not -path './build/*' -not -path './tests/integration/vendor/*' -print0 | xargs -0 -n1 php -l", + "cs:check": "php-cs-fixer fix --dry-run --diff", + "cs:fix": "php-cs-fixer fix", + "psalm": "psalm --threads=1", + "psalm:update-baseline": "psalm --threads=1 --update-baseline --set-baseline=tests/psalm-baseline.xml", + "psalm:clear": "psalm --clear-cache && psalm --clear-global-cache", + "post-install-cmd": [ + "@composer bin all install --ansi", + "composer dump-autoload" + ], + "post-update-cmd": [ + "@composer bin all update --ansi", + "composer dump-autoload" + ], + "test:unit": "vendor/bin/phpunit -c tests/php/phpunit.xml --color --fail-on-warning --fail-on-risky" + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + } + }, + "autoload": { + "psr-4": { + "OCA\\CustomDomain\\": "lib/" + } + }, + "autoload-dev": { + "psr-4": { + "OCP\\": "vendor/nextcloud/ocp/OCP" + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..7d2cd6c --- /dev/null +++ b/composer.lock @@ -0,0 +1,1061 @@ +{ + "_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": "3150c583924dc0a27b87e676d4a13fe2", + "packages": [], + "packages-dev": [ + { + "name": "bamarni/composer-bin-plugin", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "ext-json": "*", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Bamarni\\Composer\\Bin\\BamarniBinPlugin" + }, + "autoload": { + "psr-4": { + "Bamarni\\Composer\\Bin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" + ], + "support": { + "issues": "https://github.com/bamarni/composer-bin-plugin/issues", + "source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.2" + }, + "time": "2022-10-31T08:38:03+00:00" + }, + { + "name": "nextcloud/ocp", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/nextcloud-deps/ocp.git", + "reference": "ecc412f29a227848dd101912ec925fdc5fa214d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/ecc412f29a227848dd101912ec925fdc5fa214d7", + "reference": "ecc412f29a227848dd101912ec925fdc5fa214d7", + "shasum": "" + }, + "require": { + "php": "~8.0 || ~8.1 || ~8.2 || ~8.3", + "psr/clock": "^1.0", + "psr/container": "^2.0.2", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.1.4" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "29.0.0-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "AGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Christoph Wurst", + "email": "christoph@winzerhof-wurst.at" + } + ], + "description": "Composer package containing Nextcloud's public API (classes, interfaces)", + "support": { + "issues": "https://github.com/nextcloud-deps/ocp/issues", + "source": "https://github.com/nextcloud-deps/ocp/tree/master" + }, + "time": "2024-02-17T00:31:36+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/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": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "624324975ceed0b788160bdec5b7f22125d8de14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/624324975ceed0b788160bdec5b7f22125d8de14", + "reference": "624324975ceed0b788160bdec5b7f22125d8de14", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.2.13", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "airesvsg/acf-to-rest-api": "<=3.1", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "automad/automad": "<=1.10.9", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": "<3.288.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.24.2", + "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", + "badaso/core": "<2.7", + "bagisto/bagisto": "<1.3.2", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<4.8", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<2.9.5", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "bottelet/flarepoint": "<2.2.1", + "bref/bref": "<2.1.13", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.0.0-beta1", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.17", + "cockpit-hq/cockpit": "<=2.6.3", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<=4.4.2", + "codeigniter4/shield": "<1.0.0.0-beta8", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.23|>=2.3,<2.7", + "concrete5/concrete5": "<9.2.5", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=3,<3.5.35|>=4,<4.9.42|>=4.10,<4.13.28|>=5,<5.1.10", + "contao/listing-bundle": ">=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "corveda/phpsandbox": "<1.3.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<4.6.2", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czproject/git-php": "<4.0.3", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3.0-beta", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", + "desperado/xml-bundle": "<=0.1.7", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<18.0.2", + "dompdf/dompdf": "<2.0.4", + "doublethreedigital/guest-entries": "<3.1.2", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.1.8|>=10.2,<10.2.2", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "duncanmcclean/guest-entries": "<3.1.2", + "dweeves/magmi": "<=0.7.24", + "ec-cube/ec-cube": "<2.4.4", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "elefant/cms": "<2.0.7", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "elijaa/phpmemcacheadmin": "<=1.3", + "encore/laravel-admin": "<=1.8.19", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.34", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev", + "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", + "firebase/php-jwt": "<6", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8.5", + "flarum/framework": "<1.8.5", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<11", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1", + "froxlor/froxlor": "<=2.1.1", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getgrav/grav": "<1.7.44", + "getkirby/cms": "<3.5.8.3-dev|>=3.6,<3.6.6.3-dev|>=3.7,<3.7.5.2-dev|>=3.8,<3.8.4.1-dev|>=3.9,<3.9.6", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.15.4", + "gleez/cms": "<=1.2|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6.1.7", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.4", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "illuminate/auth": "<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.5", + "impresspages/impresspages": "<=1.0.12", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", + "in2code/ipandlanguageredirect": "<5.1.2", + "in2code/lux": "<17.6.1|>=18,<24.0.2", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "juzaweb/cms": "<=3.4", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<2.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<2.4.3.0-patch3|>=2.4.4,<2.4.5", + "magento/core": "<=1.9.4.5", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2", + "magneto/core": "<1.9.4.4-dev", + "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", + "mantisbt/mantisbt": "<=2.25.7", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.3", + "mediawiki/core": "<1.36.2", + "mediawiki/matomo": "<2.4.3", + "mediawiki/semantic-media-wiki": "<4.0.2", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", + "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<=2.0.4", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.3.0.0-RC2-dev", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "mpdf/mpdf": "<=7.1.7", + "munkireport/comment": "<4.1", + "munkireport/managedinstalls": "<2.6", + "munkireport/munkireport": ">=2.5.3,<5.6.3", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.2", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<20.2", + "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", + "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", + "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.2,<=4.2.8|>=5,<5.0.11|>=5.1,<5.1.1", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<5.0.8", + "oxid-esales/oxideshop-ce": "<4.5", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.14", + "pear/auth": "<1.2.4", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "phenx/php-svg-lib": "<0.5.1", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpems/phpems": ">=6,<=6.1.3", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<3.2.5", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.34", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.4.3", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.3.3", + "pimcore/customer-management-framework-bundle": "<4.0.6", + "pimcore/data-hub": "<1.2.4", + "pimcore/demo": "<10.3", + "pimcore/ecommerce-framework-bundle": "<1.0.10", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<11.1.1", + "pixelfed/pixelfed": "<0.11.11", + "plotly/plotly.js": "<2.25.2", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.3", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4", + "processwire/processwire": "<=3.0.210", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.7", + "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", + "ptrofimov/beanstalk_console": "<1.7.14", + "pubnub/pubnub": "<6.1", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6.0-beta", + "pyrocms/pyrocms": "<=3.9.1", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "remdex/livehelperchat": "<3.99", + "reportico-web/reportico": "<=7.1.21", + "rhukster/dom-sanitizer": "<1.0.7", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.5.7.3", + "shopware/platform": "<=6.5.7.3", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1", + "shopxo/shopxo": "<2.2.6", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.19|>=2,<2.1.8", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.13.39|>=5,<5.1.11", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-security": "==1.6.11", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<3.1.48|>=4,<4.3.1", + "snipe/snipe-it": "<=6.2.2", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<22.02.3", + "statamic/cms": "<4.46", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<2.1.62", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/sulu": "<1.6.44|>=2,<2.4.16|>=2.5,<2.5.12", + "sumocoders/framework-user-bundle": "<1.4", + "superbig/craft-audit": "<3.0.2", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "swiftyedit/swiftyedit": "<1.2", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/webhook": ">=6.3,<6.3.8", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7|>=2.2.0.0-beta1,<2.2.0.0-beta2", + "symphonycms/symphony-2": "<2.6.4", + "t3/dce": "<0.11.5|>=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "t3s/content-consent": "<1.0.3|>=2,<2.0.2", + "tastyigniter/tastyigniter": "<3.3", + "tcg/voyager": "<=1.4", + "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<=5.1.7", + "thorsten/phpmyfaq": "<3.2.2", + "tikiwiki/tiki-manager": "<=17.1", + "tinymce/tinymce": "<5.10.9|>=6,<6.7.3", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.14", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<=9.4.59197", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<=8.7.56|>=9,<=9.5.45|>=10,<=10.4.42|>=11,<=11.5.34|>=12,<=12.4.10|==13", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", + "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "uasoft-indonesia/badaso": "<=2.9.7", + "unisharp/laravel-filemanager": "<2.6.4", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verot/class.upload.php": "<=2.1.6", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "winter/wn-backend-module": "<1.2.4", + "winter/wn-system-module": "<1.2.4", + "wintercms/winter": "<1.2.3", + "woocommerce/woocommerce": "<6.6", + "wp-cli/wp-cli": ">=0.12,<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wwbn/avideo": "<=12.4", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.29", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-authclient": "<2.2.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "yuan1994/tpadmin": "<=1.3.12", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<=6.1.53" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2024-02-19T06:05:04+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "nextcloud/ocp": 20, + "roave/security-advisories": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/composer/autoload.php b/composer/autoload.php new file mode 100644 index 0000000..9d88b56 --- /dev/null +++ b/composer/autoload.php @@ -0,0 +1,25 @@ + + * + * @author Vitor Mattos + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +require_once __DIR__ . '/../vendor/autoload.php'; diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js new file mode 100644 index 0000000..f87fca1 --- /dev/null +++ b/l10n/pt_BR.js @@ -0,0 +1,21 @@ +OC.L10N.register( + "my_company", + { + "people" : "pessoas", + "template" : "template", + "registration-form.pdf" : "ficha-de-matricula.pdf", + "register-file" : "ficha-de-matricula", + "My Company" : "Minha Empresa", + "Main menu" : "Menu principal", + "Home" : "InΓ­cio", + "Registration form" : "FormulΓ‘rio de cadastro", + "Welcome to your company!" : "Bem vindo a sua empresa!", + "Stay up to date about all news from your company." : "Esteja atualizado sobre todas as novidades de sua empresa.", + "Registration" : "Cadastro", + "Fill registration form" : "Preencha a ficha de matrΓ­cula", + "Fill with new data" : "Preencha com novos dados", + "View registration form" : "Ver ficha de matrΓ­cula", + "Data saved. Please wait for the review. If needed, you can fill out the form again." : "Dados salvos. Aguarde a revisΓ£o. Se necessΓ‘rio, vocΓͺ pode preencher novamente o formulΓ‘rio.", + "Access wrong page" : "Acesso a pΓ‘gina invΓ‘lida" +}, +""); diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json new file mode 100644 index 0000000..6337a8c --- /dev/null +++ b/l10n/pt_BR.json @@ -0,0 +1,19 @@ +{ "translations": { + "people" : "pessoas", + "template" : "template", + "registration-form.pdf" : "ficha-de-matricula.pdf", + "register-file" : "ficha-de-matricula", + "My Company" : "Minha Empresa", + "Main menu" : "Menu principal", + "Home" : "InΓ­cio", + "Registration form" : "FormulΓ‘rio de cadastro", + "Welcome to your company!" : "Bem vindo a sua empresa!", + "Stay up to date about all news from your company." : "Esteja atualizado sobre todas as novidades de sua empresa.", + "Registration" : "Cadastro", + "Fill registration form" : "Preencha a ficha de matrΓ­cula", + "Fill with new data" : "Preencha com novos dados", + "View registration form" : "Ver ficha de matrΓ­cula", + "Data saved. Please wait for the review. If needed, you can fill out the form again." : "Dados salvos. Aguarde a revisΓ£o. Se necessΓ‘rio, vocΓͺ pode preencher novamente o formulΓ‘rio.", + "Access wrong page" : "Acesso a pΓ‘gina invΓ‘lida" +},"pluralForm" :"" +} \ No newline at end of file diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php new file mode 100644 index 0000000..ce9cbaa --- /dev/null +++ b/lib/AppInfo/Application.php @@ -0,0 +1,51 @@ + + * + * @author Vitor Mattos + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\CustomDomain\AppInfo; + +use OCA\CustomDomain\Middleware\InjectionMiddleware; +use OCP\AppFramework\App; +use OCP\AppFramework\Bootstrap\IBootContext; +use OCP\AppFramework\Bootstrap\IBootstrap; +use OCP\AppFramework\Bootstrap\IRegistrationContext; + +/** + * @codeCoverageIgnore + */ +class Application extends App implements IBootstrap { + public const APP_ID = 'custom_domain'; + + public function __construct() { + parent::__construct(self::APP_ID); + } + + public function boot(IBootContext $context): void { + } + + public function register(IRegistrationContext $context): void { + $context->registerMiddleWare(InjectionMiddleware::class, true); + } +} diff --git a/lib/Backend/SystemGroupBackend.php b/lib/Backend/SystemGroupBackend.php new file mode 100644 index 0000000..6ca6d6c --- /dev/null +++ b/lib/Backend/SystemGroupBackend.php @@ -0,0 +1,263 @@ +dbConn = $dbConn; + } + + /** + * FIXME: This function should not be required! + */ + private function fixDI(): void { + if ($this->dbConn === null) { + $this->dbConn = \OC::$server->getDatabaseConnection(); + } + } + + public function inGroup($uid, $gid): bool { + if (!in_array($gid, $this->systemGroups)) { + return false; + } + if (!$this->canExposeThatIsInGroup()) { + return false; + } + $this->fixDI(); + + // check + $qb = $this->dbConn->getQueryBuilder(); + $cursor = $qb->select('uid') + ->from('group_user') + ->where($qb->expr()->eq('gid', $qb->createNamedParameter($gid))) + ->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid))) + ->executeQuery(); + + $result = $cursor->fetch(); + $cursor->closeCursor(); + + return $result ? true : false; + } + + /** + * Check by backtrace if this group or a member of this group can be + * exposed + */ + private function canExposeThatIsInGroup(): bool { + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + $allowedFunctions = [ + 'removeUser', + 'addUser', + ]; + foreach ($backtrace as $step) { + if (in_array($step['function'], $allowedFunctions)) { + return true; + } + } + return false; + } + + /** + * Add a user to a group + * @param string $uid Name of the user to add to group + * @param string $gid Name of the group in which add the user + * @return bool + * + * Adds a user to a group. + */ + public function addToGroup(string $uid, string $gid): bool { + $this->fixDI(); + + // No duplicate entries! + if (!$this->inGroup($uid, $gid)) { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('group_user') + ->setValue('uid', $qb->createNamedParameter($uid)) + ->setValue('gid', $qb->createNamedParameter($gid)) + ->executeStatement(); + return true; + } else { + return false; + } + } + + /** + * Removes a user from a group + * @param string $uid Name of the user to remove from group + * @param string $gid Name of the group from which remove the user + * @return bool + * + * removes the user from a group. + */ + public function removeFromGroup(string $uid, string $gid): bool { + $this->fixDI(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->delete('group_user') + ->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid))) + ->andWhere($qb->expr()->eq('gid', $qb->createNamedParameter($gid))) + ->executeStatement(); + + return true; + } + + /** + * get the number of all users matching the search string in a group + * @param string $gid + * @param string $search + * @return int + */ + public function countUsersInGroup(string $gid, string $search = ''): int { + $this->fixDI(); + + $query = $this->dbConn->getQueryBuilder(); + $query->select($query->func()->count('*', 'num_users')) + ->from('group_user') + ->where($query->expr()->eq('gid', $query->createNamedParameter($gid))); + + if ($search !== '') { + $query->andWhere($query->expr()->like('uid', $query->createNamedParameter( + '%' . $this->dbConn->escapeLikeParameter($search) . '%' + ))); + } + + $result = $query->execute(); + $count = $result->fetchOne(); + $result->closeCursor(); + + if ($count !== false) { + $count = (int)$count; + } else { + $count = 0; + } + + return $count; + } + + public function getDisplayName(string $gid): string { + return 'Waiting approval'; + } + + public function getUserGroups($uid) { + //guests has empty or null $uid + if ($uid === null || $uid === '') { + return []; + } + + $this->fixDI(); + + // No magic! + $qb = $this->dbConn->getQueryBuilder(); + $cursor = $qb->select('gu.gid', 'g.displayname') + ->from('group_user', 'gu') + ->leftJoin('gu', 'groups', 'g', $qb->expr()->eq('gu.gid', 'g.gid')) + ->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid))) + ->executeQuery(); + + $groups = []; + while ($row = $cursor->fetch()) { + $groups[] = $row['gid']; + } + $cursor->closeCursor(); + + return $groups; + } + + public function getGroups($search = '', $limit = -1, $offset = 0) { + return $this->systemGroups; + } + + public function groupExists($gid) { + if (in_array($gid, $this->systemGroups)) { + return true; + } + return false; + } + + public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { + if (!in_array($gid, $this->systemGroups)) { + return []; + } + return array_values(array_map(fn ($user) => $user->getUid(), $this->searchInGroup($gid, $search, $limit, $offset))); + } + + private function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array { + $this->fixDI(); + + $query = $this->dbConn->getQueryBuilder(); + $query->select('g.uid', 'u.displayname'); + + $query->from('group_user', 'g') + ->where($query->expr()->eq('gid', $query->createNamedParameter($gid))) + ->orderBy('g.uid', 'ASC'); + + $query->leftJoin('g', 'users', 'u', $query->expr()->eq('g.uid', 'u.uid')); + + if ($search !== '') { + $query->leftJoin('u', 'preferences', 'p', $query->expr()->andX( + $query->expr()->eq('p.userid', 'u.uid'), + $query->expr()->eq('p.appid', $query->expr()->literal('settings')), + $query->expr()->eq('p.configkey', $query->expr()->literal('email')) + )) + // sqlite doesn't like re-using a single named parameter here + ->andWhere( + $query->expr()->orX( + $query->expr()->ilike('g.uid', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')), + $query->expr()->ilike('u.displayname', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')), + $query->expr()->ilike('p.configvalue', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')) + ) + ) + ->orderBy('u.uid_lower', 'ASC'); + } + + if ($limit !== -1) { + $query->setMaxResults($limit); + } + if ($offset !== 0) { + $query->setFirstResult($offset); + } + + $result = $query->executeQuery(); + + $users = []; + $userManager = \OCP\Server::get(IUserManager::class); + while ($row = $result->fetch()) { + $users[$row['uid']] = new LazyUser($row['uid'], $userManager, $row['displayname'] ?? null); + } + $result->closeCursor(); + + return $users; + } + + public function hideGroup(string $groupId): bool { + return true; + } +} diff --git a/lib/Command/Company/Add.php b/lib/Command/Company/Add.php new file mode 100644 index 0000000..3670499 --- /dev/null +++ b/lib/Command/Company/Add.php @@ -0,0 +1,67 @@ +setName('custom-domain:company:add') + ->setDescription('Add new company') + ->addArgument( + 'code', + InputArgument::REQUIRED, + 'Code of company to add. Need to follow the slug format if you want to use spaces. The best is to have not spaces.' + ) + ->addOption( + 'name', + null, + InputOption::VALUE_REQUIRED, + 'Full name of company. Here you can use spaces.' + ) + ->addOption( + 'domain', + null, + InputOption::VALUE_REQUIRED, + 'Custom domain. The default behavior is to use the code as subdomain.' + ) + ->addOption( + 'force', + null, + InputOption::VALUE_NONE, + 'Force to run the creation flow to a company that already exits' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + try { + $this->companyService->add( + $input->getArgument('code'), + $input->getOption('name') ?? '', + $input->getOption('domain') ?? '', + $input->getOption('force') ?? false + ); + $output->writeln('Company created'); + } catch (InvalidArgumentException $e) { + $output->writeln('' . $e->getMessage() . ''); + } + + return 0; + } +} diff --git a/lib/Command/Company/Disable.php b/lib/Command/Company/Disable.php new file mode 100644 index 0000000..7fc0f2f --- /dev/null +++ b/lib/Command/Company/Disable.php @@ -0,0 +1,46 @@ +setName('custom-domain:company:disable') + ->setDescription('Disable a company') + ->addArgument( + 'code', + InputArgument::REQUIRED, + 'Code of company to disable.' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + try { + $this->companyService->disable( + $input->getArgument('code'), + ); + $output->writeln('Company disabled'); + } catch (InvalidArgumentException $e) { + $output->writeln('' . $e->getMessage() . ''); + return 1; + } + + return 0; + } +} diff --git a/lib/Command/Company/ListCommand.php b/lib/Command/Company/ListCommand.php new file mode 100644 index 0000000..dc55004 --- /dev/null +++ b/lib/Command/Company/ListCommand.php @@ -0,0 +1,45 @@ +setName('custom-domain:company:list') + ->setDescription('List companies') + ->addOption( + 'output', + null, + InputOption::VALUE_OPTIONAL, + 'Output format (plain, json or json_pretty, default is plain)', + $this->defaultOutputFormat + ); + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + try { + $list = $this->companyService->list(); + $this->writeArrayInOutputFormat($input, $output, $list); + } catch (InvalidArgumentException $e) { + $output->writeln('' . $e->getMessage() . ''); + } + + return 0; + } +} diff --git a/lib/Command/Developer/L10n.php b/lib/Command/Developer/L10n.php new file mode 100644 index 0000000..6218cd3 --- /dev/null +++ b/lib/Command/Developer/L10n.php @@ -0,0 +1,77 @@ +config = $config; + $this->appDir = realpath(__DIR__ . '/../../../'); + + parent::__construct(); + } + + public function isEnabled(): bool { + return $this->config->getSystemValue('debug', false) === true; + } + + protected function configure(): void { + $this + ->setName('custom-domain:develop:l10n') + ->setDescription('Update documentation of commands') + ->addOption('create-pot-files') + ->addOption('convert-po-files') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + $tool = $this->getTranslationTool(); + + if (!$tool->checkEnvironment()) { + return 1; + } + if ($input->getOption('create-pot-files')) { + $tool->createPotFiles(); + } elseif ($input->getOption('convert-po-files')) { + $tool->convertPoFiles(); + } else { + $output->writeln('No commands to run. Use --help to check available commands.'); + } + + return 0; + } + + private function getTranslationTool(): \TranslationTool { + $toolsDir = $this->appDir . '/build/tools/gettext'; + if (!is_dir($toolsDir)) { + mkdir($toolsDir, 0755, true); + } + $file = $toolsDir . '/translationtool.php'; + if (!file_exists($file)) { + $translationToolUrl = 'https://raw.githubusercontent.com/nextcloud/docker-ci/master/translations/translationtool/src/translationtool.php'; + $code = file_get_contents($translationToolUrl); + list($class, ) = explode("\n// read the command line arguments", $code); + file_put_contents($file, $class); + } + if (!file_exists($toolsDir . '/composer.json')) { + shell_exec("composer require -d $toolsDir --dev gettext/gettext:^4.8"); + } + if (!is_dir($toolsDir . '/vendor')) { + shell_exec("composer install -d $toolsDir"); + } + require_once $file; + chdir($this->appDir); + + $tool = new \TranslationTool(); + return $tool; + } +} diff --git a/lib/Middleware/InjectionMiddleware.php b/lib/Middleware/InjectionMiddleware.php new file mode 100644 index 0000000..f6a1732 --- /dev/null +++ b/lib/Middleware/InjectionMiddleware.php @@ -0,0 +1,89 @@ +addBackend(new SystemGroupBackend()); + } + + public function afterController(Controller $controller, string $methodName, Response $response): Response { + if ($controller instanceof ThemingController) { + if ($methodName === 'getImage') { + return $this->getImageFromDomain($response); + } + } + return $response; + } + + private function getImageFromDomain(Response $response): Response { + if (!$response instanceof NotFoundResponse && !$response instanceof FileDisplayResponse) { + return $response; + } + + $type = $this->request->getParam('key'); + if (!in_array($type, ['logo', 'background'])) { + return $response; + } + + if ($type === 'logo') { + $file = $this->companyService->getThemeFile('core/img/logo.svg'); + $mime = 'image/svg+xml'; + } elseif ($type === 'background') { + $file = $this->companyService->getThemeFile('core/img/background.jpg'); + $mime = 'image/jpg'; + } else { + return new NotFoundResponse(); + } + + if ($response instanceof NotFoundResponse) { + $response = new FileDisplayResponse($file); + $csp = new ContentSecurityPolicy(); + $csp->allowInlineStyle(); + $response->cacheFor(3600); + $response->addHeader('Content-Type', $mime); + $response->addHeader('Content-Disposition', 'attachment; filename="' . $type . '"'); + $response->setContentSecurityPolicy($csp); + } else { + try { + $class = new \ReflectionClass($response); + $property = $class->getProperty('file'); + $property->setAccessible(true); + $property->setValue($response, $file); + } catch(\ReflectionException $e) { + } + } + + return $response; + } +} diff --git a/lib/Migration/InstallDefaultTheme.php b/lib/Migration/InstallDefaultTheme.php new file mode 100644 index 0000000..548e4ce --- /dev/null +++ b/lib/Migration/InstallDefaultTheme.php @@ -0,0 +1,50 @@ +appData->getFolder('themes'); + } catch (NotFoundException $e) { + $rootThemeFolder = $this->appData->newFolder('themes'); + } + $rootThemeFolder->delete('default'); + $defaultFolder = $rootThemeFolder->newFolder('default'); + $output->info('Instaling default theme'); + $this->recursiveCopy(__DIR__ . '/../../themes/default', $defaultFolder); + } + + private function recursiveCopy(string $source, ISimpleFolder $rootFolder): void { + foreach ( + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::SELF_FIRST) as $item + ) { + $dest = $iterator->getSubPathname(); + if (!$rootFolder->fileExists($dest)) { + if ($item->isDir()) { + $rootFolder->newFolder($dest); + } else { + $rootFolder->newFile($dest, file_get_contents($item->getRealPath())); + } + } + } + } +} diff --git a/lib/Service/CompanyService.php b/lib/Service/CompanyService.php new file mode 100644 index 0000000..95ecfdc --- /dev/null +++ b/lib/Service/CompanyService.php @@ -0,0 +1,186 @@ + + * + * @author Vitor Mattos + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\CustomDomain\Service; + +use InvalidArgumentException; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IL10N; +use OCP\IRequest; +use OCP\IUserSession; + +class CompanyService { + + public function __construct( + private IRequest $request, + private IDBConnection $db, + private IUserSession $userSession, + private IAppData $appData, + private IGroupManager $groupManager, + private IConfig $config, + private IL10N $l, + private IAppManager $appManager, + ) { + } + + public function add(string $code, string $name = '', string $domain = '', bool $force = true): void { + if ($error = $this->checkDependencies()) { + throw new InvalidArgumentException('Enable the follow apps first: ' . implode(', ', $error)); + } + $code = $this->slugify($code); + if (!empty($domain)) { + list($codeFromDomain) = explode('.', $domain); + if ($codeFromDomain !== $code && $code !== $this->slugify($domain)) { + throw new InvalidArgumentException('The domain or subdomain need to be equal to the code.'); + } + } else { + $domain = $code . '.' . $this->request->getServerHost(); + } + $group = $this->groupManager->get($code); + if ($group instanceof IGroup) { + if (!$force) { + throw new InvalidArgumentException('Already exists a company with this code'); + } + } else { + $group = $this->groupManager->createGroup($code); + if ($group === null) { + throw new InvalidArgumentException('Not supported by backend'); + } + } + if (!empty($name) && $group->getDisplayName() !== $name) { + $group->setDisplayName($name); + } + + $trustedDomains = $this->config->getSystemValue('trusted_domains'); + + $exists = array_filter($trustedDomains, fn ($host) => str_contains($host, $domain)); + if (!$exists) { + if (empty($domain)) { + $trustedDomains[] = $code . '.' . $this->request->getServerHost(); + } else { + $trustedDomains[] = $domain; + } + $this->config->setSystemValue('trusted_domains', $trustedDomains); + } + } + + public function list(): array { + if ($error = $this->checkDependencies()) { + throw new InvalidArgumentException('Enable the follow apps first: ' . implode(', ', $error)); + } + $return = []; + $trustedDomains = $this->config->getSystemValue('trusted_domains'); + foreach ($trustedDomains as $domain) { + $list = explode('.', $domain); + $subdomain = array_shift($list); + $group = $this->groupManager->get($subdomain); + if ($group instanceof IGroup) { + $return[] = $group->getDisplayName(); + } else { + $group = $this->groupManager->get($domain); + if ($group instanceof IGroup) { + $return[] = $group->getDisplayName(); + } + } + } + return $return; + } + + public function disable(string $code): void { + $code = $this->slugify($code); + if (!$this->groupManager->groupExists($code)) { + throw new InvalidArgumentException('Company not found with this code'); + } + $trustedDomains = $this->config->getSystemValue('trusted_domains'); + $toRemove = array_filter($trustedDomains, fn ($host) => str_contains($host, $code)); + $trustedDomains = array_filter($trustedDomains, fn ($host) => !in_array($host, $toRemove)); + $this->config->setSystemValue('trusted_domains', $trustedDomains); + } + + private function slugify(string $text): string { + // replace everything except alphanumeric with a single '-' + $text = preg_replace('/[^A-Za-z0-9]+/', '-', $text); + $text = strtolower($text); + return trim($text, '-'); + } + + public function getCompanyCode(): string { + $host = $this->request->getServerHost(); + list($subdomain) = explode('.', $host); + $group = $this->groupManager->get($subdomain); + if ($group instanceof IGroup) { + return $subdomain; + } + return $host; + } + + public function getThemeFile($name): ISimpleFile { + $folder = $this->getThemeFolder($this->getCompanyCode()); + try { + $file = $folder->getFile($name); + } catch (NotFoundException $e) { + $folder = $this->getThemeFolder('default'); + $file = $folder->getFile($name); + } + return $file; + } + + private function getThemeFolder(string $folderName): ISimpleFolder { + try { + $rootThemeFolder = $this->appData->getFolder('themes'); + } catch (NotFoundException $e) { + $rootThemeFolder = $this->appData->newFolder('themes'); + } + try { + $folder = $rootThemeFolder->getFolder($folderName); + } catch (NotFoundException $e) { + $folder = $rootThemeFolder->newFolder($folderName); + } + return $folder; + } + + /** + * @return array + */ + public function checkDependencies(): array { + $apps = ['groupfolders', 'theming']; + $appsMissing = []; + foreach ($apps as $app) { + if (!$this->appManager->isEnabledForUser($app)) { + $appsMissing[] = $app; + } + } + return $appsMissing; + } +} diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..5ce5c29 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/php/bootstrap.php b/tests/php/bootstrap.php new file mode 100644 index 0000000..e36e53a --- /dev/null +++ b/tests/php/bootstrap.php @@ -0,0 +1,31 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +if (!defined('PHPUNIT_RUN')) { + define('PHPUNIT_RUN', 1); +} +require_once __DIR__.'/../../../../lib/base.php'; +\OC::$loader->addValidRoot(\OC::$SERVERROOT . '/tests'); +\OC_App::loadApp('custom_domain'); +if (!class_exists('\PHPUnit\Framework\TestCase')) { + require_once('PHPUnit/Autoload.php'); +} +OC_Hook::clear(); diff --git a/tests/php/phpunit.xml b/tests/php/phpunit.xml new file mode 100644 index 0000000..0e3b98a --- /dev/null +++ b/tests/php/phpunit.xml @@ -0,0 +1,27 @@ + + + + . + + + + + ../../../custom_domain/appinfo + ../../../custom_domain/lib + + + + + + + + + diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml new file mode 100644 index 0000000..e8ce26e --- /dev/null +++ b/tests/psalm-baseline.xml @@ -0,0 +1,14 @@ + + + + + addHeader('Content-Disposition', 'attachment; filename="' . $type . '"')]]> + addHeader('Content-Type', $mime)]]> + cacheFor(3600)]]> + setContentSecurityPolicy($csp)]]> + + + + + + diff --git a/themes/default/core/img/background.jpg b/themes/default/core/img/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9cc2cc5cd15fc6c961221413a726fed1501bbfc GIT binary patch literal 190294 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 literal 0 HcmV?d00001 diff --git a/themes/default/core/img/logo.svg b/themes/default/core/img/logo.svg new file mode 100644 index 0000000..7a63030 --- /dev/null +++ b/themes/default/core/img/logo.svg @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/default/core/templates/untrustedDomain.php b/themes/default/core/templates/untrustedDomain.php new file mode 100644 index 0000000..822c636 --- /dev/null +++ b/themes/default/core/templates/untrustedDomain.php @@ -0,0 +1,9 @@ + + +
+

t('Access wrong page')); ?>

+ +

+ t('Humm... I think that you tried to access a wrong page. Check if the URL is OK and try again.')); ?> +

+
diff --git a/themes/default/defaults.php b/themes/default/defaults.php new file mode 100644 index 0000000..50521e7 --- /dev/null +++ b/themes/default/defaults.php @@ -0,0 +1,6 @@ +=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/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": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "symfony/console", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed", + "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-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.0.2" + }, + "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:55:41+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", + "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", + "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" + }, + "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:55:41+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-20T17:44:14+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11", + "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-20T17:44:14+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/6a180d1c45e0d9797470ca9eb46215692de00fa3", + "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "2114fd60f26a296cc403a7939ab91478475a33d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4", + "reference": "2114fd60f26a296cc403a7939ab91478475a33d4", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:58+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "011e781839dd1d2eb8119f65ac516a530f60226d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/011e781839dd1d2eb8119f65ac516a530f60226d", + "reference": "011e781839dd1d2eb8119f65ac516a530f60226d", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/vendor-bin/phpunit/composer.json b/vendor-bin/phpunit/composer.json new file mode 100644 index 0000000..5248533 --- /dev/null +++ b/vendor-bin/phpunit/composer.json @@ -0,0 +1,5 @@ +{ + "require-dev": { + "phpunit/phpunit": "^9.6" + } +} diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock new file mode 100644 index 0000000..7b589b3 --- /dev/null +++ b/vendor-bin/phpunit/composer.lock @@ -0,0 +1,1753 @@ +{ + "_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": "6c23f37f66ceb05fd480caba8880c601", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "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.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "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.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-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/v5.0.0" + }, + "time": "2024-01-07T17:17:35+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": "phpunit/php-code-coverage", + "version": "9.2.30", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.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": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "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", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:47:57+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.6.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2", + "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", + "phpunit/php-code-coverage": "^9.2.28", + "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.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-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", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-01-19T07:03:14+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.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "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.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bde739e7565280bda77be70044ac1047bc007e34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "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.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-02T09:26:13+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+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.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "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": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+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.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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": "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.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+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.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "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.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/vendor-bin/psalm/composer.json b/vendor-bin/psalm/composer.json new file mode 100644 index 0000000..b6bb7a1 --- /dev/null +++ b/vendor-bin/psalm/composer.json @@ -0,0 +1,8 @@ +{ + "config": { + "sort-packages": true + }, + "require-dev": { + "vimeo/psalm": "^5.13" + } +} diff --git a/vendor-bin/psalm/composer.lock b/vendor-bin/psalm/composer.lock new file mode 100644 index 0000000..4cb98b0 --- /dev/null +++ b/vendor-bin/psalm/composer.lock @@ -0,0 +1,2014 @@ +{ + "_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": "d330e84b56bbd3ab17d108261b8955fa", + "packages": [], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-10-11T07:11:09+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "ThΓ©o FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-02-07T09:43:46+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", + "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" + }, + "time": "2024-01-31T06:18:54+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "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.18.0" + }, + "time": "2023-12-10T21:03:43+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.8.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "bc3dc91a5e9b14aa06d1d9e90647c5c5a2cc5353" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/bc3dc91a5e9b14aa06d1d9e90647c5c5a2cc5353", + "reference": "bc3dc91a5e9b14aa06d1d9e90647c5c5a2cc5353", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "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.8.1" + }, + "time": "2024-01-18T19:15:27+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.25.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + }, + "time": "2024-01-04T17:06:16+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+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": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "spatie/array-to-xml", + "version": "3.2.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/c95fd4db94ec199f798d4b5b4a81757bd20d88ab", + "reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" + } + ], + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], + "support": { + "source": "https://github.com/spatie/array-to-xml/tree/3.2.3" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-02-07T10:39:02+00:00" + }, + { + "name": "symfony/console", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed", + "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-20T17:44:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:58+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "vimeo/psalm", + "version": "5.22.1", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "e9dad66e11274315dac27e08349c628c7d6a1a43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/e9dad66e11274315dac27e08349c628c7d6a1a43", + "reference": "e9dad66e11274315dac27e08349c628c7d6a1a43", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.1", + "felixfbecker/language-server-protocol": "^1.5.2", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.16", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "nikic/php-parser": "4.17.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^2.0", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "project", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev", + "dev-4.x": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php", + "static analysis" + ], + "support": { + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" + }, + "time": "2024-02-15T22:52:31+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" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +}