diff --git a/.jjconflict-base-0/.dockerignore b/.jjconflict-base-0/.dockerignore
new file mode 100644
index 0000000000..2edecc5c93
--- /dev/null
+++ b/.jjconflict-base-0/.dockerignore
@@ -0,0 +1,26 @@
+# Npm
+node_modules
+npm-debug.log
+
+# Git
+.gitkeep
+
+# Lint
+.eslintrc.js
+.eslintrc.cjs
+.eslintrc.json
+.eslintignore
+.stylelintrc.js
+.stylelintrc.cjs
+
+# Tests
+.turbo/
+coverage/
+
+# Docker
+**/Dockerfile
+.dockerignore
+docker/
+
+# Env
+.env*
\ No newline at end of file
diff --git a/.jjconflict-base-0/.gitattributes b/.jjconflict-base-0/.gitattributes
new file mode 100644
index 0000000000..2e7bbd226d
--- /dev/null
+++ b/.jjconflict-base-0/.gitattributes
@@ -0,0 +1,2 @@
+# Generated API clients — collapse in diffs and exclude from language stats.
+plugins/harbor/src/api/Api.ts linguist-generated=true
diff --git a/.jjconflict-base-0/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
new file mode 100644
index 0000000000..f87368e72d
--- /dev/null
+++ b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
@@ -0,0 +1,98 @@
+name: 🐛 Rapport de bug
+description: Créer un ticket pour un bug.
+title: "🐛 [BUG] -
"
+labels: [bug]
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Veuillez saisir une description explicite de votre problème.
+ placeholder: Description courte et explicite de votre incident...
+ validations:
+ required: true
+
+ - type: textarea
+ id: reprod
+ attributes:
+ label: Etapes de reproduction
+ description: Veuillez saisir une description explicite pour reproduire votre problème.
+ value: |
+ 1. Aller à '...'
+ 2. Cliquer sur '....'
+ 3. Scroller jusqu'à '....'
+ 4. Voir l'erreur
+ render: bash
+ validations:
+ required: true
+
+ - type: textarea
+ id: screenshot
+ attributes:
+ label: "Captures d'écran"
+ description: Si nécessaire, ajoutez des captures d'écran pour expliquer votre problème.
+ value: |
+ 
+ render: bash
+ validations:
+ required: false
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Logs
+ description: Veuillez copier/coller tous les logs pertinents. Ces données seront automatiquement formatées en code.
+ validations:
+ required: false
+
+ - type: dropdown
+ id: browsers
+ attributes:
+ label: Navigateurs
+ description: Quels sont les navigateurs sur lesquels vous constatez le problème ?
+ multiple: true
+ options:
+ - Firefox
+ - Chrome
+ - Chromium
+ - Brave
+ - Safari
+ - Microsoft Edge
+ - Opera
+ validations:
+ required: false
+
+ - type: dropdown
+ id: os
+ attributes:
+ label: OS
+ description: Quels sont les systèmes d'exploitation sur lesquels vous constatez le problème ?
+ multiple: true
+ options:
+ - Windows
+ - Linux
+ - Mac
+ validations:
+ required: false
+
+ - type: input
+ id: affected-versions
+ attributes:
+ label: Version de la console impactée
+ description: Quelle version de la console est impactée par le bug ?
+ placeholder: v1.2.3
+ validations:
+ required: false
+
+ - type: checkboxes
+ id: dod
+ attributes:
+ label: Définition du fini
+ description: Cochez les différents élément de la Definition Of Done.
+ options:
+ - label: Le correctif est terminé
+ required: false
+ - label: Les tests liés à ce correctif ont été ajoutés
+ required: false
+ - label: La communication avec les autres équipes impliquées par ce correctif a été faite
+ required: false
diff --git a/.jjconflict-base-0/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml
new file mode 100644
index 0000000000..2d55aae3ad
--- /dev/null
+++ b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml
@@ -0,0 +1,64 @@
+name: 💡 Demande de fonctionnalité
+description: Créer un ticket pour demander une nouvelle fonctionnalité.
+title: "💡 [REQUEST] - "
+labels: [enhancement]
+body:
+ - type: textarea
+ id: summary
+ attributes:
+ label: Description
+ description: Veuillez saisir une brève explication de la fonctionnalité.
+ placeholder: Décrivez en quelques lignes la fonctionnalité désirée.
+ validations:
+ required: true
+
+ - type: textarea
+ id: implementation_pr
+ attributes:
+ label: PRs liées
+ description: Pull request qui répond à la fonctionnalité.
+ placeholder: "#Pull Request ID"
+ validations:
+ required: false
+
+ - type: textarea
+ id: reference_issues
+ attributes:
+ label: Issues liées
+ description: Issues associée à cette demande de fonctionnalité.
+ placeholder: "#Issues IDs"
+ validations:
+ required: false
+
+ - type: textarea
+ id: basic_example
+ attributes:
+ label: Exemples simples
+ description: Indiquez ici quelques exemples de base de votre fonctionnalité.
+ placeholder: Quelques mots sur votre demande de fonctionnalité.
+ validations:
+ required: false
+
+ - type: textarea
+ id: tech
+ attributes:
+ label: Spécifications techniques
+ description: Spcifiez les détails techniques liés à votre demande.
+ placeholder: Une description technique de la fonctionnalité.
+ validations:
+ required: false
+
+ - type: checkboxes
+ id: dod
+ attributes:
+ label: Définition du fini
+ description: Cochez les différents élément de la Definition Of Done.
+ options:
+ - label: La fonctionnalité est terminée
+ required: false
+ - label: Les tests liés à cette fonctionnalité ont été ajoutés
+ required: false
+ - label: La documentation liée à cette fonctionnalité a été ajoutée (cf. https://github.com/cloud-pi-native/documentation)
+ required: false
+ - label: La communication avec les autres équipes impliquées par cette fonctionnalité a été faite
+ required: false
diff --git a/.jjconflict-base-0/.github/ISSUE_TEMPLATE/config.yml b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000000..b565340e24
--- /dev/null
+++ b/.jjconflict-base-0/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
+blank_issues_enabled: true
+contact_links:
+ - name: 📚 Documentation
+ url: https://cloud-pi-native.fr
+ about: Cet outil de suivi des problèmes n'est pas destiné aux problèmes de documentation. Veuillez ouvrir un ticket sur le dépôt de documentation.
+ - name: 🚀 Déploiement
+ url: https://github.com/cloud-pi-native/socle
+ about: Cet outil de suivi des problèmes n'est pas destiné aux problèmes de déploiement de la plateforme. Veuillez ouvrir un ticket sur le dépôt de socle.
diff --git a/.jjconflict-base-0/.github/PULL_REQUEST_TEMPLATE.md b/.jjconflict-base-0/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..1730631ac9
--- /dev/null
+++ b/.jjconflict-base-0/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,21 @@
+## Issues liées
+
+Issues numéro:
+
+---------
+
+
+
+
+
+## Quel est le comportement actuel ?
+
+
+## Quel est le nouveau comportement ?
+
+
+## Cette PR introduit-elle un breaking change ?
+
+
+## Autres informations
+
diff --git a/.jjconflict-base-0/.github/SECURITY.md b/.jjconflict-base-0/.github/SECURITY.md
new file mode 100644
index 0000000000..9aaaf8698f
--- /dev/null
+++ b/.jjconflict-base-0/.github/SECURITY.md
@@ -0,0 +1,3 @@
+# Security Policy
+
+Contact: cloudpinative-relations@interieur.gouv.fr
diff --git a/.jjconflict-base-0/.github/labeler/build.yml b/.jjconflict-base-0/.github/labeler/build.yml
new file mode 100644
index 0000000000..68a15e21bc
--- /dev/null
+++ b/.jjconflict-base-0/.github/labeler/build.yml
@@ -0,0 +1,3 @@
+built:
+ - changed-files:
+ - any-glob-to-any-file: "**"
diff --git a/.jjconflict-base-0/.github/workflows/job-build.yml b/.jjconflict-base-0/.github/workflows/job-build.yml
new file mode 100644
index 0000000000..f1a1f96e51
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-build.yml
@@ -0,0 +1,256 @@
+name: Build
+
+permissions:
+ contents: read
+ packages: write
+
+on:
+ workflow_call:
+ inputs:
+ REGISTRY:
+ required: true
+ type: string
+ NAMESPACE:
+ required: true
+ type: string
+ BUILD_AMD64:
+ required: true
+ type: boolean
+ BUILD_ARM64:
+ required: true
+ type: boolean
+ TAG:
+ required: true
+ type: string
+ MAJOR_TAG:
+ required: false
+ type: string
+ MINOR_TAG:
+ required: false
+ type: string
+ PATCH_TAG:
+ required: false
+ type: string
+ USE_QEMU:
+ required: true
+ type: boolean
+ PR_NUMBER:
+ required: false
+ type: string
+ secrets:
+ ARGOCD_TOKEN:
+ required: false
+ workflow_dispatch:
+ inputs:
+ REGISTRY:
+ description: Target registry to push images
+ required: true
+ type: string
+ default: ghcr.io
+ NAMESPACE:
+ description: Target namespace to the given registry
+ required: true
+ type: string
+ default: cloud-pi-native/console
+ BUILD_AMD64:
+ description: Build for amd64
+ required: true
+ type: boolean
+ default: true
+ BUILD_ARM64:
+ description: Build for arm64
+ required: true
+ type: boolean
+ default: true
+ USE_QEMU:
+ description: Use QEMU emulator for arm64
+ required: true
+ type: boolean
+ default: false
+ PR_NUMBER:
+ description: ID number of the pull request to use for deploy preview app
+ required: false
+ type: string
+
+jobs:
+ matrix:
+ name: Generate matrix
+ runs-on: ubuntu-latest
+ outputs:
+ build-matrix: ${{ steps.build-matrix.outputs.BUILD_MATRIX }}
+ lower-branch: ${{ steps.lower-branch.outputs.LOWER_BRANCH }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Generate matrix
+ id: build-matrix
+ run: |
+ echo "BUILD_MATRIX=$(jq -c . < ./ci/matrix-docker.json)" >> $GITHUB_OUTPUT
+
+ - name: Get lowercase branch name
+ id: lower-branch
+ run: |
+ echo "LOWER_BRANCH=$(echo '${{ github.head_ref || github.ref_name }}' | sed 's/\//-/g' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
+
+ build:
+ name: Build application
+ runs-on: ${{ matrix.runners }}
+ needs:
+ - matrix
+ strategy:
+ fail-fast: false
+ matrix:
+ runners: ${{ (inputs.BUILD_AMD64 && inputs.BUILD_ARM64 && !inputs.USE_QEMU && fromJson('["ubuntu-latest", "ARM64"]')) || (inputs.BUILD_ARM64 && !inputs.USE_QEMU && fromJson('["ARM64"]')) || fromJson('["ubuntu-latest"]') }}
+ images: ${{ fromJSON(needs.matrix.outputs.build-matrix) }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Get short SHA
+ id: short-sha
+ run: |
+ echo "SHORT_SHA=sha-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
+
+ - name: Set up Docker buildx
+ uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
+
+ - name: Cache Docker layers
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: /tmp/.buildx-cache
+ key: ${{ matrix.images.name == 'server' && format('buildx-{0}-{1}-{2}-{3}', runner.os, runner.arch, matrix.images.name, hashFiles(format('apps/{0}/**', matrix.images.name),'packages/shared/**','plugins/**')) || format('buildx-{0}-{1}-{2}-{3}', runner.os, runner.arch, matrix.images.name, hashFiles(format('apps/{0}/**', matrix.images.name),'packages/shared/**')) }}
+ restore-keys: |
+ buildx-${{ runner.os }}-${{ runner.arch }}-${{ matrix.images.name }}-
+
+ - name: Set up QEMU (for multi platform build)
+ uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
+ if: ${{ inputs.USE_QEMU }}
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
+ with:
+ registry: ${{ inputs.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ logout: true
+
+ - name: Build and push docker image
+ id: build
+ uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
+ with:
+ context: ${{ matrix.images.build.context }}
+ file: ${{ matrix.images.build.dockerfile }}
+ provenance: false
+ platforms: ${{ (inputs.BUILD_AMD64 && inputs.BUILD_ARM64 && inputs.USE_QEMU && 'linux/amd64,linux/arm64') || (inputs.BUILD_ARM64 && 'linux/arm64') || (inputs.BUILD_AMD64 && 'linux/amd64') }}
+ outputs: type=image,name=${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }},push-by-digest=true,name-canonical=true,push=true
+ build-args: |
+ APP_VERSION=${{ inputs.TAG || steps.short-sha.outputs.SHORT_SHA }}
+ # cache-from: type=gha
+ # cache-to: type=gha,mode=max
+ cache-from: type=local,src=/tmp/.buildx-cache
+ cache-to: type=local,dest=/tmp/.buildx-cache-new
+
+ # Necessary to avoid forever growing cache
+ # https://github.com/docker/build-push-action/issues/252
+ # https://github.com/moby/buildkit/issues/1896
+ - name: Move cache
+ run: |
+ rm -rf /tmp/.buildx-cache
+ mv /tmp/.buildx-cache-new /tmp/.buildx-cache
+
+ - name: Export digest
+ run: |
+ mkdir -p /tmp/digests/${{ matrix.images.name }}
+ digest="${{ steps.build.outputs.digest }}"
+ touch "/tmp/digests/${{ matrix.images.name }}/${digest#sha256:}"
+
+ - name: Upload digest
+ uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
+ with:
+ name: digests-${{ matrix.images.name }}.${{ (inputs.BUILD_AMD64 && inputs.BUILD_ARM64 && inputs.USE_QEMU && 'multiarch') || (inputs.BUILD_ARM64 && 'arm64') || (inputs.BUILD_AMD64 && 'amd64') }}.digest
+ path: /tmp/digests/${{ matrix.images.name }}/*
+ if-no-files-found: error
+ retention-days: 1
+
+ merge:
+ name: Merge digest
+ runs-on: ubuntu-latest
+ needs:
+ - matrix
+ - build
+ strategy:
+ fail-fast: false
+ matrix:
+ images: ${{ fromJSON(needs.matrix.outputs.build-matrix) }}
+ steps:
+ - name: Download artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ pattern: digests-${{ matrix.images.name }}.*.digest
+ path: /tmp/digests/${{ matrix.images.name }}
+ merge-multiple: true
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
+
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
+ with:
+ images: ${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }}
+ tags: |
+ type=raw,value=${{ needs.matrix.outputs.lower-branch }},enable=${{ github.head_ref != 'main' }}
+ type=raw,value=${{ inputs.TAG }},enable=${{ inputs.TAG != '' }}
+ type=raw,value=${{ inputs.MAJOR_TAG }}.${{ inputs.MINOR_TAG }},enable=${{ inputs.MAJOR_TAG != '' && inputs.MINOR_TAG != '' }}
+ type=raw,value=${{ inputs.MAJOR_TAG }},enable=${{ inputs.MAJOR_TAG != '' }}
+ type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
+ with:
+ registry: ${{ inputs.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ logout: true
+
+ - name: Create manifest list and push
+ working-directory: /tmp/digests/${{ matrix.images.name }}
+ run: |
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
+ $(printf '${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }}@sha256:%s ' *)
+
+ - name: Inspect image
+ run: |
+ docker buildx imagetools inspect ${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }}:${{ steps.meta.outputs.version }}
+
+ preview:
+ name: Redeploy preview app
+ if: ${{ github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'preview') && inputs.PR_NUMBER != '' }}
+ runs-on: ubuntu-latest
+ needs:
+ - merge
+ steps:
+ - name: Replace template fields
+ id: feed-template
+ run: |
+ echo "ARGOCD_APP_NAME=$(echo '${{ vars.ARGOCD_APP_NAME_TEMPLATE }}' | sed 's||${{ inputs.PR_NUMBER }}|g')" >> $GITHUB_OUTPUT
+ echo "ARGOCD_SYNC_PAYLOAD=$(echo '${{ vars.ARGOCD_SYNC_PAYLOAD_TEMPLATE }}' | sed 's||${{ inputs.PR_NUMBER }}|g')" >> $GITHUB_OUTPUT
+
+ - name: Deploy new image
+ run: |
+ set -e
+
+ RESPONSE_CODE=$(curl -s -w "%{http_code}" -o >(RESPONSE_BODY=$(cat)) -X POST ${{ vars.ARGOCD_URL }}/api/v1/applications/${{ steps.feed-template.outputs.ARGOCD_APP_NAME }}/sync \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer ${{ secrets.ARGOCD_TOKEN }}" \
+ -d '${{ steps.feed-template.outputs.ARGOCD_SYNC_PAYLOAD }}')
+
+ echo "HTTP response code: $RESPONSE_CODE"
+
+ if [ "$RESPONSE_CODE" -ne 200 ]; then
+ echo "Error: Non-200 HTTP response detected."
+ echo "Response body: $RESPONSE_BODY"
+ exit 1
+ fi
+ continue-on-error: true
diff --git a/.jjconflict-base-0/.github/workflows/job-label.yml b/.jjconflict-base-0/.github/workflows/job-label.yml
new file mode 100644
index 0000000000..1fd944015f
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-label.yml
@@ -0,0 +1,25 @@
+name: Add labels on PR
+
+permissions:
+ contents: read
+ pull-requests: write
+
+on:
+ workflow_call:
+ inputs:
+ CONF_PATH:
+ required: true
+ type: string
+
+jobs:
+ label:
+ name: Add labels on PR
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Add pull request label
+ uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1
+ with:
+ configuration-path: ${{ inputs.CONF_PATH }}
diff --git a/.jjconflict-base-0/.github/workflows/job-lint.yml b/.jjconflict-base-0/.github/workflows/job-lint.yml
new file mode 100644
index 0000000000..bbbae077d6
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-lint.yml
@@ -0,0 +1,79 @@
+name: Lint
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ NODE_VERSION:
+ required: false
+ type: string
+ workflow_dispatch:
+ inputs:
+ NODE_VERSION:
+ description: Nodejs version used to run tests
+ required: true
+ type: string
+
+jobs:
+ lint:
+ name: Lint codebase
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
+ with:
+ node-version: "${{ inputs.NODE_VERSION }}"
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache node files
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: |
+ ${{ steps.pnpm-store.outputs.STORE_PATH }}
+ key: node-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ node-${{ runner.os }}-${{ runner.arch }}-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Check lint error
+ run: |
+ ./ci/scripts/run-tests.sh -l
+
+ - name: Validate nginx-strangler config
+ run: |
+ sudo apt-get update -qq
+ sudo apt-get install -y --no-install-recommends nginx gettext-base
+ # Préparer un répertoire de test isolé avec la config substituée
+ mkdir -p /tmp/nginx-test/conf.d /tmp/nginx-test/logs
+ envsubst '${LEGACY_UPSTREAM} ${NESTJS_UPSTREAM}' \
+ < apps/nginx-strangler/conf.d/routing.conf \
+ > /tmp/nginx-test/conf.d/routing.conf
+ # Adapter nginx.conf pour l'environnement CI (user www-data, paths accessibles)
+ sed \
+ -e 's|^user .*|user www-data;|' \
+ -e 's|pid .*|pid /tmp/nginx-test/nginx.pid;|' \
+ -e 's|error_log .*|error_log /tmp/nginx-test/logs/error.log notice;|' \
+ -e 's|access_log .*|access_log /tmp/nginx-test/logs/access.log main;|' \
+ -e 's|include /etc/nginx/conf\.d/\*\.conf|include /tmp/nginx-test/conf.d/*.conf|' \
+ apps/nginx-strangler/nginx.conf > /tmp/nginx-test/nginx.conf
+ nginx -t -c /tmp/nginx-test/nginx.conf
+ env:
+ LEGACY_UPSTREAM: "127.0.0.1:8080"
+ NESTJS_UPSTREAM: "127.0.0.1:3001"
diff --git a/.jjconflict-base-0/.github/workflows/job-npm.yml b/.jjconflict-base-0/.github/workflows/job-npm.yml
new file mode 100644
index 0000000000..51e4f3eedc
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-npm.yml
@@ -0,0 +1,247 @@
+name: Publish npm
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ NODE_VERSION:
+ required: true
+ type: string
+ PUBLISH_APPS:
+ required: true
+ type: boolean
+ PUBLISH_PACKAGES:
+ required: true
+ type: boolean
+ PUBLISH_PLUGINS:
+ required: true
+ type: boolean
+ CHECK_CHANGES:
+ required: true
+ type: boolean
+ workflow_dispatch:
+ inputs:
+ NODE_VERSION:
+ description: Nodejs version used
+ required: true
+ type: string
+ PUBLISH_APPS:
+ description: Publish apps modules
+ required: true
+ type: boolean
+ default: false
+ PUBLISH_PACKAGES:
+ description: Publish packages modules
+ required: true
+ type: boolean
+ default: false
+ PUBLISH_PLUGINS:
+ description: Publish plugins modules
+ required: true
+ type: boolean
+ default: true
+ CHECK_CHANGES:
+ required: true
+ type: boolean
+ default: true
+
+jobs:
+ path-filter:
+ if: ${{ inputs.CHECK_CHANGES }}
+ runs-on: ubuntu-latest
+ outputs:
+ packages: ${{ steps.filter.outputs.changes }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Check updated files paths
+ uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
+ id: filter
+ with:
+ filters: |
+ eslint-config:
+ - 'packages/eslintconfig/src/**'
+ shared:
+ - 'packages/shared/src/**'
+ hooks:
+ - 'packages/hooks/src/**'
+ ts-config:
+ - 'packages/tsconfig/**'
+ logger:
+ - 'packages/logger/**'
+ argocd:
+ - 'plugins/argocd/src/**'
+ gitlab:
+ - 'plugins/gitlab/src/**'
+ harbor:
+ - 'plugins/harbor/src/**'
+ keycloak:
+ - 'plugins/keycloak/src/**'
+ nexus:
+ - 'plugins/nexus/src/**'
+ sonarqube:
+ - 'plugins/sonarqube/src/**'
+ vault:
+ - 'plugins/vault/src/**'
+
+ check-update:
+ name: Check for package version update
+ if: ${{ fromJson(needs.path-filter.outputs.packages).include[0] }} # skip if the matrix is empty!
+ runs-on: ubuntu-latest
+ needs:
+ - path-filter
+ strategy:
+ matrix:
+ packages: ${{ fromJSON(needs.path-filter.outputs.packages) }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Check changes
+ id: check
+ run: |
+ PACKAGE_NAME=$(jq -cr --arg p "${{ matrix.packages }}" '[.packages[], .plugins[]][] | select(.name | test($p)?) | .name' < ./ci/matrix-npm.json)
+ PACKAGE_PATH=$(jq -cr --arg p "${{ matrix.packages }}" '[.packages[], .plugins[]][] | select(.name | test($p)?) | .path' < ./ci/matrix-npm.json)
+ PACKAGE_VERSION=$(jq -cr '.version' < ${PACKAGE_PATH}/package.json)
+ if [ "$(curl -s -o /dev/null -I -w %{http_code} https://registry.npmjs.org/${PACKAGE_NAME})" = 404 ]; then
+ REMOTE=false
+ else
+ REMOTE=$(pnpm view ${PACKAGE_NAME} --json | jq --arg v "$PACKAGE_VERSION" 'any(.versions[] == $v; .)')
+ fi
+ if [ "$REMOTE" = "true" ]; then
+ echo "WARNING=true" >> $GITHUB_OUTPUT
+ echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_OUTPUT
+ echo "PACKAGE_PATH=$PACKAGE_PATH" >> $GITHUB_OUTPUT
+ echo "PACKAGE_VERSION=$PACKAGE_VERSION" >> $GITHUB_OUTPUT
+ else
+ echo "WARNING=false" >> $GITHUB_OUTPUT
+ fi
+
+ matrix:
+ name: Generate publish matrix
+ needs:
+ - path-filter
+ if: ${{ needs.path-filter.outputs.packages != '' && (inputs.PUBLISH_APPS || inputs.PUBLISH_PACKAGES || inputs.PUBLISH_PLUGINS) }}
+ runs-on: ubuntu-latest
+ outputs:
+ publish-matrix: ${{ steps.packages-matrix.outputs.PUBLISH_MATRIX }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Generate matrix
+ id: packages-matrix
+ run: |
+ PUBLISH_MATRIX="[]"
+ APPS_MATRIX="$(jq -c '.apps' < ./ci/matrix-npm.json)"
+ PACKAGES_MATRIX="$(jq -c '.packages' < ./ci/matrix-npm.json)"
+ PLUGINS_MATRIX="$(jq -c '.plugins' < ./ci/matrix-npm.json)"
+ if [ "${{ inputs.PUBLISH_APPS }}" = "true" ]; then
+ PUBLISH_MATRIX="$(jq -n -c --argjson acc "$PUBLISH_MATRIX" --argjson cur "$APPS_MATRIX" '$acc + $cur')"
+ fi
+ if [ "${{ inputs.PUBLISH_PACKAGES }}" = "true" ]; then
+ PUBLISH_MATRIX="$(jq -n -c --argjson acc "$PUBLISH_MATRIX" --argjson cur "$PACKAGES_MATRIX" '$acc + $cur')"
+ fi
+ if [ "${{ inputs.PUBLISH_PLUGINS }}" = "true" ]; then
+ PUBLISH_MATRIX="$(jq -n -c --argjson acc "$PUBLISH_MATRIX" --argjson cur "$PLUGINS_MATRIX" '$acc + $cur')"
+ fi
+ echo "PUBLISH_MATRIX=$PUBLISH_MATRIX" >> $GITHUB_OUTPUT
+
+ publish-npm:
+ name: Publish on npm
+ if: ${{ needs.path-filter.outputs.packages != '' && (inputs.PUBLISH_APPS || inputs.PUBLISH_PACKAGES || inputs.PUBLISH_PLUGINS) }}
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ id-token: write
+ needs:
+ - path-filter
+ - matrix
+ strategy:
+ # Allow jobs to be processed independently of their siblings status
+ fail-fast: false
+ matrix:
+ modules: ${{ fromJSON(needs.matrix.outputs.publish-matrix) }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ github.event.ref }}
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Check for new package version
+ id: check-version
+ run: |
+ PACKAGE_VERSION=$(jq -cr '.version' < ${{ matrix.modules.path }}/package.json)
+ if [ "$(curl -s -o /dev/null -I -w %{http_code} https://registry.npmjs.org/${{ matrix.modules.name }})" = 404 ]; then
+ REMOTE=false
+ else
+ REMOTE=$(pnpm view ${{ matrix.modules.name }} --json | jq --arg v "$PACKAGE_VERSION" 'any(.versions[] == $v; .)')
+ fi
+ if [ "$REMOTE" = "true" ]; then
+ echo "Package ${{ matrix.modules.name }} - version $PACKAGE_VERSION already exists"
+ else
+ echo "Package ${{ matrix.modules.name }} - version $PACKAGE_VERSION does not exist"
+ fi
+ echo "REMOTE=$REMOTE" >> $GITHUB_OUTPUT
+
+ - name: Setup Node.js
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ with:
+ node-version: "${{ inputs.NODE_VERSION }}"
+ registry-url: "https://registry.npmjs.org"
+
+ - name: Get pnpm store directory
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ id: pnpm-store
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache node files
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: |
+ ${{ steps.pnpm-store.outputs.STORE_PATH }}
+ key: node-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ node-${{ runner.os }}-${{ runner.arch }}-
+
+ - name: Install base dependencies
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ run: pnpm install --frozen-lockfile
+
+ - name: Build internal dependencies
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ run: |
+ pnpm --filter "./packages/**" run build && pnpm --filter "./plugins/**" run build
+
+ - name: Update PNPM internal links with built internal dependencies
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ run: |
+ pnpm install --frozen-lockfile
+
+ - name: Build package
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ run: |
+ pnpm --filter ${{ matrix.modules.name }} run build
+
+ - name: Publish package
+ if: ${{ steps.check-version.outputs.REMOTE == 'false' }}
+ run: |
+ pnpm --filter ${{ matrix.modules.name }} publish --provenance --no-git-checks --report-summary
diff --git a/.jjconflict-base-0/.github/workflows/job-playwright.yml b/.jjconflict-base-0/.github/workflows/job-playwright.yml
new file mode 100644
index 0000000000..ec0a3fe695
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-playwright.yml
@@ -0,0 +1,114 @@
+name: Playwright Tests
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ NODE_VERSION:
+ required: true
+ type: string
+ TAG:
+ required: true
+ type: string
+ workflow_dispatch:
+ inputs:
+ NODE_VERSION:
+ description: Nodejs version used to run tests
+ required: true
+ type: string
+ TAG:
+ description: Container images version to use for console client and server/server-nestjs
+ required: true
+ type: string
+ default: latest
+jobs:
+ test:
+ timeout-minutes: 60
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Setup Node.js
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
+ with:
+ node-version: "${{ inputs.NODE_VERSION }}"
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache Node.js files
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: ${{ steps.pnpm-store.outputs.STORE_PATH }}
+ key: node-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ node-${{ runner.os }}-${{ runner.arch }}-
+
+ - name: Install Node.js dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build internal dependencies
+ run: pnpm --filter "./packages/**" build
+
+ - name: Get used Playwright version
+ id: playwright-version
+ run: echo "PLAYWRIGHT_VERSION=$(pnpm --dir playwright exec playwright -V | awk '{ print $2 }')" >> $GITHUB_ENV
+
+ - name: Restore cache - Playwright browser binaries
+ uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ id: playwright-cache
+ with:
+ path: |
+ ~/.cache/ms-playwright
+ key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
+
+ - name: Install Playwright system dependencies
+ run: pnpm --dir playwright exec playwright install --with-deps
+
+ - name: Save cache - Playwright browser binaries
+ if: always() && steps.playwright-cache.outputs.cache-hit != 'true'
+ uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: |
+ ~/.cache/ms-playwright
+ key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
+
+ - name: Initialize application environment for tests
+ run: |
+ ./ci/scripts/init-env.sh
+ docker pull ghcr.io/cloud-pi-native/console/server:${{ inputs.TAG }}
+ docker tag ghcr.io/cloud-pi-native/console/server:${{ inputs.TAG }} dso-console/server:ci
+ docker pull ghcr.io/cloud-pi-native/console/nginx-strangler:${{ inputs.TAG }}
+ docker tag ghcr.io/cloud-pi-native/console/nginx-strangler:${{ inputs.TAG }} dso-console/nginx-strangler:ci
+ docker pull ghcr.io/cloud-pi-native/console/server-nestjs:${{ inputs.TAG }}
+ docker tag ghcr.io/cloud-pi-native/console/server-nestjs:${{ inputs.TAG }} dso-console/server-nestjs:ci
+ docker pull ghcr.io/cloud-pi-native/console/client:${{ inputs.TAG }}
+ docker tag ghcr.io/cloud-pi-native/console/client:${{ inputs.TAG }} dso-console/client:ci
+ docker pull ghcr.io/cloud-pi-native/console/opencds-mockoon:${{ inputs.TAG }}
+ docker tag ghcr.io/cloud-pi-native/console/opencds-mockoon:${{ inputs.TAG }} dso-console/opencds-mockoon:ci
+ docker compose -f ./docker/docker-compose.ci.yml up --no-build -d --remove-orphans
+
+ - name: Run Playwright tests
+ run: pnpm --dir playwright exec playwright test --grep @e2e
+
+ - name: Clean up docker resources (containers, volumes)
+ run: docker compose -f ./docker/docker-compose.ci.yml down -v --remove-orphans
+
+ - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
+ if: ${{ !cancelled() }}
+ with:
+ name: playwright-report
+ path: playwright/playwright-report/
+ retention-days: 30
diff --git a/.jjconflict-base-0/.github/workflows/job-release-please.yml b/.jjconflict-base-0/.github/workflows/job-release-please.yml
new file mode 100644
index 0000000000..b4789c2cbb
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-release-please.yml
@@ -0,0 +1,84 @@
+name: Release
+
+permissions:
+ contents: write
+ pull-requests: write
+
+on:
+ workflow_call:
+ outputs:
+ release-created:
+ description: Has the releease been created
+ value: ${{ jobs.release.outputs.release-created }}
+ major-tag:
+ description: Major version tag
+ value: ${{ jobs.release.outputs.major-tag }}
+ minor-tag:
+ description: Minor version tag
+ value: ${{ jobs.release.outputs.minor-tag }}
+ patch-tag:
+ description: Patch version tag
+ value: ${{ jobs.release.outputs.patch-tag }}
+
+jobs:
+ release:
+ name: Create new release
+ runs-on: ubuntu-latest
+ outputs:
+ release-created: ${{ steps.release.outputs.release_created }}
+ major-tag: ${{ steps.release.outputs.major }}
+ minor-tag: ${{ steps.release.outputs.minor }}
+ patch-tag: ${{ steps.release.outputs.patch }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Update release-please config for hotfix branches
+ if: startsWith(github.ref_name, 'hotfix/')
+ run: |
+ # Update versioning to always-bump-patch for hotfix branches
+ jq '.versioning = "always-bump-patch"' release-please-config.json > tmp.json && mv tmp.json release-please-config.json
+ echo "Updated release-please-config.json versioning to always-bump-patch"
+ shell: bash
+
+ - name: Create merge request for new release
+ uses: googleapis/release-please-action@16a9c90856f42705d54a6fda1823352bdc62cf38 # v4.4.0
+ id: release
+ with:
+ config-file: release-please-config.json
+ target-branch: ${{ github.ref_name }}
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Edit packages versions
+ if: ${{ ! steps.release.outputs.release_created && steps.release.outputs.pr }}
+ run: |
+ export BRANCH=release-please--branches--main--components--console
+ git fetch
+ git checkout "$BRANCH"
+ VERSION=$(jq -r .version package.json)
+ for pkg in $(jq -r '.apps | map(.path + "/package.json") | .[]' < ./ci/matrix-npm.json); do
+ yq e -i ".version |= \"$VERSION\"" $pkg
+ yq e -i ".publishConfig.tag |= \"latest\"" $pkg
+ done
+ git add .
+ # Emulate the author of the existing commit (the bot).
+ git config user.email "$(git log -n 1 --format='%ae')"
+ git config user.name "$(git log -n 1 --format='%an')"
+ # Update the PR.
+ git commit --amend --no-edit
+ git push -f
+
+ - name: Tag major and minor versions
+ if: ${{ steps.release.outputs.release_created }}
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+ git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git"
+ git tag -d v${{ steps.release.outputs.major }} || true
+ git tag -d v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true
+ git push origin :v${{ steps.release.outputs.major }} || true
+ git push origin :v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true
+ git tag -a v${{ steps.release.outputs.major }} -m "Release v${{ steps.release.outputs.major }}"
+ git tag -a v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} -m "Release v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}"
+ git push origin v${{ steps.release.outputs.major }}
+ git push origin v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}
diff --git a/.jjconflict-base-0/.github/workflows/job-scan.yml b/.jjconflict-base-0/.github/workflows/job-scan.yml
new file mode 100644
index 0000000000..3efab69fc5
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-scan.yml
@@ -0,0 +1,148 @@
+name: Vulnerability scan
+
+permissions:
+ contents: read
+ pull-requests: write
+
+on:
+ workflow_call:
+ inputs:
+ REGISTRY:
+ required: true
+ type: string
+ NAMESPACE:
+ required: true
+ type: string
+ TAG:
+ required: true
+ type: string
+ workflow_dispatch:
+ inputs:
+ REGISTRY:
+ description: Target registry to push images
+ required: true
+ type: string
+ default: ghcr.io
+ NAMESPACE:
+ description: Target namespace to the given registry
+ required: true
+ type: string
+ default: cloud-pi-native/console
+ TAG:
+ description: Tag used to scan images
+ required: true
+ type: string
+ default: latest
+
+jobs:
+ matrix:
+ name: Generate matrix
+ runs-on: ubuntu-latest
+ outputs:
+ build-matrix: ${{ steps.build-matrix.outputs.BUILD_MATRIX }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Generate matrix
+ id: build-matrix
+ run: |
+ echo "BUILD_MATRIX=$(jq -c . < ./ci/matrix-docker.json)" >> $GITHUB_OUTPUT
+
+ images-scan:
+ name: Scan images vulnerabilities
+ runs-on: ubuntu-latest
+ needs:
+ - matrix
+ strategy:
+ matrix:
+ images: ${{ fromJSON(needs.matrix.outputs.build-matrix) }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Run Trivy vulnerability scanner on images
+ uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0
+ with:
+ image-ref: "${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }}:${{ inputs.TAG }}"
+ format: template
+ template: "@/contrib/sarif.tpl"
+ vuln-type: "os,library"
+ ignore-unfixed: true
+ output: trivy-results.sarif
+ github-pat: ${{ secrets.GITHUB_TOKEN }}
+ cache: "false"
+ continue-on-error: true
+
+ - name: Upload Trivy scan results to GitHub Security tab
+ uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
+ with:
+ sarif_file: trivy-results.sarif
+ continue-on-error: true
+
+ - name: Warn about error
+ if: failure()
+ run: |
+ echo ":warning: The Trivy scan report for image `${{ inputs.REGISTRY }}/${{ inputs.NAMESPACE }}/${{ matrix.images.name }}:${{ inputs.TAG }}` was not successfully completed and could not be uploaded to the Github Security Panel." >> $GITHUB_STEP_SUMMARY
+
+ config-scan:
+ name: Scan config files vulnerabilities
+ runs-on: ubuntu-latest
+ needs:
+ - matrix
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Run Trivy vulnerability scanner on config files
+ uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0
+ with:
+ scan-ref: .
+ scan-type: config
+ format: template
+ template: "@/contrib/sarif.tpl"
+ skip-dirs: "**/node_modules,ci"
+ ignore-unfixed: true
+ output: trivy-results.sarif
+ github-pat: ${{ secrets.GITHUB_TOKEN }}
+ cache: "false"
+ continue-on-error: true
+
+ - name: Upload Trivy scan results to GitHub Security tab
+ uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
+ with:
+ sarif_file: trivy-results.sarif
+ continue-on-error: true
+
+ - name: Warn about error
+ if: failure()
+ run: |
+ echo ":warning: The Trivy scan report for configuration was not successfully completed and could not be uploaded to the Github Security Panel." >> $GITHUB_STEP_SUMMARY
+
+ scan-notif:
+ name: Notify users
+ runs-on: ubuntu-latest
+ needs:
+ - matrix
+ - images-scan
+ - config-scan
+ if: ${{ github.event_name == 'pull_request' }}
+ env:
+ MERGE_REQUEST_ID: ${{ github.event.pull_request.number }}
+ COMMENT: |
+ 🤖 Hey !
+
+ The security scan report for the current pull request is available [here](https://github.com/${{ github.repository }}/security/code-scanning?query=is%3Aopen+branch%3Amain+pr%3A${{ github.event.pull_request.number || github.event.number }}).
+ steps:
+ - name: Add comment on Merge Request
+ id: add-comment-on-merge-request
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: process.env.MERGE_REQUEST_ID,
+ body: process.env.COMMENT,
+ });
diff --git a/.jjconflict-base-0/.github/workflows/job-tests-unit.yml b/.jjconflict-base-0/.github/workflows/job-tests-unit.yml
new file mode 100644
index 0000000000..993ff302cf
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/job-tests-unit.yml
@@ -0,0 +1,177 @@
+name: Tests - unit
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ NODE_VERSION:
+ required: true
+ type: string
+ secrets:
+ SONAR_HOST_URL:
+ required: false
+ SONAR_TOKEN:
+ required: false
+ SONAR_PROJECT_KEY:
+ required: false
+ workflow_dispatch:
+ inputs:
+ NODE_VERSION:
+ description: Nodejs version used to run tests
+ required: true
+ type: string
+
+jobs:
+ unit-tests:
+ name: Unit tests
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
+ with:
+ node-version: "${{ inputs.NODE_VERSION }}"
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache node files
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: |
+ ${{ steps.pnpm-store.outputs.STORE_PATH }}
+ key: node-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ node-${{ runner.os }}-${{ runner.arch }}-
+
+ - name: Install dependencies
+ run: pnpm -r install --frozen-lockfile
+
+ - name: Build internal dependencies (packages)
+ run: pnpm --filter "./packages/**" build
+
+ - name: Build internal plugins
+ run: pnpm --filter "./plugins/**" build
+
+ - name: Run unit tests
+ run: |
+ ./ci/scripts/init-env.sh
+ ./ci/scripts/run-tests.sh -u
+
+ - name: Upload vitest coverage artifacts
+ uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
+ with:
+ name: unit-tests-coverage
+ path: |
+ ./apps/**/coverage/lcov.info
+ ./packages/**/coverage/lcov.info
+ retention-days: 1
+
+ check-secrets:
+ name: Check if Sonar secrets are set
+ runs-on: ubuntu-latest
+ needs:
+ - unit-tests
+ outputs:
+ run-scan: ${{ steps.check-secrets.outputs.run-scan }}
+ steps:
+ - name: Check for sonar secrets
+ id: check-secrets
+ run: |
+ if [ "${{ secrets.SONAR_HOST_URL }}" != "" ] && [ "${{ secrets.SONAR_TOKEN }}" != "" ] && [ "${{ secrets.SONAR_PROJECT_KEY }}" != "" ]; then
+ echo "run-scan=true" >> $GITHUB_OUTPUT
+ else
+ echo "run-scan=false" >> $GITHUB_OUTPUT
+ fi
+
+ code-scan:
+ name: Run code quality analysis
+ runs-on: ubuntu-latest
+ needs:
+ - unit-tests
+ - check-secrets
+ if: ${{ needs.check-secrets.outputs.run-scan == 'true' }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ fetch-depth: 0
+
+ - name: Download artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: unit-tests-coverage
+ path: ./coverage
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
+ id: pnpm-install
+ with:
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
+ with:
+ node-version: "${{ inputs.NODE_VERSION }}"
+
+ - name: Get pnpm store directory
+ id: pnpm-store
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache node files
+ uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ with:
+ path: |
+ ${{ steps.pnpm-store.outputs.STORE_PATH }}
+ key: node-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ node-${{ runner.os }}-${{ runner.arch }}-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Set sonarqube args
+ id: sonar-args
+ run: |
+ echo "SONAR_ARGS_PR=-Dsonar.pullrequest.provider=github -Dsonar.pullrequest.key=${{ github.event.number }} -Dsonar.pullrequest.branch=${{ github.head_ref }} -Dsonar.pullrequest.base=${{ github.base_ref }} -Dsonar.pullrequest.github.repository=${{ github.repository }}" >> $GITHUB_OUTPUT
+ echo "SONAR_ARGS_BRANCH=-Dsonar.branch.name=${{ github.ref_name }}" >> $GITHUB_OUTPUT
+
+ - name: SonarQube Scan
+ uses: sonarsource/sonarqube-scan-action@299e4b793aaa83bf2aba7c9c14bedbb485688ec4 # v7.1.0
+ env:
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ args: >
+ -Dsonar.projectKey=${{ secrets.SONAR_PROJECT_KEY }}
+ -Dsonar.sources=apps,packages
+ -Dsonar.javascript.node.maxspace=4096
+ -Dsonar.javascript.lcov.reportPaths=coverage/apps/server/coverage/lcov.info,coverage/apps/client/coverage/lcov.info,coverage/packages/shared/coverage/lcov.info
+ -Dsonar.coverage.exclusions=**/*.spec.js,**/*.spec.ts,**/*.vue,**/assets/**,**/packages/test-utils/**,apps/server/src/plugins/**
+ -Dsonar.cpd.exclusions=**/*.spec.js,**/*.spec.ts
+ -Dsonar.scm.provider=git
+ ${{ github.event_name == 'pull_request' && steps.sonar-args.outputs.SONAR_ARGS_PR || steps.sonar-args.outputs.SONAR_ARGS_BRANCH }}
+ continue-on-error: true
+
+ - name: SonarQube Quality Gate check
+ id: sonarqube-quality-gate-check
+ uses: sonarsource/sonarqube-quality-gate-action@cf038b0e0cdecfa9e56c198bbb7d21d751d62c3b # v1.2.0
+ env:
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
+ timeout-minutes: 5
+ continue-on-error: true
diff --git a/.jjconflict-base-0/.github/workflows/workflow-clean-cache.yml b/.jjconflict-base-0/.github/workflows/workflow-clean-cache.yml
new file mode 100644
index 0000000000..d1e5b60e95
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-clean-cache.yml
@@ -0,0 +1,94 @@
+name: Clean cache
+
+permissions:
+ contents: read
+ # For cache cleaning
+ actions: write
+ # For artifacts deletion
+ packages: write
+
+on:
+ pull_request:
+ types:
+ - closed
+ workflow_dispatch:
+ inputs:
+ PR_NUMBER:
+ description: Related pull request Id
+ required: false
+ type: number
+ BRANCH_NAME:
+ description: Related branch name
+ required: false
+ type: string
+
+jobs:
+ cleanup-cache:
+ name: Delete github cache
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Clean cache for closed branch
+ run: |
+ REPO=${{ github.repository }}
+ if [ -n "${{ inputs.BRANCH_NAME }}" ]; then
+ BRANCH="${{ inputs.BRANCH_NAME }}"
+ else
+ BRANCH="refs/pull/${{ github.event.pull_request.number || inputs.PR_NUMBER }}/merge"
+ fi
+
+ echo "Fetching list of cache key"
+ cacheKeysForPR=$(gh cache list -R $REPO --ref $BRANCH -L 100 | cut -f 1 )
+
+ ## Setting this to not fail the workflow while deleting cache keys.
+ set +e
+ echo "Deleting caches..."
+ for cacheKey in $cacheKeysForPR; do
+ gh cache delete $cacheKey -R $REPO
+ done
+ echo "Done"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ matrix:
+ name: Generate matrix
+ runs-on: ubuntu-latest
+ outputs:
+ build-matrix: ${{ steps.build-matrix.outputs.BUILD_MATRIX }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Generate matrix
+ id: build-matrix
+ run: |
+ echo "BUILD_MATRIX=$(jq -c . < ./ci/matrix-docker.json)" >> $GITHUB_OUTPUT
+
+ cleanup-image:
+ name: Delete image from ghcr.io
+ runs-on: ubuntu-latest
+ needs:
+ - matrix
+ strategy:
+ fail-fast: false
+ matrix:
+ images: ${{ fromJSON(needs.matrix.outputs.build-matrix) }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Get repository owner and name
+ id: image-infos
+ run: |
+ echo "ORG_NAME=$(echo '${{ github.repository }}' | cut -d "/" -f 1)" >> $GITHUB_OUTPUT
+ echo "REPO_NAME=$(echo '${{ github.repository }}' | cut -d "/" -f 2)" >> $GITHUB_OUTPUT
+
+ - name: Delete ${{ matrix.images.name }} image
+ run: |
+ ./ci/scripts/delete-image.sh \
+ -o "${{ steps.image-infos.outputs.ORG_NAME }}" \
+ -i "${{ steps.image-infos.outputs.REPO_NAME }}/${{ matrix.images.name }}" \
+ -t "pr-${{ github.event.pull_request.number || github.event.number }}" \
+ -g "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.jjconflict-base-0/.github/workflows/workflow-continuous-integration.yml b/.jjconflict-base-0/.github/workflows/workflow-continuous-integration.yml
new file mode 100644
index 0000000000..1553fddc93
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-continuous-integration.yml
@@ -0,0 +1,150 @@
+name: Continuous Integration
+
+permissions:
+ contents: read
+ # Needed for build job
+ packages: write
+ # Needed for build-label and scan-vuln jobs
+ pull-requests: write
+
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+ - synchronize
+ - ready_for_review
+ branches:
+ - "**"
+ workflow_dispatch:
+
+env:
+ NODE_VERSION: 24.13.1
+ REGISTRY: ghcr.io
+ NAMESPACE: "${{ github.repository }}"
+ BUILD_AMD64: true
+ BUILD_ARM64: false
+ USE_QEMU: false
+
+jobs:
+ path-filter:
+ runs-on: ubuntu-latest
+ outputs:
+ apps: ${{ steps.filter.outputs.apps }}
+ packages: ${{ steps.filter.outputs.packages }}
+ e2e: ${{ steps.filter.outputs.e2e }}
+ ci: ${{ steps.filter.outputs.ci }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Check updated files paths
+ uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
+ id: filter
+ with:
+ filters: |
+ apps:
+ - 'apps/**'
+ packages:
+ - 'packages/**'
+ - 'plugins/**'
+ ci:
+ - '.github/workflows/**'
+ e2e:
+ - 'playwright/**'
+
+ expose-vars:
+ runs-on: ubuntu-latest
+ outputs:
+ NODE_VERSION: ${{ env.NODE_VERSION }}
+ REGISTRY: ${{ env.REGISTRY }}
+ NAMESPACE: ${{ env.NAMESPACE }}
+ BUILD_AMD64: ${{ env.BUILD_AMD64 }}
+ BUILD_ARM64: ${{ env.BUILD_ARM64 }}
+ USE_QEMU: ${{ env.USE_QEMU }}
+ steps:
+ - name: Exposing env vars
+ run: echo "Exposing env vars."
+
+ lint:
+ uses: ./.github/workflows/job-lint.yml
+ needs:
+ - expose-vars
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+
+ unit-tests:
+ uses: ./.github/workflows/job-tests-unit.yml
+ if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' }}
+ needs:
+ - path-filter
+ - expose-vars
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+ secrets:
+ SONAR_HOST_URL: "${{ secrets.SONAR_HOST_URL }}"
+ SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}"
+ SONAR_PROJECT_KEY: "${{ secrets.SONAR_PROJECT_KEY }}"
+
+ build:
+ uses: ./.github/workflows/job-build.yml
+ if: ${{ github.event.pull_request.number && (needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true') }}
+ needs:
+ - path-filter
+ - expose-vars
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: pr-${{ github.event.pull_request.number || github.event.number }}
+ BUILD_AMD64: ${{ needs.expose-vars.outputs.BUILD_AMD64 == 'true' }}
+ BUILD_ARM64: ${{ needs.expose-vars.outputs.BUILD_ARM64 == 'true' }}
+ USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}
+ PR_NUMBER: ${{ github.event.pull_request.number || github.event.number }}
+ secrets:
+ ARGOCD_TOKEN: ${{ secrets.ARGOCD_TOKEN }}
+
+ build-label:
+ uses: ./.github/workflows/job-label.yml
+ needs:
+ - expose-vars
+ - build
+ with:
+ CONF_PATH: ./.github/labeler/build.yml
+
+ scan-vuln:
+ uses: ./.github/workflows/job-scan.yml
+ needs:
+ - expose-vars
+ - build
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: pr-${{ github.event.pull_request.number || github.event.number }}
+
+ # Workaround for required status check in protection branches (see. https://github.com/orgs/community/discussions/13690)
+ all-jobs-passed:
+ name: Check jobs status
+ runs-on: ubuntu-latest
+ if: ${{ always() }}
+ needs:
+ - path-filter
+ - expose-vars
+ - lint
+ - unit-tests
+ - build
+ - scan-vuln
+ steps:
+ - name: Check status of all required jobs
+ run: |-
+ NEEDS_CONTEXT='${{ toJson(needs) }}'
+ JOB_IDS=$(echo "$NEEDS_CONTEXT" | jq -r 'keys[]')
+ for JOB_ID in $JOB_IDS; do
+ RESULT=$(echo "$NEEDS_CONTEXT" | jq -r ".[\"$JOB_ID\"].result")
+ echo "$JOB_ID job result: $RESULT"
+ if [[ $RESULT != "success" && $RESULT != "skipped" ]]; then
+ echo "***"
+ echo "Error: The $JOB_ID job did not pass."
+ exit 1
+ fi
+ done
+ echo "All jobs passed or were skipped."
diff --git a/.jjconflict-base-0/.github/workflows/workflow-create-or-update-release.yml b/.jjconflict-base-0/.github/workflows/workflow-create-or-update-release.yml
new file mode 100644
index 0000000000..70d77d68c7
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-create-or-update-release.yml
@@ -0,0 +1,93 @@
+name: Create/update next release
+
+permissions:
+ contents: write
+ pull-requests: write
+ # Needed for build job
+ packages: write
+
+on:
+ push:
+ branches:
+ - main
+ - hotfix/*
+
+env:
+ REGISTRY: ghcr.io
+ NAMESPACE: "${{ github.repository }}"
+ BUILD_AMD64: true
+ BUILD_ARM64: true
+ USE_QEMU: false
+ NODE_VERSION: 24.13.1
+
+jobs:
+ expose-vars:
+ runs-on: ubuntu-latest
+ outputs:
+ REGISTRY: ${{ env.REGISTRY }}
+ NAMESPACE: ${{ env.NAMESPACE }}
+ BUILD_AMD64: ${{ env.BUILD_AMD64 }}
+ BUILD_ARM64: ${{ env.BUILD_ARM64 }}
+ USE_QEMU: ${{ env.USE_QEMU }}
+ NODE_VERSION: ${{ env.NODE_VERSION }}
+ steps:
+ - name: Exposing env vars
+ run: echo "Exposing env vars"
+
+ release:
+ uses: ./.github/workflows/job-release-please.yml
+
+ build-amd64:
+ uses: ./.github/workflows/job-build.yml
+ if: ${{ needs.release.outputs.release-created == 'true' }}
+ needs:
+ - expose-vars
+ - release
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: ${{ needs.release.outputs.major-tag }}.${{ needs.release.outputs.minor-tag }}.${{ needs.release.outputs.patch-tag }}
+ MAJOR_TAG: ${{ needs.release.outputs.major-tag }}
+ MINOR_TAG: ${{ needs.release.outputs.minor-tag }}
+ PATCH_TAG: ${{ needs.release.outputs.patch-tag }}
+ BUILD_AMD64: ${{ needs.expose-vars.outputs.BUILD_AMD64 == 'true' }}
+ BUILD_ARM64: false
+ USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}
+
+ build-arm64:
+ uses: ./.github/workflows/job-build.yml
+ if: ${{ needs.release.outputs.release-created == 'true' }}
+ needs:
+ - expose-vars
+ - release
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: ${{ needs.release.outputs.major-tag }}.${{ needs.release.outputs.minor-tag }}.${{ needs.release.outputs.patch-tag }}
+ MAJOR_TAG: ${{ needs.release.outputs.major-tag }}
+ MINOR_TAG: ${{ needs.release.outputs.minor-tag }}
+ PATCH_TAG: ${{ needs.release.outputs.patch-tag }}
+ BUILD_AMD64: false
+ BUILD_ARM64: ${{ needs.expose-vars.outputs.BUILD_ARM64 == 'true' }}
+ USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}
+
+ update-chart:
+ runs-on: ubuntu-latest
+ needs:
+ - expose-vars
+ - release
+ - build-amd64
+ steps:
+ - name: Generate a token
+ id: generate-token
+ uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
+ with:
+ app-id: ${{ secrets.GH_APP_ID }}
+ private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
+ owner: ${{ github.repository_owner }}
+ repositories: helm-charts
+ - name: Trigger helm-charts update
+ env:
+ GH_TOKEN: ${{ steps.generate-token.outputs.token }}
+ run: |
+ gh workflow --repo cloud-pi-native/helm-charts run update-chart.yaml -f APP_VERSION=${{ needs.release.outputs.major-tag }}.${{ needs.release.outputs.minor-tag }}.${{ needs.release.outputs.patch-tag }} -f CHART_NAME=dso-console
diff --git a/.jjconflict-base-0/.github/workflows/workflow-create-preview-comment.yml b/.jjconflict-base-0/.github/workflows/workflow-create-preview-comment.yml
new file mode 100644
index 0000000000..e91b3731b1
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-create-preview-comment.yml
@@ -0,0 +1,43 @@
+name: Add preview comment
+
+permissions:
+ pull-requests: write
+
+on:
+ pull_request:
+ types:
+ - labeled
+ branches:
+ - "**"
+
+jobs:
+ preview-comment:
+ name: Add comment with preview infos
+ if: contains(github.event.pull_request.labels.*.name, 'preview')
+ runs-on: ubuntu-latest
+ steps:
+ - name: Generate app url
+ id: generate-url
+ run: |
+ echo "CONSOLE_URL=$(echo "${{ vars.ARGOCD_CONSOLE_URL_TEMPLATE }}" | sed 's||${{ github.event.number }}|g')" >> $GITHUB_OUTPUT
+
+ - name: Add comment on Merge Request
+ id: add-comment-on-merge-request
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
+ env:
+ MERGE_REQUEST_ID: ${{ github.event.pull_request.number }}
+ COMMENT: |
+ 🤖 Hey !
+
+ A preview of the application is available at : ${{ steps.generate-url.outputs.CONSOLE_URL }}
+
+ *Please be patient, deployment may take a few minutes.*
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: process.env.MERGE_REQUEST_ID,
+ body: process.env.COMMENT,
+ });
diff --git a/.jjconflict-base-0/.github/workflows/workflow-merge-queue.yml b/.jjconflict-base-0/.github/workflows/workflow-merge-queue.yml
new file mode 100644
index 0000000000..cca23047d1
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-merge-queue.yml
@@ -0,0 +1,166 @@
+name: Merge Queue
+
+permissions:
+ contents: read
+ # Needed for build job
+ packages: write
+ # Needed for build-label job
+ pull-requests: write
+
+on:
+ workflow_dispatch:
+ inputs:
+ PR_NUMBER:
+ description: Pull request number to run checks for
+ required: true
+ type: string
+ merge_group:
+ types: [checks_requested]
+
+env:
+ NODE_VERSION: 24.13.1
+ REGISTRY: ghcr.io
+ NAMESPACE: "${{ github.repository }}"
+ BUILD_AMD64: true
+ BUILD_ARM64: false
+ USE_QEMU: false
+ MERGE_GROUP_HEAD_SHA: "${{ github.event.merge_group.head_sha || github.sha }}"
+ MERGE_GROUP_HEAD_REF: "${{ github.event.merge_group.head_ref || github.ref_name }}"
+
+jobs:
+ path-filter:
+ runs-on: ubuntu-latest
+ outputs:
+ apps: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.apps }}
+ packages: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.packages }}
+ e2e: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.e2e }}
+ ci: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.ci }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Check updated files paths
+ if: ${{ github.event_name != 'workflow_dispatch' }}
+ uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
+ id: filter
+ with:
+ filters: |
+ apps:
+ - 'apps/**'
+ packages:
+ - 'packages/**'
+ - 'plugins/**'
+ ci:
+ - '.github/workflows/**'
+ e2e:
+ - 'playwright/**'
+
+ expose-vars:
+ runs-on: ubuntu-latest
+ outputs:
+ NODE_VERSION: ${{ env.NODE_VERSION }}
+ REGISTRY: ${{ env.REGISTRY }}
+ NAMESPACE: ${{ env.NAMESPACE }}
+ BUILD_AMD64: ${{ env.BUILD_AMD64 }}
+ BUILD_ARM64: ${{ env.BUILD_ARM64 }}
+ USE_QEMU: ${{ env.USE_QEMU }}
+ MERGE_GROUP_HEAD_REF: ${{ env.MERGE_GROUP_HEAD_REF }}
+ MERGE_GROUP_HEAD_SHA: ${{ env.MERGE_GROUP_HEAD_SHA }}
+ steps:
+ - name: Exposing env vars
+ run: echo "Exposing env vars."
+
+ lint:
+ uses: ./.github/workflows/job-lint.yml
+ needs:
+ - expose-vars
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+
+ unit-tests:
+ uses: ./.github/workflows/job-tests-unit.yml
+ if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true' }}
+ needs:
+ - path-filter
+ - expose-vars
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+ secrets:
+ SONAR_HOST_URL: "${{ secrets.SONAR_HOST_URL }}"
+ SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}"
+ SONAR_PROJECT_KEY: "${{ secrets.SONAR_PROJECT_KEY }}"
+
+ build:
+ uses: ./.github/workflows/job-build.yml
+ if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true' }}
+ needs:
+ - path-filter
+ - expose-vars
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: pr-${{ github.event.inputs.PR_NUMBER || github.event.number || needs.expose-vars.outputs.MERGE_GROUP_HEAD_SHA }}
+ BUILD_AMD64: ${{ needs.expose-vars.outputs.BUILD_AMD64 == 'true' }}
+ BUILD_ARM64: ${{ needs.expose-vars.outputs.BUILD_ARM64 == 'true' }}
+ USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}
+ PR_NUMBER: ${{ github.event.inputs.PR_NUMBER || github.event.number || '' }}
+ secrets:
+ ARGOCD_TOKEN: ${{ secrets.ARGOCD_TOKEN }}
+
+ build-label:
+ uses: ./.github/workflows/job-label.yml
+ needs:
+ - expose-vars
+ - build
+ with:
+ CONF_PATH: ./.github/labeler/build.yml
+
+ playwright-tests:
+ uses: ./.github/workflows/job-playwright.yml
+ if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true' }}
+ needs:
+ - path-filter
+ - expose-vars
+ - build
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+ TAG: pr-${{ github.event.inputs.PR_NUMBER || github.event.number || needs.expose-vars.outputs.MERGE_GROUP_HEAD_SHA }}
+
+ scan-vuln:
+ uses: ./.github/workflows/job-scan.yml
+ needs:
+ - expose-vars
+ - build
+ with:
+ REGISTRY: ${{ needs.expose-vars.outputs.REGISTRY }}
+ NAMESPACE: ${{ needs.expose-vars.outputs.NAMESPACE }}
+ TAG: pr-${{ github.event.inputs.PR_NUMBER || github.event.number || needs.expose-vars.outputs.MERGE_GROUP_HEAD_SHA }}
+
+ # Workaround for required status check in protection branches (see. https://github.com/orgs/community/discussions/13690)
+ all-jobs-passed:
+ name: Check jobs status
+ runs-on: ubuntu-latest
+ if: ${{ always() }}
+ needs:
+ - path-filter
+ - expose-vars
+ - lint
+ - unit-tests
+ - build
+ - playwright-tests
+ - scan-vuln
+ steps:
+ - name: Check status of all required jobs
+ run: |-
+ NEEDS_CONTEXT='${{ toJson(needs) }}'
+ JOB_IDS=$(echo "$NEEDS_CONTEXT" | jq -r 'keys[]')
+ for JOB_ID in $JOB_IDS; do
+ RESULT=$(echo "$NEEDS_CONTEXT" | jq -r ".[\"$JOB_ID\"].result")
+ echo "$JOB_ID job result: $RESULT"
+ if [[ $RESULT != "success" && $RESULT != "skipped" ]]; then
+ echo "***"
+ echo "Error: The $JOB_ID job did not pass."
+ exit 1
+ fi
+ done
+ echo "All jobs passed or were skipped."
diff --git a/.jjconflict-base-0/.github/workflows/workflow-post-merge.yml b/.jjconflict-base-0/.github/workflows/workflow-post-merge.yml
new file mode 100644
index 0000000000..da61baa341
--- /dev/null
+++ b/.jjconflict-base-0/.github/workflows/workflow-post-merge.yml
@@ -0,0 +1,56 @@
+name: Post-merge
+
+on:
+ push:
+ branches:
+ - main
+
+env:
+ NODE_VERSION: 24.13.1
+
+permissions:
+ contents: read
+ id-token: write
+
+jobs:
+ path-filter:
+ runs-on: ubuntu-latest
+ outputs:
+ apps: ${{ steps.filter.outputs.apps }}
+ packages: ${{ steps.filter.outputs.packages }}
+ steps:
+ - name: Checks-out repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Check updated files paths
+ uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
+ id: filter
+ with:
+ filters: |
+ apps:
+ - 'apps/**'
+ packages:
+ - 'packages/**'
+ - 'plugins/**'
+
+ expose-vars:
+ runs-on: ubuntu-latest
+ if: ${{ !github.event.pull_request.draft }}
+ outputs:
+ NODE_VERSION: ${{ env.NODE_VERSION }}
+ steps:
+ - name: Exposing env vars
+ run: echo "Exposing env vars."
+
+ npm-publish:
+ uses: ./.github/workflows/job-npm.yml
+ needs:
+ - path-filter
+ - expose-vars
+ with:
+ NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}
+ PUBLISH_PACKAGES: true
+ PUBLISH_PLUGINS: true
+ CHECK_CHANGES: true
+ # Deprecated variable: we never publish the apps on NPM registry
+ PUBLISH_APPS: false
diff --git a/.jjconflict-base-0/.gitignore b/.jjconflict-base-0/.gitignore
new file mode 100644
index 0000000000..0d127c9b66
--- /dev/null
+++ b/.jjconflict-base-0/.gitignore
@@ -0,0 +1,77 @@
+# code
+.vscode/*
+!.vscode/vue-dsfr.code-snippets
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+
+# modules
+node_modules
+**/node_modules
+
+# env
+.env
+.env.ci
+.env.test
+.env.prod
+.env.int
+.env.integ
+.env.codespace
+.env.docker
+
+# init-db
+apps/server/src/init/db/imports/data
+
+# act
+**/act/artifacts
+**/act/docker/registry/auth
+**/act/docker/registry/data
+
+# vitest
+coverage
+apps/client/vite.config.*.timestamp-*.mjs
+apps/server/vite.config.*.timestamp-*.mjs
+
+# sonarqube
+.scannerwork
+
+# keycloak
+keycloak/data
+
+# turbo
+.turbo
+
+# kube config
+.kubeconfig
+
+# dist
+dist
+build
+components.d.ts
+*.tsbuildinfo
+
+# types
+types/
+
+# plugins
+apps/server/src/plugins/external
+
+# helm
+charts/
+
+# integration helm values
+**/env/dso-values-integ.yaml
+**/env/kind-values.yml
+
+# tmp dev files
+ci/kind/configs/rendered
+
+external-plugins
+
+# Playwright
+playwright/test-results/
+playwright/playwright-report/
+playwright/blob-report/
+playwright/playwright/.cache/
diff --git a/.jjconflict-base-0/.husky/commit-msg b/.jjconflict-base-0/.husky/commit-msg
new file mode 100755
index 0000000000..8761c9bac9
--- /dev/null
+++ b/.jjconflict-base-0/.husky/commit-msg
@@ -0,0 +1 @@
+pnpx commitlint --edit ${1}
diff --git a/.jjconflict-base-0/.lintstagedrc b/.jjconflict-base-0/.lintstagedrc
new file mode 100644
index 0000000000..741d5e9ca3
--- /dev/null
+++ b/.jjconflict-base-0/.lintstagedrc
@@ -0,0 +1,8 @@
+{
+ "**/apps/client/**/*.{vue,css}": "pnpm --filter=@cpn-console/client run lint:style --",
+ "**/apps/client/**/*": "pnpm --filter=@cpn-console/client run lint:ts --",
+ "**/apps/server/**/*": "pnpm --filter=@cpn-console/server run lint --",
+ "**/packages/**/*": "pnpm --filter=./packages/* run lint --",
+ "**/plugins/**/*": "pnpm --filter=./plugins/* run lint --",
+ "**/*": "pnpm run lint:root --"
+}
diff --git a/.jjconflict-base-0/.pinact.yaml b/.jjconflict-base-0/.pinact.yaml
new file mode 100644
index 0000000000..3b20588ab3
--- /dev/null
+++ b/.jjconflict-base-0/.pinact.yaml
@@ -0,0 +1,16 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/suzuki-shunsuke/pinact/refs/heads/main/json-schema/pinact.json
+# pinact - https://github.com/suzuki-shunsuke/pinact
+version: 3
+# files:
+# - pattern: action.yaml
+# - pattern: */action.yaml
+
+# separator: " # "
+
+ignore_actions:
+# - name: slsa-framework/slsa-github-generator/\.github/workflows/generator_generic_slsa3\.yml
+# ref: v\d+\.\d+\.\d+
+# - name: actions/.*
+# ref: main
+# - name: suzuki-shunsuke/.*
+# ref: release-.*
diff --git a/.jjconflict-base-0/.release-please-manifest.json b/.jjconflict-base-0/.release-please-manifest.json
new file mode 100644
index 0000000000..18953d7442
--- /dev/null
+++ b/.jjconflict-base-0/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "9.22.2"
+}
diff --git a/.jjconflict-base-0/.vscode/extensions.json b/.jjconflict-base-0/.vscode/extensions.json
new file mode 100644
index 0000000000..3795e131e1
--- /dev/null
+++ b/.jjconflict-base-0/.vscode/extensions.json
@@ -0,0 +1,30 @@
+{
+ "recommendations": [
+ // Cross-editor config
+ "editorconfig.editorconfig",
+ // Git
+ "mhutchie.git-graph",
+ "eamodio.gitlens",
+ // Node / npm
+ "christian-kohler.npm-intellisense",
+ // JavaScript
+ "dbaeumer.vscode-eslint",
+ // Vue.js
+ "vue.volar",
+ "vue.vscode-typescript-vue-plugin",
+ // Vitejs
+ "antfu.vite",
+ "antfu.browse-lite",
+ // Firefox Debugger
+ "firefox-devtools.vscode-firefox-debug",
+ // CSS
+ "csstools.postcss",
+ "stylelint.vscode-stylelint",
+ // YAML
+ "redhat.vscode-yaml",
+ // Makdown
+ "yzhang.markdown-all-in-one",
+ // Kubernetes
+ "ms-kubernetes-tools.vscode-kubernetes-tools"
+ ]
+}
diff --git a/.jjconflict-base-0/.vscode/launch.json b/.jjconflict-base-0/.vscode/launch.json
new file mode 100644
index 0000000000..fbfb2f1013
--- /dev/null
+++ b/.jjconflict-base-0/.vscode/launch.json
@@ -0,0 +1,326 @@
+{
+ // Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
+ // Pointez pour afficher la description des attributs existants.
+ // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Launch Server (Integ)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/server",
+ "run",
+ "integ"
+ ],
+ "envFile": "${workspaceFolder}/apps/server/.env.integ",
+ "console": "integratedTerminal",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Server (Dev)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/server",
+ "run",
+ "dev"
+ ],
+ "envFile": "${workspaceFolder}/apps/server/.env",
+ "console": "integratedTerminal",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Infra (Integ)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "run",
+ "integ"
+ ],
+ "console": "internalConsole",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Infra (Dev)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "run",
+ "dev"
+ ],
+ "console": "internalConsole",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Server NestJS (Integ)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/server-nestjs",
+ "run",
+ "start:dev"
+ ],
+ "envFile": "${workspaceFolder}/apps/server-nestjs/.env.integ",
+ "console": "integratedTerminal",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Server NestJS (Dev)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/server-nestjs",
+ "run",
+ "start:dev"
+ ],
+ "envFile": "${workspaceFolder}/apps/server-nestjs/.env",
+ "console": "integratedTerminal",
+ "restart": true,
+ "presentation": {
+ "hidden": true
+ },
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ]
+ },
+ {
+ "name": "Attach Server",
+ "type": "node",
+ "request": "attach",
+ "port": 9229,
+ "address": "127.0.0.1",
+ "localRoot": "${workspaceFolder}/apps/server",
+ "remoteRoot": "/app/apps/server",
+ "skipFiles": [
+ "/**",
+ "${workspaceFolder}/node_modules/**/*.js"
+ ],
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Serve Client (Chrome) (Integ)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/client",
+ "run",
+ "integ",
+ "--",
+ "--port",
+ "8080",
+ "--strictPort"
+ ],
+ "envFile": "${workspaceFolder}/apps/client/.env.integ",
+ "console": "integratedTerminal",
+ "restart": true,
+ "serverReadyAction": {
+ "pattern": "Local:.*(http://localhost:[0-9]+)",
+ "action": "startDebugging",
+ "name": "Launch Client (Chrome)"
+ },
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Serve Client (Chrome) (Dev)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/client",
+ "run",
+ "dev",
+ "--",
+ "--port",
+ "8080",
+ "--strictPort"
+ ],
+ "envFile": "${workspaceFolder}/apps/client/.env",
+ "console": "integratedTerminal",
+ "restart": true,
+ "serverReadyAction": {
+ "pattern": "Local:.*(http://localhost:[0-9]+)",
+ "action": "startDebugging",
+ "name": "Launch Client (Chrome)"
+ },
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Serve Client (Firefox) (Integ)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/client",
+ "run",
+ "integ",
+ "--",
+ "--port",
+ "8080",
+ "--strictPort"
+ ],
+ "envFile": "${workspaceFolder}/apps/client/.env.integ",
+ "console": "integratedTerminal",
+ "restart": true,
+ "serverReadyAction": {
+ "pattern": "Local:.*(http://localhost:[0-9]+)",
+ "action": "startDebugging",
+ "name": "Launch Client (Firefox)"
+ },
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Serve Client (Firefox) (Dev)",
+ "type": "node",
+ "request": "launch",
+ "runtimeExecutable": "corepack",
+ "runtimeArgs": [
+ "pnpm",
+ "--filter",
+ "@cpn-console/client",
+ "run",
+ "dev",
+ "--",
+ "--port",
+ "8080",
+ "--strictPort"
+ ],
+ "envFile": "${workspaceFolder}/apps/client/.env",
+ "console": "integratedTerminal",
+ "restart": true,
+ "serverReadyAction": {
+ "pattern": "Local:.*(http://localhost:[0-9]+)",
+ "action": "startDebugging",
+ "name": "Launch Client (Firefox)"
+ },
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Launch Client (Chrome)",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost:8080",
+ "webRoot": "${workspaceFolder}/apps/client",
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "name": "Launch Client (Firefox)",
+ "type": "firefox",
+ "request": "launch",
+ "url": "http://localhost:8080",
+ "webRoot": "${workspaceFolder}/apps/client",
+ "presentation": {
+ "hidden": true
+ }
+ }
+ ],
+ "compounds": [
+ {
+ "name": "Launch (Chrome) (Integ)",
+ "configurations": [
+ "Launch Infra (Integ)",
+ "Launch Server (Integ)",
+ "Launch Server NestJS (Integ)",
+ "Serve Client (Chrome) (Integ)"
+ ]
+ },
+ {
+ "name": "Launch (Chrome) (Dev)",
+ "configurations": [
+ "Launch Infra (Dev)",
+ "Launch Server (Dev)",
+ "Launch Server NestJS (Dev)",
+ "Serve Client (Chrome) (Dev)"
+ ]
+ },
+ {
+ "name": "Launch (Firefox) (Integ)",
+ "configurations": [
+ "Launch Infra (Integ)",
+ "Launch Server (Integ)",
+ "Launch Server NestJS (Integ)",
+ "Serve Client (Firefox) (Integ)"
+ ]
+ },
+ {
+ "name": "Launch (Firefox) (Dev)",
+ "configurations": [
+ "Launch Infra (Dev)",
+ "Launch Server (Dev)",
+ "Launch Server NestJS (Dev)",
+ "Serve Client (Firefox) (Dev)"
+ ]
+ }
+ ]
+}
diff --git a/.jjconflict-base-0/.vscode/settings.json b/.jjconflict-base-0/.vscode/settings.json
new file mode 100644
index 0000000000..1b93a34e04
--- /dev/null
+++ b/.jjconflict-base-0/.vscode/settings.json
@@ -0,0 +1,120 @@
+{
+ // visuals
+ "window.autoDetectColorScheme": true,
+ "editor.fontLigatures": "'ss01', 'ss02', 'ss03', 'ss06', 'zero'",
+ "editor.cursorBlinking": "phase",
+ "editor.suggestSelection": "first",
+ "editor.wordWrap": "on",
+ "editor.bracketPairColorization.enabled": true,
+ "editor.tabSize": 2,
+ "search.exclude": {
+ "**/.git": true,
+ "**/.nuxt": true,
+ "**/.pnpm": true,
+ "**/.yarn": true,
+ "**/.turbo": true,
+ "**/dist/**": true,
+ "**/out/**": true,
+ "**/logs": true,
+ "**/node_modules": true,
+ "**/package-lock.json": true,
+ "**/pnpm-lock.yaml": true,
+ "**/yarn.lock": true
+ },
+ // general
+ "editor.unicodeHighlight.invisibleCharacters": false,
+ "workbench.startupEditor": "none",
+ // git
+ "git.autofetch": true,
+ "git.untrackedChanges": "separate",
+ // github
+ "githubPullRequests.pullBranch": "never",
+ // eslint
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit"
+ },
+ "eslint.validate": [
+ "javascript",
+ "javascriptreact",
+ "typescript",
+ "typescriptreact",
+ "vue",
+ "html",
+ "markdown",
+ "json",
+ "jsonc",
+ "yaml",
+ "github-actions-workflow",
+ "toml",
+ "xml",
+ "gql",
+ "graphql",
+ "astro",
+ "svelte",
+ "css",
+ "less",
+ "scss",
+ "pcss",
+ "postcss"
+ ],
+ // stylelint
+ "css.validate": true,
+ "less.validate": true,
+ "scss.validate": true,
+ "files.associations": {
+ "*.css": "css"
+ },
+ // languages
+ "[javascript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+ "javascript.preferences.quoteStyle": "single",
+ "javascript.preferences.importModuleSpecifierEnding": "js",
+ "javascript.suggest.completeJSDocs": true,
+ "javascript.suggest.jsdoc.generateReturns": true,
+ "[typescript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+ "typescript.preferences.quoteStyle": "single",
+ "typescript.preferences.importModuleSpecifierEnding": "js",
+ "typescript.suggest.completeJSDocs": true,
+ "typescript.suggest.jsdoc.generateReturns": true,
+ "[vue]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+ "[css]": {
+ "editor.defaultFormatter": "stylelint.vscode-stylelint"
+ },
+ "[html]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+ "[markdown]": {
+ "editor.quickSuggestions": {
+ "other": true,
+ "comments": true,
+ "strings": true
+ },
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "editor.defaultFormatter": "yzhang.markdown-all-in-one"
+ },
+ // conventional commits
+ "conventionalCommits.showNewVersionNotes": false,
+ // kubernetes
+ "vs-kubernetes": {
+ "vs-kubernetes.crd-code-completion": "enabled"
+ },
+ "vscode-kubernetes.log-viewer.follow": true,
+ "vscode-kubernetes.log-viewer.timestamp": false,
+ "vscode-kubernetes.log-viewer.since": -1,
+ "vscode-kubernetes.log-viewer.tail": -1,
+ "vscode-kubernetes.log-viewer.destination": "Webview",
+ "vscode-kubernetes.log-viewer.wrap": true,
+ // sonarqube
+ "sonarlint.connectedMode.project": {
+ "connectionId": "https-sonarqube-fabrique-numerique-fr",
+ "projectKey": "cloud-pi-native_console_AYsa46O31ebDtzs-pYyZ"
+ },
+ "prisma-smart-formatter.typescript.defaultFormatter": "dbaeumer.vscode-eslint",
+ "prisma-smart-formatter.prisma.defaultFormatter": "Prisma.prisma"
+}
diff --git a/.jjconflict-base-0/.vscode/vue-dsfr.code-snippets b/.jjconflict-base-0/.vscode/vue-dsfr.code-snippets
new file mode 100644
index 0000000000..2533f522d8
--- /dev/null
+++ b/.jjconflict-base-0/.vscode/vue-dsfr.code-snippets
@@ -0,0 +1,823 @@
+{
+ "template": {
+ "scope": "vue",
+ "prefix": "template",
+ "body": [
+ "",
+ " $1",
+ ""
+ ],
+ "description": "Create block"
+ },
+ "script": {
+ "scope": "vue",
+ "prefix": "script",
+ "body": [
+ ""
+ ],
+ "description": "Create "
+ ],
+ "description": "Create
+