diff --git a/.github/workflows/admin.yml b/.github/workflows/admin.yml index 1f8c08478b..0e3793314d 100644 --- a/.github/workflows/admin.yml +++ b/.github/workflows/admin.yml @@ -17,6 +17,7 @@ jobs: admin: - '.github/workflows/**/*' - 'admin/**/*' + build: if: needs.files-changed.outputs.admin == 'true' name: Build - Admin @@ -31,26 +32,6 @@ jobs: run: npm install && npm run build working-directory: ./admin - docker-production: - if: needs.files-changed.outputs.admin == 'true' - name: Build Docker Production - Admin - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Admin | Build Docker Production - run: docker compose -f docker-compose.yml build admin - - docker-development: - if: needs.files-changed.outputs.admin == 'true' - name: Build Docker Development - Admin - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Admin | Build Docker Development - run: docker compose build admin admin-storybook - storybook: if: needs.files-changed.outputs.admin == 'true' name: Build Storybook - Admin diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index d297726fe1..f1d283ddcf 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -32,26 +32,6 @@ jobs: run: npm install && npm run build working-directory: ./backend - docker-production: - if: needs.files-changed.outputs.backend == 'true' - name: Build Docker Production - Backend - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Backend | Build Docker Production - run: docker compose -f docker-compose.yml build backend - - docker-development: - if: needs.files-changed.outputs.backend == 'true' - name: Build Docker Development - Backend - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Backend | Build Docker Development - run: docker compose build backend - lint: if: needs.files-changed.outputs.backend == 'true' name: Lint - Backend diff --git a/.github/workflows/docker.yml b/.github/workflows/deployment.yml similarity index 63% rename from .github/workflows/docker.yml rename to .github/workflows/deployment.yml index b4e81bf0ad..d04728090b 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/deployment.yml @@ -1,19 +1,15 @@ -name: Create and publish Docker images +name: Push/Deploy -on: - push: - branches: ['master'] - -env: - REGISTRY: ghcr.io +on: push jobs: - build-and-push-image: + build-and-push-images: strategy: matrix: folder: [authentik, admin, backend, frontend, presenter] runs-on: ubuntu-latest env: + REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }}/${{ matrix.folder }} permissions: contents: read @@ -43,7 +39,7 @@ jobs: type=ref,event=branch type=ref,event=pr type=sha - - name: Build and push Docker image + - name: Build and push Docker images id: push uses: docker/build-push-action@a8d35412fb758de9162fd63e3fa3f0942bdedb4d with: @@ -63,4 +59,28 @@ jobs: # subject-digest: ${{ steps.push.outputs.digest }} # push-to-registry: true + deploy-to-kubernetes: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' + needs: build-and-push-images + steps: + - uses: mdgreenwald/mozilla-sops-action@d9714e521cbaecdae64a89d2fdd576dd2aa97056 # v1.6.0 + - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 + - run: | + mkdir -p ~/.config/sops/age + echo $SOPS_KEY | base64 --decode > ~/.config/sops/age/keys.txt + env: + SOPS_KEY: ${{ secrets.SOPS_KEY }} + - run: | + mkdir -p ~/.kube + sops decrypt ./infrastructure/helmfile/secrets/kubeconfig > ~/.kube/config + - run: echo "IMAGE_TAG=sha-$(echo $GITHUB_SHA | cut -c 1-7)" >> $GITHUB_ENV + - uses: helmfile/helmfile-action@314e6f498c8fb72ae64ed6f526e992a6a9a90e32 #v1.9.1 + with: + helmfile-args: apply --environment master + helmfile-workdirectory: ./infrastructure/helmfile + helm-plugins: > + https://github.com/databus23/helm-diff, + https://github.com/jkroepke/helm-secrets + diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index 6898ebe7a2..70bf9f698b 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -32,26 +32,6 @@ jobs: run: npm install && npm run build working-directory: ./frontend - docker-production: - if: needs.files-changed.outputs.frontend == 'true' - name: Build Docker Production - Frontend - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Frontend | Build Docker Production - run: docker compose -f docker-compose.yml build frontend - - docker-development: - if: needs.files-changed.outputs.frontend == 'true' - name: Build Docker Development - Frontend - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Frontend | Build Docker Development - run: docker compose build frontend frontend-storybook - storybook: if: needs.files-changed.outputs.frontend == 'true' name: Build Storybook - Frontend diff --git a/.github/workflows/presenter.yml b/.github/workflows/presenter.yml index 6d65712b4d..b46ddda716 100644 --- a/.github/workflows/presenter.yml +++ b/.github/workflows/presenter.yml @@ -32,26 +32,6 @@ jobs: run: npm install && npm run build working-directory: ./presenter - docker-production: - if: needs.files-changed.outputs.presenter == 'true' - name: Build Docker Production - Presenter - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Presenter | Build Docker Production - run: docker compose -f docker-compose.yml build presenter - - docker-development: - if: needs.files-changed.outputs.presenter == 'true' - name: Build Docker Development - Presenter - needs: files-changed - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9a9194f87191a7e9055e3e9b95b8cfb13023bb08 # v4.1.7 - - name: Presenter | Build Docker Development - run: docker compose build presenter presenter-storybook - storybook: if: needs.files-changed.outputs.presenter == 'true' name: Build Storybook - Presenter diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 199dd90819..d6e3b6713d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,7 +38,7 @@ jobs: ########################################################################## # TODO: this will error on duplicate #- name: package-version-to-git-tag - # uses: pkgdeps/git-tag-action@81b45ff87eb7f7bd49e76e2bed448990d4dd72b3 # v3.0.0 + # uses: pkgdeps/git-tag-action@ef111413f44ebe5cc05994e7f5b5b9edaaada08d # v3.0.0 # with: # github_token: ${{ secrets.GITHUB_TOKEN }} # github_repo: ${{ github.repository }} @@ -49,7 +49,7 @@ jobs: # Push build tag to GitHub ############################################### ########################################################################## - name: package-version-to-git-tag + build number - uses: pkgdeps/git-tag-action@81b45ff87eb7f7bd49e76e2bed448990d4dd72b3 # v3.0.0 + uses: pkgdeps/git-tag-action@ef111413f44ebe5cc05994e7f5b5b9edaaada08d # v3.0.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} github_repo: ${{ github.repository }} diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000000..f4841395dc --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,13 @@ +creation_rules: + - age: >- + age1al36hkk8can83zpxq8qyy07gpv83hdw9vchfly5f264kanz405as283a00, + age1llp6k66265q3rzqemxpnq0x3562u20989vcjf65fl9s3hjhgcscq6mhnjw, + age1zycwtk6dkxj6vuqhj9jw7932ythky9p3att6df4z9qasyw8v5dxquejcmp, + age1t0ufylv5xfwhmcamu4gpwtay4wcuyqgzlkht4t04s9qjl8xjks9skxrt02, + age15g5mhkcrseuxq923j7vdnmrzq4eh08ujha864k8hc6ncrj5sqfcsqkkyr2 + +# age1al36hkk8can83zpxq8qyy07gpv83hdw9vchfly5f264kanz405as283a00 SOPS_KEY github secret +# age1llp6k66265q3rzqemxpnq0x3562u20989vcjf65fl9s3hjhgcscq6mhnjw @roschaefer +# age1zycwtk6dkxj6vuqhj9jw7932ythky9p3att6df4z9qasyw8v5dxquejcmp @mahula +# age1t0ufylv5xfwhmcamu4gpwtay4wcuyqgzlkht4t04s9qjl8xjks9skxrt02 @Bettelstab +# age15g5mhkcrseuxq923j7vdnmrzq4eh08ujha864k8hc6ncrj5sqfcsqkkyr2 @trinity2701 diff --git a/admin/.env.production b/admin/.env.production index 0e52cf3c91..f920006ede 100644 --- a/admin/.env.production +++ b/admin/.env.production @@ -1,5 +1,5 @@ # META -PUBLIC_ENV__META__BASE_URL="https://admin.master.dreammall.earth" +PUBLIC_ENV__META__BASE_URL="https://admin.git.master.dreammall.earth" PUBLIC_ENV__META__DEFAULT_AUTHOR="IT Team 4 Change" PUBLIC_ENV__META__DEFAULT_DESCRIPTION="IT4C Frontend Boilerplate" PUBLIC_ENV__META__DEFAULT_TITLE="IT4C" diff --git a/admin/package-lock.json b/admin/package-lock.json index e4e9b34cce..97d419145f 100644 --- a/admin/package-lock.json +++ b/admin/package-lock.json @@ -67,7 +67,7 @@ "prettier": "^3.3.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "sass": "1.77.8", + "sass": "1.74.1", "sass-loader": "^16.0.0", "storybook": "^8.1.10", "stylelint": "^16.8.1", @@ -18502,9 +18502,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.74.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz", + "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==", "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/admin/package.json b/admin/package.json index 91303c042f..1961ce1503 100644 --- a/admin/package.json +++ b/admin/package.json @@ -110,7 +110,7 @@ "prettier": "^3.3.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "sass": "1.77.8", + "sass": "1.74.1", "sass-loader": "^16.0.0", "storybook": "^8.1.10", "stylelint": "^16.8.1", diff --git a/frontend/.env.production b/frontend/.env.production index bd5c992f20..1069350b3e 100644 --- a/frontend/.env.production +++ b/frontend/.env.production @@ -1,19 +1,19 @@ # AUTH -PUBLIC_ENV__AUTH__AUTHORITY="https://auth.master.dreammall.earth/application/o/dreammallearth/" -PUBLIC_ENV__AUTH__AUTHORITY_SIGNUP_URI="https://auth.master.dreammall.earth/if/flow/dreammallearth-enrollment/" -PUBLIC_ENV__AUTH__AUTHORITY_SIGNOUT_URI="https://auth.master.dreammall.earth/if/flow/dreammallearth-invalidation-flow/" +PUBLIC_ENV__AUTH__AUTHORITY="https://auth.master.git.dreammall.earth/application/o/dreammallearth/" +PUBLIC_ENV__AUTH__AUTHORITY_SIGNUP_URI="https://auth.master.git.dreammall.earth/if/flow/dreammallearth-enrollment/" +PUBLIC_ENV__AUTH__AUTHORITY_SIGNOUT_URI="https://auth.master.git.dreammall.earth/if/flow/dreammallearth-invalidation-flow/" PUBLIC_ENV__AUTH__CLIENT_ID="G3g0sjCjph1NAyGeeu5Te5ltx1I7WZ0DGB8i6vOI" -PUBLIC_ENV__AUTH__REDIRECT_URI="https://app.master.dreammall.earth/auth" -PUBLIC_ENV__AUTH__SILENT_REDIRECT_URI="https://app.master.dreammall.earth/silent-refresh" +PUBLIC_ENV__AUTH__REDIRECT_URI="https://app.master.git.dreammall.earth/auth" +PUBLIC_ENV__AUTH__SILENT_REDIRECT_URI="https://app.master.git.dreammall.earth/silent-refresh" PUBLIC_ENV__AUTH__RESPONSE_TYPE="code" PUBLIC_ENV__AUTH__SCOPE="openid profile posts" PUBLIC_ENV__AUTH__ADMIN_GROUP="authentik Admins" -PUBLIC_ENV__AUTH__ADMIN_REDIRECT_URI="https://admin.master.dreammall.earth/signin" +PUBLIC_ENV__AUTH__ADMIN_REDIRECT_URI="https://admin.master.git.dreammall.earth/signin" # Endpoints -PUBLIC_ENV__ENDPOINTS__GRAPHQL_URI=https://master.dreammall.earth/api/ -PUBLIC_ENV__ENDPOINTS__WEBSOCKET_URI=wss://master.dreammall.earth/api/subscriptions +PUBLIC_ENV__ENDPOINTS__GRAPHQL_URI=https://master.git.dreammall.earth/api/ +PUBLIC_ENV__ENDPOINTS__WEBSOCKET_URI=wss://master.git.dreammall.earth/api/subscriptions # META -PUBLIC_ENV__META__BASE_URL="https://app.master.dreammall.earth" +PUBLIC_ENV__META__BASE_URL="https://app.master.git.dreammall.earth" PUBLIC_ENV__META__DEFAULT_AUTHOR="DreamMall Verlag GbR" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 35d37c8d5a..ca1dc96ea8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,7 +17,7 @@ "@vue/apollo-option": "^4.0.0", "@vue/apollo-ssr": "^4.0.0", "@vue/compiler-sfc": "^3.4.35", - "@vue/server-renderer": "3.4.27", + "@vue/server-renderer": "3.4.35", "compression": "^1.7.4", "cookie": "^0.6.0", "cross-env": "^7.0.3", @@ -32,7 +32,7 @@ "vike": "^0.4.181", "vite": "^5.3.5", "vite-svg-loader": "^5.1.0", - "vue": "3.4.27", + "vue": "3.4.35", "vue-i18n": "^9.13.1", "vue3-toastify": "^0.2.2", "vuetify": "^3.5.17", @@ -83,7 +83,7 @@ "prettier": "^3.3.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "sass": "1.77.8", + "sass": "1.74.1", "sass-loader": "^16.0.0", "storybook": "^8.1.10", "stylelint": "^16.8.1", @@ -7629,24 +7629,24 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", + "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.35", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", + "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-core": "3.4.35", + "@vue/shared": "3.4.35" } }, "node_modules/@vue/compiler-sfc": { @@ -7665,28 +7665,7 @@ "source-map-js": "^1.2.0" } }, - "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", - "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.35", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", - "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", - "dependencies": { - "@vue/compiler-core": "3.4.35", - "@vue/shared": "3.4.35" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-ssr": { + "node_modules/@vue/compiler-ssr": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz", "integrity": "sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==", @@ -7695,20 +7674,6 @@ "@vue/shared": "3.4.35" } }, - "node_modules/@vue/compiler-sfc/node_modules/@vue/shared": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", - "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", - "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", - "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/shared": "3.4.27" - } - }, "node_modules/@vue/compiler-vue2": { "version": "2.7.16", "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", @@ -7749,48 +7714,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", - "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.35.tgz", + "integrity": "sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==", "dependencies": { - "@vue/shared": "3.4.27" + "@vue/shared": "3.4.35" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", - "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.35.tgz", + "integrity": "sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==", "dependencies": { - "@vue/reactivity": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/reactivity": "3.4.35", + "@vue/shared": "3.4.35" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", - "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz", + "integrity": "sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==", "dependencies": { - "@vue/runtime-core": "3.4.27", - "@vue/shared": "3.4.27", + "@vue/reactivity": "3.4.35", + "@vue/runtime-core": "3.4.35", + "@vue/shared": "3.4.35", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", - "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.35.tgz", + "integrity": "sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==", "dependencies": { - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-ssr": "3.4.35", + "@vue/shared": "3.4.35" }, "peerDependencies": { - "vue": "3.4.27" + "vue": "3.4.35" } }, "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", + "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==" }, "node_modules/@vue/test-utils": { "version": "2.4.6", @@ -18981,9 +18947,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.74.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz", + "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==", "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23645,15 +23611,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", - "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.35.tgz", + "integrity": "sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==", "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-sfc": "3.4.27", - "@vue/runtime-dom": "3.4.27", - "@vue/server-renderer": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-dom": "3.4.35", + "@vue/compiler-sfc": "3.4.35", + "@vue/runtime-dom": "3.4.35", + "@vue/server-renderer": "3.4.35", + "@vue/shared": "3.4.35" }, "peerDependencies": { "typescript": "*" @@ -23974,22 +23940,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/vue/node_modules/@vue/compiler-sfc": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", - "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", - "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.27", - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.38", - "source-map-js": "^1.2.0" - } - }, "node_modules/vue3-toastify": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/vue3-toastify/-/vue3-toastify-0.2.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5743856f59..fbbcf9607a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,7 +61,7 @@ "@vue/apollo-option": "^4.0.0", "@vue/apollo-ssr": "^4.0.0", "@vue/compiler-sfc": "^3.4.35", - "@vue/server-renderer": "3.4.27", + "@vue/server-renderer": "3.4.35", "compression": "^1.7.4", "cookie": "^0.6.0", "cross-env": "^7.0.3", @@ -76,7 +76,7 @@ "vike": "^0.4.181", "vite": "^5.3.5", "vite-svg-loader": "^5.1.0", - "vue": "3.4.27", + "vue": "3.4.35", "vue-i18n": "^9.13.1", "vue3-toastify": "^0.2.2", "vuetify": "^3.5.17", @@ -127,7 +127,7 @@ "prettier": "^3.3.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "sass": "1.77.8", + "sass": "1.74.1", "sass-loader": "^16.0.0", "storybook": "^8.1.10", "stylelint": "^16.8.1", diff --git a/frontend/scripts/tests/mock.apolloClient.ts b/frontend/scripts/tests/mock.apolloClient.ts deleted file mode 100644 index 905164b800..0000000000 --- a/frontend/scripts/tests/mock.apolloClient.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { DefaultApolloClient } from '@vue/apollo-composable' -import { config } from '@vue/test-utils' -import { createMockClient, createMockSubscription, IMockSubscription } from 'mock-apollo-client' -import { vi } from 'vitest' - -import { currentUserQuery } from '#queries/currentUserQuery' -import { openTablesQuery } from '#src/graphql/queries/openTablesQuery' -import { updateOpenTablesSubscription } from '#subscriptions/updateOpenTablesSubscription' - -export const mockClient = createMockClient() - -export const openTablesQueryMock = vi.fn() - -export const currentUserQueryMock = vi.fn() - -export const updateOpenTablesSubscriptionMock: IMockSubscription = createMockSubscription() - -mockClient.setRequestHandler( - openTablesQuery, - openTablesQueryMock.mockResolvedValue({ data: { openTables: [] } }), -) - -mockClient.setRequestHandler( - currentUserQuery, - currentUserQueryMock.mockResolvedValue({ - data: { - currentUser: { - id: 666, - name: 'Current User', - username: 'currentUser', - table: null, - }, - }, - }), -) - -mockClient.setRequestHandler(updateOpenTablesSubscription, () => updateOpenTablesSubscriptionMock) - -config.global.provide = { - ...config.global.provide, - [DefaultApolloClient]: mockClient, -} diff --git a/frontend/src/components/buttons/CreateButton.test.ts b/frontend/src/components/buttons/CreateButton.test.ts deleted file mode 100644 index 16390da38a..0000000000 --- a/frontend/src/components/buttons/CreateButton.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { ApolloError } from '@apollo/client/errors' -import { flushPromises, mount } from '@vue/test-utils' -import { navigate } from 'vike/client/router' -import { describe, it, expect, beforeEach, vi } from 'vitest' - -import { joinMyTableMutation } from '#mutations/joinMyTableMutation' -import { mockClient } from '#tests/mock.apolloClient' -import { errorHandlerSpy } from '#tests/plugin.globalErrorHandler' - -import CreateButton from './CreateButton.vue' - -vi.mock('vike/client/router') -vi.mocked(navigate).mockResolvedValue() - -const joinMyTableMutationMock = vi.fn() - -mockClient.setRequestHandler(joinMyTableMutation, joinMyTableMutationMock) - -describe('CreateButton', () => { - const Wrapper = () => { - return mount(CreateButton, { - props: {}, - }) - } - let wrapper: ReturnType - - beforeEach(() => { - wrapper = Wrapper() - }) - - it('renders', () => { - expect(wrapper.element).toMatchSnapshot() - }) - - it('button list content is hidden', () => { - expect(wrapper.find('.new-project-button').exists()).toBe(false) - expect(wrapper.find('.new-table-button').exists()).toBe(false) - expect(wrapper.find('.assistent-button').exists()).toBe(false) - }) - - describe('click on create button', () => { - it('emits click event', async () => { - await wrapper.find('#create-button').trigger('click') - expect(wrapper.emitted()).toHaveProperty('click', [[1]]) - }) - - it('button list visible', async () => { - await wrapper.find('#create-button').trigger('click') - expect(wrapper.find('.new-project-button').exists()).toBe(true) - expect(wrapper.find('.new-table-button').exists()).toBe(true) - expect(wrapper.find('.assistant-button').exists()).toBe(true) - }) - }) - - describe('new table button', () => { - beforeEach(() => { - wrapper = Wrapper() - }) - - describe('enter table', () => { - describe('apollo with success', () => { - beforeEach(async () => { - vi.clearAllMocks() - joinMyTableMutationMock.mockResolvedValue({ - data: { - joinMyTable: 69, - }, - }) - await wrapper.find('#create-button').trigger('click') - await wrapper.find('button.new-table-button').trigger('click') - }) - - it('calls the api', () => { - // eslint-disable-next-line vitest/prefer-called-with - expect(joinMyTableMutationMock).toHaveBeenCalled() - }) - - it('navigates to table page', async () => { - await flushPromises() - expect(navigate).toHaveBeenCalledWith('/table/69') - }) - }) - - describe('apollo with no data', () => { - beforeEach(async () => { - vi.clearAllMocks() - joinMyTableMutationMock.mockResolvedValue({ - data: null, - }) - await wrapper.find('#create-button').trigger('click') - await wrapper.find('button.new-table-button').trigger('click') - }) - - it('calls the api', () => { - // eslint-disable-next-line vitest/prefer-called-with - expect(joinMyTableMutationMock).toHaveBeenCalled() - }) - - it('does not call navigate', () => { - expect(navigate).not.toHaveBeenCalled() - }) - - // it('toasts no table found error', () => { - // expect(errorHandlerSpy).toHaveBeenCalledWith('No table found') - // }) - }) - - describe('apollo with error', () => { - beforeEach(async () => { - vi.clearAllMocks() - joinMyTableMutationMock.mockRejectedValue({ - message: 'OUCH', - }) - await wrapper.find('#create-button').trigger('click') - await wrapper.find('button.new-table-button').trigger('click') - }) - - it('calls the api', () => { - expect(joinMyTableMutationMock).toHaveBeenCalledWith({}) - }) - - it('does not call navigate', () => { - expect(navigate).not.toHaveBeenCalled() - }) - - it('toasts no table found error', () => { - expect(errorHandlerSpy).toHaveBeenCalledWith( - 'Error opening table', - new ApolloError({ errorMessage: 'OUCH' }), - ) - }) - }) - }) - }) -}) diff --git a/frontend/src/components/buttons/CreateButton.vue b/frontend/src/components/buttons/CreateButton.vue deleted file mode 100644 index f20e071cb0..0000000000 --- a/frontend/src/components/buttons/CreateButton.vue +++ /dev/null @@ -1,568 +0,0 @@ - - - - - diff --git a/frontend/src/components/buttons/CreateButton.stories.ts b/frontend/src/components/buttons/LargeDreamMallButton.stories.ts similarity index 79% rename from frontend/src/components/buttons/CreateButton.stories.ts rename to frontend/src/components/buttons/LargeDreamMallButton.stories.ts index 2f8ce0346e..a44c1afc8a 100644 --- a/frontend/src/components/buttons/CreateButton.stories.ts +++ b/frontend/src/components/buttons/LargeDreamMallButton.stories.ts @@ -1,20 +1,20 @@ import { SBComp } from '#types/SBComp' -import CreateButton from './CreateButton.vue' +import LargeDreamMallButton from './LargeDreamMallButton.vue' import type { Meta, StoryObj } from '@storybook/vue3' // More on how to set up stories at: https://storybook.js.org/docs/vue/writing-stories/introduction const meta = { - title: 'Inputs/CreateButton', - component: CreateButton as SBComp, + title: 'Inputs/LargeDreamMallButton', + component: LargeDreamMallButton as SBComp, // This component will have an automatically generated docsPage entry: https://storybook.js.org/docs/vue/writing-docs/autodocs tags: ['autodocs'], argTypes: { onClick: { action: 'clicked' }, }, args: {}, // default value -} satisfies Meta +} satisfies Meta export default meta type Story = StoryObj diff --git a/frontend/src/components/buttons/LargeDreamMallButton.vue b/frontend/src/components/buttons/LargeDreamMallButton.vue new file mode 100644 index 0000000000..102c6b3306 --- /dev/null +++ b/frontend/src/components/buttons/LargeDreamMallButton.vue @@ -0,0 +1,423 @@ + + + + + diff --git a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.stories.ts b/frontend/src/components/buttons/SmallDreamMallButton.stories.ts similarity index 88% rename from frontend/src/components/buttons/mobile-create-button/MobileCreateButton.stories.ts rename to frontend/src/components/buttons/SmallDreamMallButton.stories.ts index 6eab2e8fae..6e633a19bb 100644 --- a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.stories.ts +++ b/frontend/src/components/buttons/SmallDreamMallButton.stories.ts @@ -1,6 +1,6 @@ import { SBComp } from '#types/SBComp' -import MobileCreateButton from './MobileCreateButton.vue' +import MobileCreateButton from './SmallDreamMallButton.vue' import type { Meta, StoryObj } from '@storybook/vue3' diff --git a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.test.ts b/frontend/src/components/buttons/SmallDreamMallButton.test.ts similarity index 83% rename from frontend/src/components/buttons/mobile-create-button/MobileCreateButton.test.ts rename to frontend/src/components/buttons/SmallDreamMallButton.test.ts index be7f7c43c3..353df1c93b 100644 --- a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.test.ts +++ b/frontend/src/components/buttons/SmallDreamMallButton.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, afterEach } from 'vitest' import { h } from 'vue' import { VApp } from 'vuetify/components' -import MobileCreateButton from './MobileCreateButton.vue' +import MobileCreateButton from './SmallDreamMallButton.vue' describe('MobileCreateButton', () => { const Wrapper = (props = { isActive: false }) => { @@ -33,9 +33,9 @@ describe('MobileCreateButton', () => { describe('click on create button', () => { it('emits click event', async () => { wrapper = Wrapper() - await wrapper.find('#create-button-mobile').trigger('click') + await wrapper.find('#small-dream-mall-button').trigger('click') const component = wrapper.findComponent(MobileCreateButton) - expect(component.emitted('button-click')).toBeTruthy() + expect(component.emitted('click')).toBeTruthy() }) }) }) diff --git a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.vue b/frontend/src/components/buttons/SmallDreamMallButton.vue similarity index 97% rename from frontend/src/components/buttons/mobile-create-button/MobileCreateButton.vue rename to frontend/src/components/buttons/SmallDreamMallButton.vue index 858b09e105..d3540f9e9b 100644 --- a/frontend/src/components/buttons/mobile-create-button/MobileCreateButton.vue +++ b/frontend/src/components/buttons/SmallDreamMallButton.vue @@ -5,8 +5,8 @@ viewBox="0 0 182 182" fill="none" xmlns="http://www.w3.org/2000/svg" - class="create-button-svg" - :class="[isActive ? 'create-button-svg--active' : '']" + class="dream-mall-button-svg" + :class="[isActive ? 'dream-mall-button-svg--active' : '']" > - + () -defineEmits(['button-click']) +defineEmits(['click']) diff --git a/frontend/src/components/buttons/mobile-create-button/__snapshots__/MobileCreateButtonActions.test.ts.snap b/frontend/src/components/buttons/mobile-create-button/__snapshots__/MobileCreateButtonActions.test.ts.snap deleted file mode 100644 index 64008e572c..0000000000 --- a/frontend/src/components/buttons/mobile-create-button/__snapshots__/MobileCreateButtonActions.test.ts.snap +++ /dev/null @@ -1,407 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`MobileCreateButtonActions > renders closed 1`] = ` -
-