diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index f486dacb..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-env node */ -require("@rushstack/eslint-patch/modern-module-resolution"); - -module.exports = { - root: true, - extends: [ - "plugin:vue/vue3-essential", - "eslint:recommended", - "@vue/eslint-config-prettier", - ], - parserOptions: { - ecmaVersion: "latest", - }, - env: { - "vue/setup-compiler-macros": true, - node: true, - }, -}; diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml new file mode 100644 index 00000000..a08a2e3b --- /dev/null +++ b/.github/workflows/cicd.yml @@ -0,0 +1,194 @@ +# +# Example GitHub Actions config that drives UW-IT AXD2 integration and deployment +# +# Preconditions: +# +# 1) Application docker build is based on django-container +# +# 2) Application test suite is kicked off in docker/test.sh +# +# 3) Application repo has access to the two secrets +# at https://github.com/organizations/uw-it-aca/settings/secrets: +# +# GH_AUTH_TOKEN: Grants access to private flux deployment repo +# GCP_JSON_KEY: Grants access to Google Cloud Registry +# +# To adapt this config file to a specific django project: +# +# 1) Set RELEASE_NAME suitable for deployment to k8s. RELEASE_NAME must +# match the "repo" value in docker/*-values.yml. +# +# 2) Set DJANGO_APP to the name of the django project name/directory. +# +# 3) Verify that the lists of branches for push/pull_request is appropriate, +# and add other branch names if needed. Additional branch names must +# also have steps defined in the deploy job +# +# 4) Confirm that the build steps are suitable. Likely they are, but +# some projects have an intermediate build step that could benefit +# from caching, so it may be useful to augment the build steps. +# +--- +name: Build, Test and Deploy + +env: + RELEASE_NAME: django-vue + DJANGO_APP: app_name + +# Be sure that branches defined here have corresponding steps +# defined in the "deploy" job +on: + push: + branches: [main, master, qa, develop, feature/eval-me] + pull_request: + branches: [main, master, qa, develop, feature/eval-me] + types: [opened, reopened, synchronize] + +jobs: + context: + runs-on: ubuntu-22.04 + + outputs: + commit_hash: ${{ steps.context.outputs.commit_hash }} + git_repo_branch: ${{ steps.context.outputs.git_repo_branch }} + image_tag: ${{ steps.context.outputs.image_tag }} + + steps: + - name: Set up Context + id: context + uses: uw-it-aca/actions/cicd-context@main + with: + release_name: ${{ env.RELEASE_NAME }} + + build: + runs-on: ubuntu-22.04 + + needs: context + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Run Python Linters + uses: uw-it-aca/actions/python-linters@main + with: + app_name: ${DJANGO_APP} + exclude_paths: "migrations" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Cache Docker layers + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-$(echo ${{ hashFiles('Dockerfile') }} | head -c 16) + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Build App Image + uses: docker/build-push-action@v6 + with: + context: . + target: app-container + tags: ${{ needs.context.outputs.image_tag }} + push: false + load: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + + - name: Build Test Image + uses: docker/build-push-action@v6 + with: + target: app-test-container + tags: app-test-container + push: false + load: true + + - name: Run Tests in Image + id: tests + shell: bash + run: >- + docker run -u root -t + -v ${PWD}:/coverage + -e DJANGO_APP="$DJANGO_APP" + -e "ENV=localdev" -e "AUTH=SAML_MOCK" + app-test-container + bash -c ". ./docker/test.sh" + + - name: Record Test Results + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + python -m pip install --upgrade pip coverage coveralls==3.3.1 + coverage combine + coveralls + +# - name: Push Image to Repository +# if: github.event_name == 'push' +# uses: uw-it-aca/actions/gcr-push@main +# with: +# image_tag: ${{ needs.context.outputs.image_tag }} +# gcp_json_key: ${{ secrets.GCP_JSON_KEY }} +# +# deploy: +# if: github.event_name == 'push' +# +# needs: [context, build] +# +# outputs: +# context: ${{ steps.context.outputs.context }} +# +# runs-on: ubuntu-22.04 +# +# steps: +# - name: Checkout Repo +# uses: actions/checkout@v3 +# +# - name: Deployment Pipeline +# if: >- +# contains(fromJSON('["main", "master", "develop", "qa"]'), +# needs.context.outputs.git_repo_branch) +# uses: uw-it-aca/actions/cicd-deploy@main +# with: +# release_name: ${{ env.RELEASE_NAME }} +# commit_hash: ${{ needs.context.outputs.commit_hash }} +# git_repo_branch: ${{ needs.context.outputs.git_repo_branch }} +# gh_auth_token: ${{ secrets.GH_AUTH_TOKEN }} +# +# - name: Deploy Evaluation Branch +# if: needs.context.outputs.git_repo_branch == 'feature/eval-me' +# uses: uw-it-aca/actions/cicd-deploy@main +# with: +# release_name: ${{ env.RELEASE_NAME }} +# commit_hash: ${{ needs.context.outputs.commit_hash }} +# git_repo_branch: ${{ needs.context.outputs.git_repo_branch }} +# gh_auth_token: ${{ secrets.GH_AUTH_TOKEN }} +# app_instance: eval +# +# - name: 'Surface context from executed build step' +# id: context +# shell: bash +# run: echo "context=$(< ${CONTEXT_FILENAME})" >> $GITHUB_OUTPUT +# +# housekeeping: +# if: github.event_name == 'push' +# +# needs: [context, build, deploy] +# +# runs-on: ubuntu-22.04 +# +# steps: +# - name: House Keeping +# uses: uw-it-aca/actions/cicd-housekeeping@main +# with: +# release_name: ${{ env.RELEASE_NAME }} +# gh_auth_token: ${{ secrets.GH_AUTH_TOKEN }} +# registry_password: ${{ secrets.GCP_JSON_KEY }} +# context: ${{ needs.deploy.outputs.context }} diff --git a/.stylelintignore b/.stylelintignore deleted file mode 100644 index eeec074f..00000000 --- a/.stylelintignore +++ /dev/null @@ -1,2 +0,0 @@ -# Ignore bundles for stylelinting -bundles/ \ No newline at end of file diff --git a/.stylelintrc b/.stylelintrc index 2691235a..e6c1776b 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -5,12 +5,6 @@ ], "rules": { "scss/no-global-function-names": null, - "no-invalid-position-at-import-rule": null, - "scss/at-import-partial-extension": [ - "never", - { - "severity": "warning" - } - ] + "no-invalid-position-at-import-rule": null } } diff --git a/.vscode/settings.json b/.vscode/settings.json index b2e240ce..47aaca3f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,7 @@ { - "black-formatter.args": ["--line-length=79"], - "autopep8.args": ["--max-line-length=79"], + "black-formatter.args": [ + "--line-length","79", + "--skip-string-normalization","true" + ], "stylelint.validate": ["vue", "scss"] } diff --git a/Dockerfile b/Dockerfile index a35dbc43..b65ca637 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ -ARG DJANGO_CONTAINER_VERSION=2.0.1 +ARG DJANGO_CONTAINER_VERSION=2.0.6 FROM us-docker.pkg.dev/uwit-mci-axdd/containers/django-container:${DJANGO_CONTAINER_VERSION} as app-prebundler-container USER root -RUN apt-get update && apt-get install -y libpq-dev +RUN apt-get update && apt-get install libpq-dev -y USER acait ADD --chown=acait:acait . /app/ ADD --chown=acait:acait docker/ /app/project/ -# ADD --chown=acait:acait docker/app_start.sh /scripts -# RUN chmod u+x /scripts/app_start.sh +ADD --chown=acait:acait docker/app_start.sh /scripts +RUN chmod u+x /scripts/app_start.sh RUN /app/bin/pip install -r requirements.txt RUN /app/bin/pip install psycopg2 @@ -38,7 +38,7 @@ COPY --chown=acait:acait --from=node-bundler /app/app_name/static /app/app_name/ RUN /app/bin/python manage.py collectstatic --noinput -FROM us-docker.pkg.dev/uwit-mci-axdd/containers/django-container:${DJANGO_CONTAINER_VERSION} as app-test-container +FROM us-docker.pkg.dev/uwit-mci-axdd/containers/django-test-container:${DJANGO_CONTAINER_VERSION} AS app-test-container ENV NODE_PATH=/app/lib/node_modules COPY --from=app-container /app/ /app/ diff --git a/README.md b/README.md index deadb062..ecf1c5a8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # app_name -[![Build Status](https://github.com/uw-it-aca/django-vue/workflows/Build%2C%20Test%20and%20Deploy/badge.svg?branch=main)](https://github.com/uw-it-aca/django-vue/actions) +[![Build Status](https://github.com/uw-it-aca/django-vue/workflows/Build%2C%20Test%20and%20Deploy/badge.svg)](https://github.com/uw-it-aca/django-vue/actions) [![Coverage Status](https://coveralls.io/repos/github/uw-it-aca/django-vue/badge.svg?branch=main)](https://coveralls.io/github/uw-it-aca/django-vue?branch=main) This is a template repository used for creating Django-Vue applications. Use this template to create a new project repository. diff --git a/app_name/apps.py b/app_name/apps.py index c086b8b0..ed6c2a7f 100644 --- a/app_name/apps.py +++ b/app_name/apps.py @@ -1,8 +1,12 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.apps import AppConfig +from django.contrib.staticfiles.apps import StaticFilesConfig +class ViteStaticFilesConfig(StaticFilesConfig): + ignore_patterns = ['CVS', '*~'] + class AppNameConfig(AppConfig): name = "app_name" diff --git a/app_name/context_processors.py b/app_name/context_processors.py index 64894345..e9b12bd5 100644 --- a/app_name/context_processors.py +++ b/app_name/context_processors.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.conf import settings diff --git a/app_name/models.py b/app_name/models.py index 844d86e6..59cb68aa 100644 --- a/app_name/models.py +++ b/app_name/models.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.db import models diff --git a/app_name/templates/index.html b/app_name/templates/index.html index f7efe62f..bf0ca7a9 100644 --- a/app_name/templates/index.html +++ b/app_name/templates/index.html @@ -17,7 +17,7 @@ + class="bg-body"> {% csrf_token %}
diff --git a/app_name/templatetags/vite.py b/app_name/templatetags/vite.py index a566644d..2b6e2667 100644 --- a/app_name/templatetags/vite.py +++ b/app_name/templatetags/vite.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 import os @@ -17,8 +17,8 @@ def vite_manifest(entries_names): # updated to support Vite 5 (.vite/manifest.json output) manifest_filepath = getattr( settings, - "VITE_MANIFEST_PATH", - os.path.join(os.sep, "static", ".vite", "manifest.json"), + 'VITE_MANIFEST_PATH', + os.path.join(os.sep, 'static', '.vite', 'manifest.json'), ) with open(manifest_filepath) as fp: @@ -36,13 +36,13 @@ def _process_entries(names): chunk = manifest[name] import_scripts, import_styles = _process_entries( - chunk.get("imports", []) + chunk.get('imports', []) ) scripts += import_scripts styles += import_styles - scripts += [chunk["file"]] - styles += [css for css in chunk.get("css", [])] + scripts += [chunk['file']] + styles += [css for css in chunk.get('css', [])] _processed.add(name) @@ -51,9 +51,9 @@ def _process_entries(names): return _process_entries(entries_names) -@register.simple_tag(name="vite_styles") +@register.simple_tag(name='vite_styles') def vite_styles(*entries_names): - """ + ''' Populate an html template with styles generated by vite Usage:: @@ -65,19 +65,19 @@ def vite_styles(*entries_names): ... {% vite_styles 'main.js' 'other-entry.js' %} - """ + ''' _, styles = vite_manifest(entries_names) styles = map(lambda href: static(href), styles) def as_link_tag(href): return f'' - return mark_safe("\n".join(map(as_link_tag, styles))) + return mark_safe('\n'.join(map(as_link_tag, styles))) -@register.simple_tag(name="vite_scripts") +@register.simple_tag(name='vite_scripts') def vite_scripts(*entries_names): - """ + ''' Populate an html template with script tags generated by vite Usage:: @@ -89,11 +89,11 @@ def vite_scripts(*entries_names): {% vite_scripts 'main.js' 'other-entry.js' %} - """ + ''' scripts, _ = vite_manifest(entries_names) scripts = map(lambda src: static(src), scripts) def as_script_tag(src): return f'' - return mark_safe("\n".join(map(as_script_tag, scripts))) + return mark_safe('\n'.join(map(as_script_tag, scripts))) diff --git a/app_name/tests/test_example.py b/app_name/tests/test_example.py index c11f7c24..6c2802a9 100644 --- a/app_name/tests/test_example.py +++ b/app_name/tests/test_example.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.test import TestCase diff --git a/app_name/tests/test_templatetags.py b/app_name/tests/test_templatetags.py index 9086bb40..04dfe30d 100644 --- a/app_name/tests/test_templatetags.py +++ b/app_name/tests/test_templatetags.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 import re diff --git a/app_name/urls.py b/app_name/urls.py index 1a617b0d..a1a39d24 100644 --- a/app_name/urls.py +++ b/app_name/urls.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.conf import settings diff --git a/app_name/views/pages.py b/app_name/views/pages.py index f9f1624f..98e53872 100644 --- a/app_name/views/pages.py +++ b/app_name/views/pages.py @@ -1,4 +1,4 @@ -# Copyright 2024 UW-IT, University of Washington +# Copyright 2025 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 from django.views.generic import TemplateView diff --git a/app_name_vue/main.js b/app_name_vue/main.js index 37bfb8b2..d82ad662 100644 --- a/app_name_vue/main.js +++ b/app_name_vue/main.js @@ -1,10 +1,8 @@ import { createApp } from "vue"; +import { createBootstrap } from "bootstrap-vue-next"; import { createPinia } from "pinia"; // import VueGtag from "vue-gtag-next"; -import { Vue3Mq, MqResponsive } from "vue3-mq"; - -// import solstice-vue -import SolsticeVue from "solstice-vue"; +import { Vue3Mq } from "vue3-mq"; import App from "@/app.vue"; import router from "@/router"; @@ -13,13 +11,15 @@ import router from "@/router"; import "bootstrap"; import "bootstrap-icons/font/bootstrap-icons.css"; -// bootstrap (all default bs styles) -// import "./css/basic.scss"; +// solstice bootstrap theme +import "solstice-theme/dist/solstice.scss"; -// bootstrap + solstice-vue -import "@/css/custom.scss"; +// solstice-vue comps import "solstice-vue/dist/style.css"; +// bootstrap-vue-next css +import "bootstrap-vue-next/dist/bootstrap-vue-next.css"; + const app = createApp(App); app.config.productionTip = false; @@ -47,14 +47,13 @@ app.use(VueGtag, { app.use(Vue3Mq, { preset: "bootstrap5", }); -app.component("mq-responsive", MqResponsive); // pinia (vuex) state management const pinia = createPinia(); app.use(pinia); -// solstice-vue -app.use(SolsticeVue); +// bootstrap-vue-next +app.use(createBootstrap()); // vue-router app.use(router); diff --git a/app_name_vue/pages/customize.vue b/app_name_vue/pages/customize.vue index be8ca504..ff87bced 100644 --- a/app_name_vue/pages/customize.vue +++ b/app_name_vue/pages/customize.vue @@ -126,11 +126,12 @@ import { formatPhoneNumber } from "@/utils/format"; export default { name: "PagesCustomize", - inject: ["mq"], + components: { DefaultLayout, HelloWorld, }, + inject: ["mq"], // setup() is needed for Composition API setup() { // instantiate composable diff --git a/app_name_vue/stores/hello.js b/app_name_vue/stores/hello.js index fcc71f74..3076765f 100644 --- a/app_name_vue/stores/hello.js +++ b/app_name_vue/stores/hello.js @@ -1,8 +1,6 @@ import { defineStore } from "pinia"; -export const useHelloStore = defineStore({ - // id is required so that Pinia can connect the store to the devtools - id: "hello", +export const useHelloStore = defineStore("hello", { state: () => ({ message: "Hello world, from the Pinia store!" }), getters: {}, actions: {}, diff --git a/docker/app_start.sh b/docker/app_start.sh index 7a11421b..11aa0da2 100644 --- a/docker/app_start.sh +++ b/docker/app_start.sh @@ -1,6 +1,6 @@ if [ "$ENV" = "localdev" ] then - . /scripts/app_deploy.sh + python manage.py migrate fi diff --git a/docker/settings.py b/docker/settings.py index a0e3a3bc..9b1fea87 100644 --- a/docker/settings.py +++ b/docker/settings.py @@ -1,37 +1,40 @@ from .base_settings import * INSTALLED_APPS += [ - "app_name.apps.AppNameConfig", + 'app_name.apps.AppNameConfig', + 'app_name.apps.ViteStaticFilesConfig', ] +INSTALLED_APPS.remove('django.contrib.staticfiles') + # If you have file data, define the path here -# DATA_ROOT = os.path.join(BASE_DIR, "app_name/data") +# DATA_ROOT = os.path.join(BASE_DIR, 'app_name/data') -GOOGLE_ANALYTICS_KEY = os.getenv("GOOGLE_ANALYTICS_KEY", default=" ") +GOOGLE_ANALYTICS_KEY = os.getenv('GOOGLE_ANALYTICS_KEY', default=' ') TEMPLATES = [ { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "APP_DIRS": True, - "OPTIONS": { - "debug": True, - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.contrib.messages.context_processors.messages", - "app_name.context_processors.google_analytics", - "app_name.context_processors.django_debug", - # "app_name.context_processors.auth_user", + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + 'OPTIONS': { + 'debug': True, + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + 'app_name.context_processors.google_analytics', + 'app_name.context_processors.django_debug', + # 'app_name.context_processors.auth_user', ], }, } ] -if os.getenv("ENV") == "localdev": +if os.getenv('ENV') == 'localdev': DEBUG = True VITE_MANIFEST_PATH = os.path.join( - BASE_DIR, "app_name", "static", ".vite", "manifest.json" + BASE_DIR, 'app_name', 'static', '.vite', 'manifest.json' ) else: - VITE_MANIFEST_PATH = os.path.join(os.sep, "static", ".vite", "manifest.json") + VITE_MANIFEST_PATH = os.path.join(os.sep, 'static', '.vite', 'manifest.json') diff --git a/docker/test.sh b/docker/test.sh index 035774c4..578ab341 100644 --- a/docker/test.sh +++ b/docker/test.sh @@ -13,13 +13,14 @@ function run_test { eval $1 } -run_test "pycodestyle ${DJANGO_APP}/ --exclude=migrations,static" - -if [ -d ${DJANGO_APP}/static/${DJANGO_APP}/js ]; then - run_test "jshint ${DJANGO_APP}/static/${DJANGO_APP}/js --verbose" -elif [ -d ${DJANGO_APP}/static/js ]; then - run_test "jshint ${DJANGO_APP}/static/js --verbose" -fi +# Moving to github action - remove this when successful +# run_test "pycodestyle ${DJANGO_APP}/ --exclude=migrations,static" +# +#if [ -d ${DJANGO_APP}/static/${DJANGO_APP}/js ]; then +# run_test "jshint ${DJANGO_APP}/static/${DJANGO_APP}/js --verbose" +#elif [ -d ${DJANGO_APP}/static/js ]; then +# run_test "jshint ${DJANGO_APP}/static/js --verbose" +#fi run_test "python -Wd -m coverage run --source=${DJANGO_APP} '--omit=*/migrations/*' manage.py test ${DJANGO_APP}" diff --git a/docker/urls.py b/docker/urls.py index 5b5bac8c..400f8792 100644 --- a/docker/urls.py +++ b/docker/urls.py @@ -2,4 +2,4 @@ from django.conf.urls import include from django.urls import re_path -urlpatterns += [re_path(r"^", include("app_name.urls"))] +urlpatterns += [re_path(r'^', include('app_name.urls'))] diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..375fe227 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,16 @@ +import pluginVue from "eslint-plugin-vue"; +import eslintConfigPrettier from "@vue/eslint-config-prettier"; + +export default [ + // add more generic rulesets here, such as: + // js.configs.recommended, + ...pluginVue.configs["flat/recommended"], + eslintConfigPrettier, + // ...pluginVue.configs['flat/vue2-recommended'], // Use this if you are using Vue.js 2.x. + { + rules: { + // override/add rules settings here, such as: + // 'vue/no-unused-vars': 'error' + }, + }, +]; diff --git a/package.json b/package.json index a0e10626..409a6783 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "watch": "vite build --watch --mode development", "test": "vitest --environment jsdom", "coverage": "vitest run --coverage", - "eslint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --ignore-path .gitignore", - "stylelint": "stylelint '**/*.{vue,scss}'" + "eslint": "eslint 'app_name_vue/**/*.{js,vue}'", + "stylelint": "stylelint 'app_name_vue/**/*.{vue,scss}'" }, "repository": { "type": "git", @@ -23,34 +23,37 @@ "homepage": "https://github.com/uw-it-aca/app_name#readme", "dependencies": { "@popperjs/core": "^2.11.8", - "axios": "^1.6.7", + "@vueuse/core": "^11.3.0", + "@vueuse/integrations": "^11.3.0", + "axios": "^1.7.9", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", - "pinia": "^2.1.7", - "solstice-vue": "github:uw-it-aca/solstice-vue#1.0.6", - "vue": "^3.4.21", + "bootstrap-vue-next": "^0.26.15", + "pinia": "^2.3.0", + "solstice-theme": "github:uw-it-aca/solstice-theme#1.0.2", + "solstice-vue": "github:uw-it-aca/solstice-vue#1.1.0", + "vue": "^3.5.13", "vue-gtag-next": "^1.14.0", - "vue-router": "^4.3.0", + "vue-router": "^4.5.0", "vue3-cookies": "^1.0.6", - "vue3-mq": "^3.2.0" + "vue3-mq": "^4.0.0" }, "devDependencies": { - "@rushstack/eslint-patch": "^1.7.2", - "@vitejs/plugin-vue": "^5.0.4", - "@vitest/coverage-v8": "^1.3.1", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/test-utils": "^2.4.4", - "eslint": "^8.57.0", - "eslint-plugin-vue": "^9.22.0", - "jsdom": "^24.0.0", - "postcss-html": "^1.6.0", - "prettier": "^3.2.5", - "sass": "^1.71.1", - "stylelint": "^16.2.1", - "stylelint-config-recommended-scss": "^14.0.0", + "@vitejs/plugin-vue": "^5.2.1", + "@vitest/coverage-v8": "^2.1.8", + "@vue/eslint-config-prettier": "^10.1.0", + "@vue/test-utils": "^2.4.6", + "eslint": "^9.17.0", + "eslint-plugin-vue": "^9.32.0", + "jsdom": "^25.0.1", + "postcss-html": "^1.7.0", + "prettier": "^3.4.2", + "sass": "^1.83.0", + "stylelint": "^16.12.0", + "stylelint-config-recommended-scss": "^14.1.0", "stylelint-config-recommended-vue": "^1.5.0", - "stylelint-config-standard-scss": "^13.0.0", - "vite": "^5.1.4", - "vitest": "^1.3.1" + "stylelint-config-standard-scss": "^14.0.0", + "vite": "^6.0.3", + "vitest": "^2.1.8" } } diff --git a/vite.config.js b/vite.config.js index d5fe14c0..3bd9046d 100644 --- a/vite.config.js +++ b/vite.config.js @@ -32,4 +32,12 @@ export default defineConfig({ "@": fileURLToPath(new URL("./app_name_vue", import.meta.url)), }, }, + css: { + preprocessorOptions: { + scss: { + quietDeps: true, + silenceDeprecations: ["global-builtin", "import"], // silence bootstrap5 related deprecations + }, + }, + }, });