---
stages:
  - build
  - lint
  - codestyle
  - normalize
  - test

include:
  - template: Security/License-Scanning.gitlab-ci.yml
  - template: Security/Secret-Detection.gitlab-ci.yml
  - template: Security/SAST.gitlab-ci.yml

variables:
  MYSQL_ROOT_PASSWORD: root
  typo3DatabaseName: typo3
  typo3DatabaseHost: mariadb
  typo3DatabaseUsername: root
  typo3DatabasePassword: root

.default:
  image: php:7.4
  before_script:
    - bash .gitlab/build/docker_install.sh > /dev/null

.default-frontend:
  image: node:latest
  needs: [ ]
  cache:
    key: "$CI_PROJECT_ID"
    paths:
      - Resources/Private/node_modules/
      - Resources/Private/.yarn
  before_script:
    - npm install -g eslint
    - cd ./Resources/Private
    - yarn install --cache-folder .yarn

build-composer-dependencies:
  extends: .default
  stage: build
  needs: [ ]
  variables:
    COMPOSER_CACHE_DIR: '.composer'
  script:
    - composer --version
    - COMPOSER_CACHE_DIR=.composer
      composer install --prefer-dist --no-progress --optimize-autoloader
  artifacts:
    when: on_success
    expire_in: 2 weeks
    paths:
      - .Build
  cache:
    paths:
      - .composer
      - .Build

php-lint-php7.2:
  extends: .default
  image: php:7.2
  stage: lint
  needs: [ ]
  script:
    - composer ci:php:lint

php-lint-php7.3:
  extends: .default
  image: php:7.3
  stage: lint
  needs: [ ]
  script:
    - composer ci:php:lint

php-lint-php7.4:
  extends: .default
  image: php:7.4
  stage: lint
  needs: [ ]
  script:
    - composer ci:php:lint

ts-lint:
  extends: .default
  stage: lint
  needs:
    - build-composer-dependencies
  script:
    - composer ci:ts:lint

json-lint:
  extends: .default
  stage: lint
  needs:
    - build-composer-dependencies
  script:
    - composer ci:json:lint

yaml-lint:
  extends: .default
  stage: lint
  needs:
    - build-composer-dependencies
  script:
    - composer ci:yaml:lint

xliff-lint:
  extends: .default
  stage: lint
  needs:
    - build-composer-dependencies
  script:
    - wget https://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd
    - xmllint --schema ./xliff-core-1.2-strict.xsd
      --noout $(find Resources -name '*.xlf')

javascript-lint:
  extends: .default-frontend
  stage: lint
  script:
    - yarn lint:js

style-lint:
  extends: .default-frontend
  stage: lint
  script:
    - yarn lint:style

unit-php7.2-v10:
  extends: .default
  image: php:7.2
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:unit

unit-php7.3-v10:
  extends: .default
  image: php:7.3
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.3
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:unit

unit-php7.4-v10:
  extends: .default
  image: php:7.4
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.4
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:unit

func-php7.2-v10:
  extends: .default
  image: php:7.2
  services:
    - mariadb:10
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:functional

func-php7.3-v10:
  extends: .default
  image: php:7.3
  services:
    - mariadb:10
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.3
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:functional

func-php7.4-v10:
  extends: .default
  image: php:7.4
  services:
    - mariadb:10
  stage: test
  needs:
    - build-composer-dependencies
    - php-lint-php7.4
  script:
    - composer require --no-progress typo3/minimal:"^10.4"
    - composer ci:tests:functional

unit-php7.2-v9:
  extends: .default
  image: php:7.2
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:unit

unit-php7.3-v9:
  extends: .default
  image: php:7.3
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.3
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:unit

unit-php7.4-v9:
  extends: .default
  image: php:7.4
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.4
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:unit

func-php7.2-v9:
  extends: .default
  image: php:7.2
  services:
    - mariadb:10
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:functional

func-php7.3-v9:
  extends: .default
  image: php:7.3
  services:
    - mariadb:10
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.3
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:functional

func-php7.4-v9:
  extends: .default
  image: php:7.4
  services:
    - mariadb:10
  stage: test
  dependencies: [ ]
  needs:
    - build-composer-dependencies
    - php-lint-php7.4
  script:
    - composer require --no-progress typo3/minimal:"^9.5"
    - composer ci:tests:functional

phpcs:
  extends: .default
  stage: codestyle
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
    - php-lint-php7.3
    - php-lint-php7.4
  script:
    - composer ci:php:sniff

php-copypaste-check:
  extends: .default
  stage: codestyle
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
    - php-lint-php7.3
    - php-lint-php7.4
  script:
    - composer ci:php:copypaste

phpstan:
  extends: .default
  stage: codestyle
  needs:
    - build-composer-dependencies
    - php-lint-php7.2
    - php-lint-php7.3
    - php-lint-php7.4
  script:
    - composer ci:php:stan

composer-normalize:
  extends: .default
  stage: codestyle
  script:
    - composer ci:composer:normalize