├── templates └── vue │ ├── server │ ├── Deployment │ │ └── Azure │ │ │ ├── .gitignore │ │ │ ├── zip.sh │ │ │ ├── README.md │ │ │ └── app_service.sh │ ├── wwwroot │ │ ├── favicon.ico │ │ ├── img │ │ │ └── minics.png │ │ └── Content │ │ │ ├── Home │ │ │ ├── Community.md │ │ │ ├── ASPNet.md │ │ │ ├── Tailwind.md │ │ │ ├── MinimalAPI.md │ │ │ ├── Ecosystem.md │ │ │ ├── Documentation.md │ │ │ ├── Hero.md │ │ │ └── Tooling.md │ │ │ ├── About.md │ │ │ ├── Privacy.md │ │ │ └── Terms.md │ ├── appsettings.json │ ├── Makefile │ ├── appsettings.Development.json │ ├── .editorconfig │ ├── Tests │ │ ├── Content │ │ │ └── test.md │ │ └── ContentTests.cs │ ├── Program.cs │ ├── Api │ │ └── Content.cs │ ├── Properties │ │ └── launchSettings.json │ ├── .vscode │ │ ├── tasks.json │ │ └── launch.json │ ├── Data │ │ ├── Models │ │ │ └── Document.cs │ │ └── ContentLibrary.cs │ └── Vue.Starter.csproj │ ├── icon.png │ ├── app │ ├── src │ │ ├── style.css │ │ ├── components │ │ │ ├── Blocks │ │ │ │ ├── 1280.vue │ │ │ │ ├── Hero.vue │ │ │ │ └── Features.vue │ │ │ └── Nav │ │ │ │ ├── Global.vue │ │ │ │ └── Footer.vue │ │ ├── App.vue │ │ ├── main.js │ │ ├── views │ │ │ ├── AboutView.vue │ │ │ └── HomeView.vue │ │ ├── router │ │ │ └── index.js │ │ ├── composables │ │ │ └── seo.js │ │ └── stores │ │ │ ├── content.js │ │ │ └── site.js │ ├── .vscode │ │ └── extensions.json │ ├── public │ │ ├── favicon.ico │ │ └── img │ │ │ └── minics.png │ ├── postcss.config.js │ ├── tailwind.config.js │ ├── .gitignore │ ├── vite.config.js │ ├── index.html │ ├── package.json │ ├── README.md │ └── package-lock.json │ ├── package.json │ ├── .template.config │ └── template.json │ ├── Dockerfile │ ├── README.md │ └── .gitignore ├── Makefile ├── CODE-OF-CONDUCT.md ├── README.md ├── LICENSE ├── VueStarterTemplate.csproj └── .gitignore /templates/vue/server/Deployment/Azure/.gitignore: -------------------------------------------------------------------------------- 1 | ./deploy.zip -------------------------------------------------------------------------------- /templates/vue/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robconery/Vue.Starter/HEAD/templates/vue/icon.png -------------------------------------------------------------------------------- /templates/vue/app/src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | -------------------------------------------------------------------------------- /templates/vue/app/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /templates/vue/app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robconery/Vue.Starter/HEAD/templates/vue/app/public/favicon.ico -------------------------------------------------------------------------------- /templates/vue/app/public/img/minics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robconery/Vue.Starter/HEAD/templates/vue/app/public/img/minics.png -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robconery/Vue.Starter/HEAD/templates/vue/server/wwwroot/favicon.ico -------------------------------------------------------------------------------- /templates/vue/app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/img/minics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robconery/Vue.Starter/HEAD/templates/vue/server/wwwroot/img/minics.png -------------------------------------------------------------------------------- /templates/vue/app/src/components/Blocks/1280.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | pack: 2 | dotnet pack 3 | 4 | template_dir: 5 | mkdir "templates/vue/.template.config" 6 | 7 | template_config: 8 | touch "templates/vue/.template.config/template.json" -------------------------------------------------------------------------------- /templates/vue/app/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{vue,js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } -------------------------------------------------------------------------------- /templates/vue/server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*" 10 | } 11 | -------------------------------------------------------------------------------- /CODE-OF-CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | This project has adopted the code of conduct defined by the Contributor Covenant 4 | to clarify expected behavior in our community. 5 | 6 | For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Community.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Community 3 | icon: fa-solid fa-users-line 4 | index: 4 5 | --- 6 | 7 | Stuck? Ask your question on [Vue Land](https://chat.vuejs.org/), our official Discord server, or [StackOverflow](https://stackoverflow.com/questions/tagged/vue.js). -------------------------------------------------------------------------------- /templates/vue/server/Makefile: -------------------------------------------------------------------------------- 1 | DEPLOY="./Deployment/azure/zip.sh" 2 | LOGS="./Deployment/azure/logs.sh" 3 | APP_SERVICE="./Deployment/Azure/app_service.sh" 4 | 5 | zip: 6 | source $(DEPLOY) 7 | 8 | logs: 9 | source $(LOGS) 10 | 11 | app_service: 12 | source $(APP_SERVICE) 13 | 14 | .phony: zip app_service logs -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/ASPNet.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ASP.NET Help 3 | icon: fa-regular fa-star 4 | index: 5 5 | --- 6 | 7 | You have a full-featured ASP.NET web application behind this beautiful frontend, powered by C#! If you have any questions or need some help, [start right here](https://dotnet.microsoft.com/en-us/apps/aspnet). -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Tailwind.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tailwind CSS 3 | image: https://source.unsplash.com/random 4 | --- 5 | 6 | Tailwind is a utility-first CSS framework that is rapidly gaining popularity due to its ease of use. There's a bit of a learning curve, but it's well documented with strong examples and ready-made components. -------------------------------------------------------------------------------- /templates/vue/server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.AspNetCore.SpaProxy": "Information", 7 | "Microsoft.Hosting.Lifetime": "Information" 8 | } 9 | }, 10 | "ContentDirectory": { 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/MinimalAPI.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Minimal API 3 | icon: fa-solid fa-rocket 4 | index: 6 5 | --- 6 | 7 | [Minimal API](https://minimal-apis.github.io/) is a lean, focused implementation of ASP.NET that users of Express, Sinatra or Flask will appreciate. You have the power of C# and only the API bits you need from ASP.NET. -------------------------------------------------------------------------------- /templates/vue/app/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Ecosystem.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ecosystem 3 | icon: fa-brands fa-rebel 4 | index: 3 5 | --- 6 | 7 | Get official tools and libraries for your project: [Pinia](https://pinia.vuejs.org/) and [Vue Dev Tools](https://github.com/vuejs/devtools). If you need more resources, we suggest paying [Awesome Vue](https://github.com/vuejs/awesome-vue) a visit. -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Documentation 3 | icon: fa-solid fa-book 4 | index: 1 5 | --- 6 | 7 | Vue’s [official documentation](https://vuejs.org/) provides you with all information you need to get started. ASP.NET and Minimal API [tutorials can be found here](https://minimal-apis.github.io/quickstart/), with tons of goodness to help get you off the ground. -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Hero.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Welcome to the ASP.NET Minimal API/Vue 3 Starter Kit 3 | image: https://dummyimage.com/720x600 4 | --- 5 | 6 | Working with ASP.NET and Vue 3 is simple and fun with this starter template. Get off the ground quickly with [ASP.NET Minimal API](https://minimal-apis.github.io/), [Vue 3](https://vuejs.org) and [Tailwind CSS](https://tailwindcss.com). -------------------------------------------------------------------------------- /templates/vue/server/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false 13 | 14 | [{Makefile,**.mk}] 15 | # Use tabs for indentation (Makefiles require tabs) 16 | indent_style = tab -------------------------------------------------------------------------------- /templates/vue/app/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import { createHead } from "@vueuse/head" //for SEO and meta data 4 | 5 | import App from './App.vue' 6 | import router from './router' 7 | 8 | //tailwind 9 | import './style.css' 10 | 11 | const app = createApp(App) 12 | 13 | app.use(createPinia()) 14 | app.use(createHead()); 15 | app.use(router) 16 | 17 | app.mount('#app') 18 | -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Home/Tooling.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tooling 3 | icon: fa-solid fa-screwdriver-wrench 4 | index: 2 5 | --- 6 | 7 | This project is served and bundled with [Vite](https://vitejs.dev/guide/features.html) as the frontend server. The recommended IDE setup is [VSCode](https://code.visualstudio.com/) + [Volar](https://github.com/johnsoncodehk/volar). If you need to test your components and web pages, check out [Playwright](https://playwright.dev), which is set up for you. -------------------------------------------------------------------------------- /templates/vue/app/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | test-results/ 31 | playwright-report/ 32 | -------------------------------------------------------------------------------- /templates/vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minimal", 3 | "version": "1.0.0", 4 | "description": "Hello and welcome to the ASP.NET Vue Starter Template with ASP.NET Minimal API and Vue 3.0. The only things this template contains are:", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "dotnet watch --project ./server", 8 | "start": "dotnet run --project ./server", 9 | "postinstall": "cd app && npm install" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC" 14 | } 15 | -------------------------------------------------------------------------------- /templates/vue/server/Tests/Content/test.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: A Test Document 3 | icon: book 4 | summary: This is a summary that will be used by search 5 | index: 1 6 | image: image/image.png 7 | category: tests 8 | tags: 9 | - fun 10 | - test 11 | - asp 12 | --- 13 | 14 | ## Title 15 | 16 | Ut incididunt pariatur cillum voluptate velit ipsum. Reprehenderit voluptate culpa laboris amet veniam ullamco nulla. Sit excepteur fugiat do esse irure veniam officia ad labore laboris laborum. 17 | 18 | - list 19 | - more 20 | - stuff -------------------------------------------------------------------------------- /templates/vue/app/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [vue()], 9 | resolve: { 10 | alias: { 11 | '@': fileURLToPath(new URL('./src', import.meta.url)) 12 | } 13 | }, 14 | server:{ 15 | port: 3000 16 | }, 17 | // build: { 18 | // outDir: "../server/wwwroot/", 19 | // emptyOutDir: true 20 | // } 21 | }) 22 | -------------------------------------------------------------------------------- /templates/vue/server/Deployment/Azure/zip.sh: -------------------------------------------------------------------------------- 1 | rm ./Deployment/Azure/deploy.zip 2 | rm -R bin/Release 3 | dotnet publish --configuration Release 4 | cd bin/Release/net7.0/publish/ 5 | zip -r ../../../../Deployment/Azure/deploy.zip . -q 6 | cd - 7 | az webapp deployment source config-zip --resource-group vue-starter --name vue-starter-2298 --src ./Deployment/Azure/deploy.zip 8 | open https://vue-starter-2298.azurewebsites.net 9 | echo 'Site is published 🎉 watching logs. It takes 60 seconds or so to refresh...' 10 | az webapp log tail -n vue-starter-2298 -g vue-starter 11 | -------------------------------------------------------------------------------- /templates/vue/app/src/views/AboutView.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | -------------------------------------------------------------------------------- /templates/vue/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | The Minimal CS | Vue 3 Starter 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/About.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About This Site 3 | icon: fa-solid fa-screwdriver-wrench 4 | --- 5 | 6 | ## Lorem Ipsum 7 | Consectetur aliquip duis eu et est. Exercitation duis ad excepteur sunt magna veniam. 8 | 9 | ## Irure et Velit 10 | Irure et velit ut sint pariatur duis magna deserunt ad proident exercitation culpa. 11 | 12 | ## Anim Exceptur 13 | Anim excepteur qui excepteur ipsum irure dolore ea ipsum sint veniam. Amet cupidatat proident sunt in eiusmod Lorem velit culpa consequat amet labore consequat. 14 | 15 | ## Sit Lorem 16 | Sit Lorem pariatur ea laboris et esse officia. Id laboris deserunt ut enim deserunt. -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Privacy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Our Privacy Policy 3 | icon: fa-solid fa-screwdriver-wrench 4 | --- 5 | 6 | ## Lorem Ipsum 7 | Consectetur aliquip duis eu et est. Exercitation duis ad excepteur sunt magna veniam. 8 | 9 | ## Irure et Velit 10 | Irure et velit ut sint pariatur duis magna deserunt ad proident exercitation culpa. 11 | 12 | ## Anim Exceptur 13 | Anim excepteur qui excepteur ipsum irure dolore ea ipsum sint veniam. Amet cupidatat proident sunt in eiusmod Lorem velit culpa consequat amet labore consequat. 14 | 15 | ## Sit Lorem 16 | Sit Lorem pariatur ea laboris et esse officia. Id laboris deserunt ut enim deserunt. -------------------------------------------------------------------------------- /templates/vue/server/wwwroot/Content/Terms.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Terms and Conditions 3 | icon: fa-solid fa-screwdriver-wrench 4 | --- 5 | 6 | ## Lorem Ipsum 7 | Consectetur aliquip duis eu et est. Exercitation duis ad excepteur sunt magna veniam. 8 | 9 | ## Irure et Velit 10 | Irure et velit ut sint pariatur duis magna deserunt ad proident exercitation culpa. 11 | 12 | ## Anim Exceptur 13 | Anim excepteur qui excepteur ipsum irure dolore ea ipsum sint veniam. Amet cupidatat proident sunt in eiusmod Lorem velit culpa consequat amet labore consequat. 14 | 15 | ## Sit Lorem 16 | Sit Lorem pariatur ea laboris et esse officia. Id laboris deserunt ut enim deserunt. -------------------------------------------------------------------------------- /templates/vue/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app2", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "test:e2e": "playwright test" 10 | }, 11 | "dependencies": { 12 | "@vueuse/head": "^1.1.15", 13 | "pinia": "^2.0.26", 14 | "vue": "^3.2.45", 15 | "vue-router": "^4.1.6" 16 | }, 17 | "devDependencies": { 18 | "@playwright/test": "^1.28.1", 19 | "@vitejs/plugin-vue": "^3.2.0", 20 | "autoprefixer": "^10.4.13", 21 | "postcss": "^8.4.21", 22 | "tailwindcss": "^3.2.7", 23 | "vite": "^3.2.4" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /templates/vue/server/Program.cs: -------------------------------------------------------------------------------- 1 | using Vue.Starter.Data; 2 | 3 | var builder = WebApplication.CreateBuilder(args); 4 | builder.Services.AddCors(); 5 | 6 | var app = builder.Build(); 7 | app.UseStaticFiles(); 8 | app.MapFallbackToFile("index.html"); 9 | 10 | var libPath = Path.Combine(app.Environment.WebRootPath, "Content"); 11 | var contentLibrary = new ContentLibrary(libPath).Load(); 12 | 13 | app.UseCors(builder => builder 14 | .AllowAnyOrigin() 15 | .AllowAnyMethod() 16 | .AllowAnyHeader() 17 | ); 18 | 19 | //load the routes 20 | Vue.Starter.Api.Content.MapRoutes(app, contentLibrary); 21 | app.Run(); 22 | 23 | //this is for tests 24 | public partial class Program { } -------------------------------------------------------------------------------- /templates/vue/app/src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import HomeView from '../views/HomeView.vue' 3 | 4 | const router = createRouter({ 5 | history: createWebHistory(import.meta.env.BASE_URL), 6 | routes: [ 7 | { 8 | path: '/', 9 | name: 'home', 10 | component: HomeView 11 | }, 12 | { 13 | path: '/about', 14 | name: 'about', 15 | // route level code-splitting 16 | // this generates a separate chunk (About.[hash].js) for this route 17 | // which is lazy-loaded when the route is visited. 18 | component: () => import('../views/AboutView.vue') 19 | } 20 | ] 21 | }) 22 | 23 | export default router 24 | -------------------------------------------------------------------------------- /templates/vue/server/Api/Content.cs: -------------------------------------------------------------------------------- 1 | namespace Vue.Starter.Api; 2 | using Vue.Starter.Data; 3 | 4 | public static class Content{ 5 | 6 | public static void MapRoutes(IEndpointRouteBuilder app, ContentLibrary lib) 7 | { 8 | 9 | app.MapGet("api/about/", () => lib.Documents.First(d => d.Slug == "About")); 10 | app.MapGet("api/terms/", () => lib.Documents.First(d => d.Slug == "Terms")); 11 | app.MapGet("api/privacy/", () => lib.Documents.First(d => d.Slug == "Privacy")); 12 | 13 | //you can separate these into their own methods if you need to 14 | //the / route launches the SPA Proxy so you won't see it 15 | app.MapGet("api/content/{dir}", (string dir) => { 16 | var docs = lib.Documents.Where(d => d.Directory.ToLower() == dir.ToLower()); 17 | return docs; 18 | }); 19 | 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## The ASP.NET Vue Starter Template 2 | 3 | This is the starter template for ASP.NET and Vue, which will hopefully get you off the ground quickly. Further instructions for how to use this template are in `templates/README.md`. 4 | 5 | To install this template, simply: 6 | 7 | ``` 8 | dotnet new install Vue.Web.Starter 9 | ``` 10 | 11 | Which will allow you to: 12 | 13 | ``` 14 | dotnet new vue 15 | ``` 16 | 17 | ## Documentation and Help 18 | 19 | There are READMEs throughout the codebase and, hopefully, enough to go on there. At the end of the day it's a Minimal API + Vue 3 application and you can find links to the documentation for those in the READMEs. 20 | 21 | ## Questions? 22 | 23 | I haven't created a discussion board for this app just yet but I can if people are interested. Otherwise feel free to leave an issue. 24 | -------------------------------------------------------------------------------- /templates/vue/.template.config/template.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/template", 3 | "description": "An ASP.NET Minimal API with Vue 3", 4 | "defaultName" : "Vue.Starter", 5 | "repository": { 6 | "url": "https://github.com/robconery/Vue.Starter", 7 | "type": "GitHub" 8 | }, 9 | "projectURL": "https://github.com/robconery/Vue.Starter", 10 | "releaseNotes": "Separated client and server projects, added Minimal API with a simple Markdown CMS", 11 | "author": "Rob Conery", 12 | "classifications": [ "Web Application" ], 13 | "name": "ASP.NET Minimal API with Vue 3", 14 | "identity": "Microsoft.Web.Vue3", 15 | "shortName": "vue", 16 | "tags": { 17 | "language": "Web", 18 | "type":"project" 19 | }, 20 | "sourceName": "Vue.Starter", 21 | "preferNameDirectory":true 22 | } -------------------------------------------------------------------------------- /templates/vue/app/src/views/HomeView.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 33 | -------------------------------------------------------------------------------- /templates/vue/server/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:8000", 7 | "sslPort": 44305 8 | } 9 | }, 10 | "profiles": { 11 | "http": { 12 | "commandName": "Project", 13 | "dotnetRunMessages": true, 14 | "launchBrowser": true, 15 | "applicationUrl": "http://localhost:8000", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development", 18 | "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy" 19 | } 20 | }, 21 | "IIS Express": { 22 | "commandName": "IISExpress", 23 | "launchBrowser": true, 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development", 26 | "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /templates/vue/Dockerfile: -------------------------------------------------------------------------------- 1 | # This is a multi-stage build so we'll start with a Node image 2 | FROM node:latest AS node_base 3 | RUN echo "NODE Version:" && node --version 4 | RUN echo "NPM Version:" && npm --version 5 | 6 | # Now create a .NET image 7 | FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env 8 | 9 | # Copy the node into the .NET image 10 | COPY --from=node_base . . 11 | 12 | # The default app directory for Linux and .NET 13 | # this is not the same as our project's /app 14 | WORKDIR /App 15 | 16 | # Copy everything - both /app and /server 17 | COPY . ./ 18 | 19 | # change into the server directory we need to run a few commands 20 | WORKDIR /App/server 21 | 22 | # Restore as distinct layers 23 | RUN dotnet restore 24 | 25 | # Build and publish a release 26 | RUN dotnet publish -c Release -o out 27 | 28 | # Build runtime image 29 | FROM mcr.microsoft.com/dotnet/aspnet:7.0 30 | 31 | WORKDIR /App 32 | COPY --from=build-env /App/server/out . 33 | EXPOSE 80 34 | 35 | ENTRYPOINT ["dotnet", "Vue.Starter.dll"] 36 | 37 | -------------------------------------------------------------------------------- /templates/vue/server/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "build", 6 | "command": "dotnet", 7 | "type": "process", 8 | "args": [ 9 | "build", 10 | "${workspaceFolder}/Contoso.csproj", 11 | "/property:GenerateFullPaths=true", 12 | "/consoleloggerparameters:NoSummary" 13 | ], 14 | "problemMatcher": "$msCompile" 15 | }, 16 | { 17 | "label": "publish", 18 | "command": "dotnet", 19 | "type": "process", 20 | "args": [ 21 | "publish", 22 | "${workspaceFolder}/Contoso.csproj", 23 | "/property:GenerateFullPaths=true", 24 | "/consoleloggerparameters:NoSummary" 25 | ], 26 | "problemMatcher": "$msCompile" 27 | }, 28 | { 29 | "label": "watch", 30 | "command": "dotnet", 31 | "type": "process", 32 | "args": [ 33 | "watch", 34 | "run", 35 | "--project", 36 | "${workspaceFolder}/Contoso.csproj" 37 | ], 38 | "problemMatcher": "$msCompile" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Vue Starter Template 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /templates/vue/app/src/components/Nav/Global.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /VueStarterTemplate.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIT 5 | true 6 | content/templates/vue/README.md 7 | content/templates/vue/icon.png 8 | Template 9 | 1.1.8 10 | Vue.Web.Starter 11 | ASP.NET Core with Vue 3 12 | Rob Conery 13 | ASP.NET Core Web Application with Vue 3 14 | dotnet-new;templates;mvc;web;vue 15 | net7.0 16 | true 17 | false 18 | content 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /templates/vue/app/src/composables/seo.js: -------------------------------------------------------------------------------- 1 | import { useHead } from 'unhead' 2 | export function useSeo({title, description, image}){ 3 | 4 | const bits = [ 5 | {hid: "title", name: "title", content: title}, 6 | {hid: "description", name: "description", content: description}, 7 | {hid: "og:title", name: "og:title", content: title}, 8 | {hid: "og:description", name: "og:description", content: description}, 9 | {hid: "og:image", name: "og:image", content: `https://localhost:3000/images/${image}`}, 10 | //set this when you know your site's root 11 | // {hid: "og:url", name: "og:url", content: `https://localhost:3000/${route.path}`}, 12 | {hid: "twitter:title", name: "twitter:title", content: title}, 13 | {hid: "twitter:description", name: "twitter:description", content: description}, 14 | {hid: "twitter:image", name: "twitter:image", content: `https://localhost:3000/images/${image}`}, 15 | {hid: "twitter:creator", name: "twitter:creator", content: "@robconery"}, 16 | {hid: "twitter:site", name: "twitter:site", content: "@robconery"}, 17 | {hid: "twitter:card", name: "twitter:card", content: "summary_large_image"} 18 | ] 19 | 20 | useHead({title: `${title} | Vue Starter`, description: description}, bits); 21 | } -------------------------------------------------------------------------------- /templates/vue/server/Data/Models/Document.cs: -------------------------------------------------------------------------------- 1 | 2 | using YamlDotNet.Serialization; 3 | namespace Vue.Starter.Data.Models 4 | { 5 | public class Document 6 | { 7 | public Document() 8 | { 9 | 10 | } 11 | public string Directory { get; set; } 12 | public string Path { get; set; } 13 | public string Slug { get; set; } 14 | public DateTime CreatedAt { get; set; } 15 | public string HTML { get; set; } 16 | public string RawText { get; set; } 17 | [YamlMember(Alias = "title")] 18 | public string Title{ get; set; } 19 | [YamlMember(Alias = "summary")] 20 | public string Summary{ get; set; } 21 | [YamlMember(Alias = "index")] 22 | public int Index{ get; set; } 23 | [YamlMember(Alias = "icon")] 24 | public string Icon{ get; set; } 25 | [YamlMember(Alias = "image")] 26 | public string Image { get; set; } 27 | [YamlMember(Alias = "category")] 28 | public string Category { get; set; } 29 | [YamlMember(Alias = "tags")] 30 | public string[] Tags { get; set; } 31 | [YamlMember(Alias = "lede")] 32 | public string Lede { get; set; } 33 | [YamlMember(Alias = "cta")] 34 | public string CallToAction { get; set; } 35 | [YamlMember(Alias = "link")] 36 | public string Link { get; set; } 37 | } 38 | } -------------------------------------------------------------------------------- /templates/vue/app/src/components/Blocks/Hero.vue: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /templates/vue/server/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | // Use IntelliSense to find out which attributes exist for C# debugging 6 | // Use hover for the description of the existing attributes 7 | // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md 8 | "name": ".NET Core Launch (web)", 9 | "type": "coreclr", 10 | "request": "launch", 11 | "preLaunchTask": "build", 12 | // If you have changed target frameworks, make sure to update the program path. 13 | "program": "${workspaceFolder}/bin/Debug/net7.0/Contoso.dll", 14 | "args": [], 15 | "cwd": "${workspaceFolder}", 16 | "stopAtEntry": false, 17 | // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser 18 | "serverReadyAction": { 19 | "action": "openExternally", 20 | "pattern": "\\bNow listening on:\\s+(https?://\\S+)" 21 | }, 22 | "env": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | }, 25 | "sourceFileMap": { 26 | "/Views": "${workspaceFolder}/Views" 27 | } 28 | }, 29 | { 30 | "name": ".NET Core Attach", 31 | "type": "coreclr", 32 | "request": "attach" 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /templates/vue/app/src/stores/content.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useContentStore = defineStore('content', { 4 | state(){ 5 | return { 6 | documents: {}, 7 | document: null, 8 | } 9 | }, 10 | getters:{ 11 | dummyDocument(){ 12 | return { 13 | title: "Lorem Ipsum", 14 | html: "Velit tempor ea laboris velit anim ad exercitation do qui veniam. In anim laborum qui duis ullamco sit reprehenderit adipisicing ullamco reprehenderit dolore dolore. Duis veniam ullamco commodo reprehenderit laboris sit. Et incididunt ea magna excepteur ullamco dolore culpa in. Deserunt minim voluptate culpa Lorem nulla in velit.", 15 | image: `https://dummyimage.com/540x460`, 16 | link: "#" 17 | } 18 | } 19 | }, 20 | actions:{ 21 | async getDocuments(path){ 22 | const endpoint = location.hostname.indexOf("localhost") >=0 ? "http://localhost:8000/api/content" : "/api/content" 23 | try{ 24 | this.documents.length = 0; 25 | const url = `${endpoint}/${path}`; 26 | //TODO: Change this for production 27 | const res = await fetch(url); 28 | const docs = await res.json(); 29 | //keep things reactive 30 | docs.forEach(d => { 31 | this.documents[d.slug.toLowerCase()] = d; 32 | }); 33 | }catch(err){ 34 | console.error(err); 35 | } 36 | 37 | } 38 | } 39 | }); 40 | -------------------------------------------------------------------------------- /templates/vue/app/README.md: -------------------------------------------------------------------------------- 1 | # The ASP.NET/Vue Client Application 2 | 3 | This template should help get you started developing with Vue 3, Vite and ASP.NET. You can run this application in isolation (from the API) using `npm run dev` in this directory. 4 | 5 | You can run it alongside the API if you run `npm run dev` in the root. 6 | 7 | ## Recommended IDE Setup 8 | 9 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 10 | 11 | ## Customize configuration 12 | 13 | See [Vite Configuration Reference](https://vitejs.dev/config/). 14 | 15 | ## Project Setup 16 | 17 | ```sh 18 | npm install 19 | ``` 20 | 21 | ### Compile and Hot-Reload for Development 22 | 23 | ```sh 24 | npm run dev 25 | ``` 26 | 27 | ## Build and Deployment 28 | 29 | The ASP.NET Minimal API project has build settings configured to build your client app for production when you run `dotnet publish` or `dotnet build`. This client app will be compiled and the output in `/dist` will be copied over to `wwwroot` of the API. 30 | 31 | Deployment scripts are setup for you in `/Deployment` and come preconfigured for Azure deployment or Docker deployment. 32 | 33 | ## Questions? Issues? 34 | 35 | Please visit the GitHub repo if you have any questions or concerns. As always, we would love an Issue report if you've found a bug or, better yet, a PR with a fix! 36 | 37 | Issue first, please, so we can be sure the PR will fit. -------------------------------------------------------------------------------- /templates/vue/app/src/components/Blocks/Features.vue: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /templates/vue/app/src/stores/site.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useSiteStore = defineStore('site', { 4 | state(){ 5 | return { 6 | topNav: [ 7 | {name: "Home", url: "/"}, 8 | {name: "About", url: "/about/"}, 9 | ], 10 | social: [ 11 | {name: "Mastodon", url: "https://hachyderm.io/@robconery", icon: "fa fa-mastodon"}, 12 | {name: "Blog", url: "https://asp.net", icon: ""}, 13 | {name: "Docs", url: "https://hachyderm.io/@robconery", icon: "fa fa-book"}, 14 | {name: "GitHub", url: "https://hachyderm.io/@robconery", icon: "fa fa-github"}, 15 | ], 16 | footerNav: { 17 | categories: [ 18 | { 19 | name: "Categories", links: [ 20 | {name: "First", url: "#"}, 21 | {name: "Second", url: "#"}, 22 | {name: "Third", url: "#"}, 23 | {name: "Fourth", url: "#"}, 24 | ], 25 | },{ 26 | name: "Categories", links: [ 27 | {name: "First", url: "#"}, 28 | {name: "Second", url: "#"}, 29 | {name: "Third", url: "#"}, 30 | {name: "Fourth", url: "#"}, 31 | ], 32 | },{ 33 | name: "Categories", links: [ 34 | {name: "First", url: "#"}, 35 | {name: "Second", url: "#"}, 36 | {name: "Third", url: "#"}, 37 | {name: "Fourth", url: "#"}, 38 | ], 39 | } 40 | ] 41 | } 42 | } 43 | }, 44 | getters : { 45 | contentEndpoint(){ 46 | return location.hostname.indexOf("localhost") >=0 ? "http://localhost:8000/api/content" : "/api/content" 47 | } 48 | } 49 | }); -------------------------------------------------------------------------------- /templates/vue/server/Tests/ContentTests.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | using Vue.Starter.Data; 3 | using Vue.Starter.Data.Models; 4 | namespace Contoso.Tests; 5 | 6 | public class ContentTests { 7 | ContentLibrary _lib; 8 | Document _doc; 9 | public ContentTests() 10 | { 11 | _lib = new ContentLibrary("../../../Tests/Content").Load(); 12 | _doc = _lib.Documents.First(); 13 | } 14 | [Fact] 15 | public void The_libray_loads_up_docs() 16 | { 17 | //there should be one doc in there 18 | Assert.Equal(_lib.Documents.Count, 1); 19 | } 20 | [Fact] 21 | public void The_test_doc_has_html() 22 | { 23 | Assert.NotNull(_doc.HTML); 24 | } 25 | [Fact] 26 | public void Doc_directory_is_Content() 27 | { 28 | Assert.Equal("Content",_doc.Directory); 29 | } 30 | [Fact] 31 | public void Doc_slug_is_test() 32 | { 33 | Assert.Equal("test",_doc.Slug); 34 | } 35 | [Fact] 36 | public void Doc_title_is_A_Test_Document() 37 | { 38 | Assert.Equal("A Test Document",_doc.Title); 39 | } 40 | [Fact] 41 | public void Doc_icon_is_book() 42 | { 43 | Assert.Equal("book",_doc.Icon); 44 | } 45 | [Fact] 46 | public void Doc_image_is_image_png() 47 | { 48 | Assert.Equal("image/image.png",_doc.Image); 49 | } 50 | [Fact] 51 | public void Doc_category_is_tests() 52 | { 53 | Assert.Equal("tests",_doc.Category); 54 | } 55 | [Fact] 56 | public void Doc_has_three_tags() 57 | { 58 | Assert.Equal(3,_doc.Tags.Count()); 59 | } 60 | [Fact] 61 | public void Doc_has_summary() 62 | { 63 | Assert.True(_doc.Summary.Contains("This is a summary")); 64 | } 65 | [Fact] 66 | public void FuzzySearch_returns_our_document() 67 | { 68 | var found = _lib.FuzzySearch("summary"); 69 | Assert.Equal(1, found.Count()); 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /templates/vue/server/Deployment/Azure/README.md: -------------------------------------------------------------------------------- 1 | # Azure Deployment Scripts 2 | 3 | In this directory are deployment scripts ready to use. This requires that you have the Azure CLI installed (`az`) and are logged in to the account you want to deploy with. 4 | 5 | ## Setting up your Azure Resources 6 | 7 | To run this application you need a web server that runs .NET 7, that's it. Node is not required as all of the front end components are built during `dotnet build`, which happens when you `dotnet publish`. 8 | 9 | For convenience, we've added a setup script in this here directory called `app_service.sh`, which is a script that creates the necessary services on Azure for you. 10 | 11 | From the server project root: 12 | 13 | ``` 14 | source ./Deployment/Azure/app_service.sh 15 | ``` 16 | 17 | Please have a read and change things as you need **before you run this script**. It will run in Powershell as well as bash and the only thing you need to do is **change the variables at the top**. 18 | 19 | ## Deploying 20 | 21 | When you run the `app_service.sh` script, a second script will be created for you called `zip.sh`. This is how your code will end up on Azure hardware: it's zipped up and pushed: 22 | 23 | ``` 24 | source ./Deployment/Azure/zip.sh 25 | ``` 26 | 27 | For fun and convenience we've added a Makefile which will execute this for you: 28 | 29 | ``` 30 | make app_service && make 31 | ``` 32 | 33 | Yay for Make! 34 | 35 | ## What's going on during deployment 36 | 37 | Once everything is ready to go (after `dotnet publish`) your deployment artifacts will be located in `/bin/Release/net7.0/publish`, which includes the Vue application, which is built along with the ASP.NET application. 38 | 39 | The built Vue application is located in `wwwroot` in that directory which is where it needs to live. 40 | 41 | This entire directory is being zipped up and pushed to Azure and once that's done, a browser will open to your site's directory and the logs for the application will be streamed for you so you know what's going on. 42 | 43 | If there are any problems you can drop all of your resources using `az group delete -n [NAME]` where `NAME` is the resource group name you came up with (`RG` in the script). 44 | 45 | Have fun! 46 | 47 | -------------------------------------------------------------------------------- /templates/vue/app/src/components/Nav/Footer.vue: -------------------------------------------------------------------------------- 1 | 51 | -------------------------------------------------------------------------------- /templates/vue/server/Vue.Starter.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | ../app/ 8 | $(DefaultItemExcludes);$(SpaRoot)node_modules\** 9 | http://localhost:3000 10 | npm run dev 11 | enable 12 | true 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | runtime; build; native; contentfiles; analyzers; buildtransitive 31 | all 32 | 33 | 34 | runtime; build; native; contentfiles; analyzers; buildtransitive 35 | all 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | wwwroot\%(RecursiveDir)%(FileName)%(Extension) 56 | PreserveNewest 57 | true 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /templates/vue/server/Data/ContentLibrary.cs: -------------------------------------------------------------------------------- 1 | using Markdig; 2 | using Markdig.Parsers; 3 | using Markdig.Renderers; 4 | using Vue.Starter.Data.Models; 5 | using YamlDotNet.Serialization; 6 | using YamlDotNet.Core; 7 | using YamlDotNet.Core.Events; 8 | 9 | namespace Vue.Starter.Data; 10 | // ... 11 | // This is a simple in-memory Markdown "server", if you will. 12 | public class ContentLibrary 13 | { 14 | public IList Documents { get; set; } = new List(); 15 | //The location of the document directory on disk, releative to the root 16 | public string Library { get; set; } 17 | //override the default library location 18 | public ContentLibrary(string library) 19 | { 20 | this.Library = library; 21 | } 22 | //Only runs a fuzzy wildcard on summary 23 | public IEnumerable FuzzySearch(string term){ 24 | if(term.Count() < 3){ 25 | throw new InvalidOperationException("The term should be more than three characters"); 26 | } 27 | return this.Documents.Where(d => d.Summary.ToLower().Contains(term.ToLower())); 28 | } 29 | //Reads the documents on disk, parses and loads the IList 30 | public ContentLibrary Load(){ 31 | var result = new List(); 32 | //HACK: figure out how to make this less hard-codey 33 | foreach (string file in Directory.EnumerateFiles(this.Library, "*.md", SearchOption.AllDirectories)) 34 | { 35 | 36 | var text = File.ReadAllText(file); 37 | 38 | Document doc; 39 | var yamler = new DeserializerBuilder().IgnoreUnmatchedProperties().Build(); 40 | 41 | using (var input = new StringReader(text)) 42 | { 43 | var parser = new Parser(input); 44 | parser.Consume(); 45 | parser.Consume(); 46 | doc = yamler.Deserialize(parser); 47 | parser.Consume(); 48 | } 49 | 50 | 51 | var pipe = new MarkdownPipelineBuilder() 52 | .UseYamlFrontMatter() 53 | .UseCustomContainers() 54 | .UseEmphasisExtras() 55 | .UseGridTables() 56 | .UseMediaLinks() 57 | .UsePipeTables() 58 | .UseGenericAttributes() // Must be last as it is one parser that is modifying other parsers 59 | .Build(); 60 | 61 | //TODO: Refactor and separate 62 | var writer = new StringWriter(); 63 | var renderer = new HtmlRenderer(writer); 64 | pipe.Setup(renderer); 65 | 66 | var parsed = MarkdownParser.Parse(text,pipe); 67 | var rendered = renderer.Render(parsed); 68 | writer.Flush(); 69 | 70 | doc.HTML = writer.ToString(); 71 | doc.CreatedAt = DateTime.Now; 72 | doc.Directory = Directory.GetParent(file).Name; 73 | doc.Slug = Path.GetFileNameWithoutExtension(file); 74 | 75 | //add it! 76 | this.Documents.Add(doc); 77 | } 78 | return this; 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /templates/vue/server/Deployment/Azure/app_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ###### CHANGE THESE AS NEEDED ####### 4 | RG="vue-starter" 5 | APPNAME="$RG-$RANDOM" 6 | #You can get a list of locations by running 7 | #az account list-locations --query [].name 8 | LOCATION="westus" 9 | RUNTIME="DOTNETCORE:7.0" 10 | ZIPSCRIPT="./Deployment/Azure/zip.sh" 11 | ENVFILE="./Deployment/.env" 12 | LOGSCRIPT="./Deployment/Azure/logs.sh" 13 | 14 | #Pricing for Linux Service Plans changes from time to time given the location you choose 15 | #and parameters of your subscription. You can review the pricing for Linux Service Plans here: 16 | #https://azure.microsoft.com/en-us/pricing/details/app-service/linux/ 17 | 18 | #The sku should be one of: 19 | #F1(Free), D1(Shared), B1(Basic Small), B2(Basic Medium), B3(Basic Large), 20 | #S1(Standard Small), P1(Premium Small), P1V2(Premium V2 Small), 21 | #PC2 (Premium Container Small), PC3 (Premium Container Medium), 22 | #PC4 (Premium Container Large). 23 | 24 | #accepted values: B1, B2, B3, D1, F1, FREE, P1, P1V2, P2, P2V2, P3, P3V2, PC2, PC3, PC4, S1, S2, S3, SHARED 25 | SKU=B1 26 | 27 | rm $ENVFILE 28 | rm $ZIPSCRIPT 29 | 30 | echo "Creating .env" 31 | 32 | # Adding these to the .env file for convenience 33 | echo "RG=$RG" > $ENVFILE 34 | echo "APPNAME=$APPNAME" >> $ENVFILE 35 | echo "LOCATION=$LOCATION" >> $ENVFILE 36 | 37 | echo "Creating a resource group" 38 | 39 | #this can be run safely even if the group exists 40 | az group create -n $RG -l $LOCATION 41 | 42 | echo "Creating AppService Plan" 43 | az appservice plan create --name $APPNAME \ 44 | --resource-group $RG \ 45 | --sku $SKU \ 46 | --is-linux 47 | 48 | 49 | echo "Creating Web app" 50 | az webapp create --resource-group $RG \ 51 | --plan $APPNAME \ 52 | --name $APPNAME \ 53 | --runtime $RUNTIME 54 | 55 | az webapp config appsettings set --resource-group $RG --name $APPNAME --settings WEBSITE_RUN_FROM_PACKAGE="1" 56 | 57 | echo "Setting up logging" 58 | #setup logging and monitoring 59 | az webapp log config --application-logging filesystem \ 60 | --detailed-error-messages true \ 61 | --web-server-logging filesystem \ 62 | --level information \ 63 | --name $APPNAME \ 64 | --resource-group $RG 65 | 66 | echo "Adding logs alias to .env. Invoking this will allow you to see the application logs realtime-ish." 67 | #set an alias for convenience - add to .env 68 | echo "alias logs='az webapp log tail -n $APPNAME -g $RG'" >> $ENVFILE 69 | 70 | echo "az webapp log tail -n $APPNAME -g $RG" > $LOGSCRIPT 71 | 72 | 73 | echo "rm ./Deployment/Azure/deploy.zip" >> $ZIPSCRIPT 74 | echo "rm -R bin/Release" >> $ZIPSCRIPT 75 | echo "dotnet publish --configuration Release" >> $ZIPSCRIPT 76 | 77 | 78 | echo "cd bin/Release/net7.0/publish/" >>$ZIPSCRIPT 79 | echo "zip -r ../../../../Deployment/Azure/deploy.zip . -q" >> $ZIPSCRIPT 80 | echo "cd -" >> $ZIPSCRIPT 81 | 82 | 83 | echo "az webapp deployment source config-zip --resource-group vue-starter --name $APPNAME --src ./Deployment/Azure/deploy.zip" >> $ZIPSCRIPT 84 | 85 | echo "open https://$APPNAME.azurewebsites.net" >> $ZIPSCRIPT 86 | 87 | echo "echo 'Site is published 🎉 watching logs. It takes 60 seconds or so to refresh...'" >> $ZIPSCRIPT 88 | echo "az webapp log tail -n $APPNAME -g $RG" >> $ZIPSCRIPT 89 | 90 | source $ZIPSCRIPT 91 | 92 | echo "If there were no errors you should be able to view your site at https://$APPNAME.azurewebsites.net" -------------------------------------------------------------------------------- /templates/vue/README.md: -------------------------------------------------------------------------------- 1 | # The ASP.NET Vue Starter 2 | 3 | Hello and welcome to the ASP.NET Vue Starter Template with ASP.NET Minimal API and Vue 3.0. The only things this template contains are: 4 | 5 | - A starter ASP.NET Minimal API in `/server`. It has been setup to serve... 6 | - A starter Vue 3 app generated using `npm init vue@latest` in the `/app` directory. 7 | 8 | Before you get started, however, be sure to navigate into the `/app` directory and: 9 | 10 | ``` 11 | npm init 12 | ``` 13 | 14 | This will pull down the packages you need for Vue to run. 15 | 16 | ## Running Things 17 | 18 | To get up and running for development, you can run this right from the root: 19 | 20 | ``` 21 | npm run dev 22 | ``` 23 | 24 | If you only want to do Vue work you can run `npm run dev` in the `/app` directory but do keep in mind the backend API won't be running. 25 | 26 | ## Up and Running 27 | 28 | To get you started quickly we've integrated Tailwind CSS, which is quickly becoming the default CSS library for projects such as Rails and Phoenix. If you don't know Tailwind, it can be a little intimidating at first but if you spend just 30 minutes on the basics, it will change the way you do things. 29 | 30 | To find out more, you can [head to the docs](https://tailwindcss.com/docs/installation). 31 | 32 | ### Starter Components 33 | 34 | We've added a few starter components for you in `/app/src/components` which were built using the elements from [Tailblocks](https://tailblocks.cc/), a free, open-source block library for Tailwind. 35 | 36 | ## Simple CMS API 37 | 38 | We love Markdown and we love using it with Vue. We also love the way Vue pushes you away from hardcoding data and markup in your components so, to that end, we've created a super simple CMS system for you to use via the Minimal API which is based on [Nuxt Content](https://content.nuxtjs.org/). 39 | 40 | The idea is simple: your documents are loaded at startup, parsed and added to a `Document` collection. These documents can then be queried using LINQ via the API. Have a look in the `/Content` directory to see the documents. 41 | 42 | ## Minimal API 43 | 44 | [ASP.NET Minimal API](https://minimal-apis.github.io/) is a new effort from Microsoft's ASP.NET team to help you rapidly build your application: 45 | 46 | > Rapidly move from idea to a functioning application. All the features of C# web applications without the ceremony. 47 | 48 | As you'll hopefully see, Minimal API *feels* like lightweight web frameworks in other platforms, such as Flask (Python), Sinatra (Ruby) and Express (Node). Lightweight, easy to use and blazingly fast. 49 | 50 | 51 | ## Deployment 52 | 53 | When you create Vue applications, you do so with the help of a web server so you can see what you're creating as you create it. When it comes time to deploy, however, what you've created needs to be "transpiled" into individual JavaScript files and a static HTML page from which to serve them. 54 | 55 | This entire process is handled by [Vite](https://vitejs.dev/) (pronounced "veet"), and you don't need to think about it. All you need to remember is the the command you would normally use to take your application live: 56 | 57 | ``` 58 | dotnet publish 59 | ``` 60 | 61 | Running that will trigger the Vue build process (using Vite), which will optimize your view application, which includes: 62 | 63 | - Minification of assets, including CSS and JavaScript 64 | - Code-splitting or "chunking" your application code based on routes 65 | - Adding the built files to `/wwwroot` where it will be served as a static application, backed by your Minimal API 66 | 67 | It's important that this step is run prior to deployment, otherwise you won't see your assets. 68 | 69 | ## Azure Deployment 70 | 71 | In the `/server/Deployment/Azure` directory you'll see two script files: 72 | 73 | - `app_service.sh` is the script file that will help you create the resource on Azure that you need. It will also create a... 74 | - `zip.sh` file, which will push your site up using a direct zip push. This file is generated, but if you need to reproduce it manually, it looks something like this: 75 | 76 | ```sh 77 | rm ./Deployment/Azure/deploy.zip 78 | rm -R bin/Release 79 | dotnet publish --configuration Release 80 | cd bin/Release/net7.0/publish/ 81 | zip -r ../../../../Deployment/Azure/deploy.zip . -q 82 | cd - 83 | az webapp deployment source config-zip --resource-group $RG --name $APPNAME --src ./Deployment/Azure/deploy.zip 84 | open https://$APPNAME.azurewebsites.net 85 | echo 'Site's been pushed, watching logs...' 86 | az webapp log tail -n $APPNAME -g $RG 87 | ``` 88 | 89 | ## Using Make 90 | 91 | If you're a CLI person we've created a Makefile for you in the root of the `/server` application. You can use this to spin up your Azure resources using `make app_service` and to deploy your app using just `make`. 92 | 93 | In the long term you'll obviously want to use a more structured deployment process and we're currently working on a simple way to "upgrade" to a GitHub based deployment. 94 | 95 | ## Docker 96 | 97 | There is a Dockerfile in the root of the project that will build and package everything for you when you need it. This is _only_ the deployable application, not meant for development. To use it, just... 98 | 99 | ```sh 100 | docker build -t Vue.Starter . 101 | docker run -p 8080:80 Vue.Starter 102 | # open http://localhost:8080 103 | ``` 104 | 105 | ## Questions? Issues? 106 | 107 | The [GitHub repo for this template is here](https://github.com/robconery/Vue.Starter). I don't have discussions enabled, but feel free to pop an issue if you like or, better yet, a PR! 108 | 109 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | videos/ 14 | 15 | 16 | ## Ignore Visual Studio temporary files, build results, and 17 | ## files generated by popular Visual Studio add-ons. 18 | ## 19 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 20 | 21 | # User-specific files 22 | *.rsuser 23 | *.suo 24 | *.user 25 | *.userosscache 26 | *.sln.docstates 27 | .DS_Store 28 | .env 29 | # User-specific files (MonoDevelop/Xamarin Studio) 30 | *.userprefs 31 | app.zip 32 | # Mono auto generated files 33 | mono_crash.* 34 | dist/ 35 | # Build results 36 | [Dd]ebug/ 37 | [Dd]ebugPublic/ 38 | [Rr]elease/ 39 | [Rr]eleases/ 40 | x64/ 41 | x86/ 42 | [Ww][Ii][Nn]32/ 43 | [Aa][Rr][Mm]/ 44 | [Aa][Rr][Mm]64/ 45 | bld/ 46 | [Bb]in/ 47 | [Oo]bj/ 48 | [Ll]og/ 49 | [Ll]ogs/ 50 | 51 | # Visual Studio 2015/2017 cache/options directory 52 | .vs/ 53 | # Uncomment if you have tasks that create the project's static files in wwwroot 54 | #wwwroot/ 55 | 56 | # Visual Studio 2017 auto generated files 57 | Generated\ Files/ 58 | 59 | # MSTest test Results 60 | [Tt]est[Rr]esult*/ 61 | [Bb]uild[Ll]og.* 62 | 63 | # NUnit 64 | *.VisualState.xml 65 | TestResult.xml 66 | nunit-*.xml 67 | 68 | # Build Results of an ATL Project 69 | [Dd]ebugPS/ 70 | [Rr]eleasePS/ 71 | dlldata.c 72 | 73 | # Benchmark Results 74 | BenchmarkDotNet.Artifacts/ 75 | 76 | # .NET 77 | project.lock.json 78 | project.fragment.lock.json 79 | artifacts/ 80 | 81 | # Tye 82 | .tye/ 83 | 84 | # ASP.NET Scaffolding 85 | ScaffoldingReadMe.txt 86 | 87 | # StyleCop 88 | StyleCopReport.xml 89 | 90 | # Files built by Visual Studio 91 | *_i.c 92 | *_p.c 93 | *_h.h 94 | *.ilk 95 | *.meta 96 | *.obj 97 | *.iobj 98 | *.pch 99 | *.pdb 100 | *.ipdb 101 | *.pgc 102 | *.pgd 103 | *.rsp 104 | *.sbr 105 | *.tlb 106 | *.tli 107 | *.tlh 108 | *.tmp 109 | *.tmp_proj 110 | *_wpftmp.csproj 111 | *.log 112 | *.vspscc 113 | *.vssscc 114 | .builds 115 | *.pidb 116 | *.svclog 117 | *.scc 118 | 119 | # Chutzpah Test files 120 | _Chutzpah* 121 | 122 | # Visual C++ cache files 123 | ipch/ 124 | *.aps 125 | *.ncb 126 | *.opendb 127 | *.opensdf 128 | *.sdf 129 | *.cachefile 130 | *.VC.db 131 | *.VC.VC.opendb 132 | 133 | # Visual Studio profiler 134 | *.psess 135 | *.vsp 136 | *.vspx 137 | *.sap 138 | 139 | # Visual Studio Trace Files 140 | *.e2e 141 | 142 | # TFS 2012 Local Workspace 143 | $tf/ 144 | 145 | # Guidance Automation Toolkit 146 | *.gpState 147 | 148 | # ReSharper is a .NET coding add-in 149 | _ReSharper*/ 150 | *.[Rr]e[Ss]harper 151 | *.DotSettings.user 152 | 153 | # TeamCity is a build add-in 154 | _TeamCity* 155 | 156 | # DotCover is a Code Coverage Tool 157 | *.dotCover 158 | 159 | # AxoCover is a Code Coverage Tool 160 | .axoCover/* 161 | !.axoCover/settings.json 162 | 163 | # Coverlet is a free, cross platform Code Coverage Tool 164 | coverage*.json 165 | coverage*.xml 166 | coverage*.info 167 | 168 | # Visual Studio code coverage results 169 | *.coverage 170 | *.coveragexml 171 | 172 | # NCrunch 173 | _NCrunch_* 174 | .*crunch*.local.xml 175 | nCrunchTemp_* 176 | 177 | # MightyMoose 178 | *.mm.* 179 | AutoTest.Net/ 180 | 181 | # Web workbench (sass) 182 | .sass-cache/ 183 | 184 | # Installshield output folder 185 | [Ee]xpress/ 186 | 187 | # DocProject is a documentation generator add-in 188 | DocProject/buildhelp/ 189 | DocProject/Help/*.HxT 190 | DocProject/Help/*.HxC 191 | DocProject/Help/*.hhc 192 | DocProject/Help/*.hhk 193 | DocProject/Help/*.hhp 194 | DocProject/Help/Html2 195 | DocProject/Help/html 196 | 197 | # Click-Once directory 198 | publish/ 199 | 200 | # Publish Web Output 201 | *.[Pp]ublish.xml 202 | *.azurePubxml 203 | # Note: Comment the next line if you want to checkin your web deploy settings, 204 | # but database connection strings (with potential passwords) will be unencrypted 205 | *.pubxml 206 | *.publishproj 207 | 208 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 209 | # checkin your Azure Web App publish settings, but sensitive information contained 210 | # in these scripts will be unencrypted 211 | PublishScripts/ 212 | 213 | # NuGet Packages 214 | *.nupkg 215 | # NuGet Symbol Packages 216 | *.snupkg 217 | # The packages folder can be ignored because of Package Restore 218 | **/[Pp]ackages/* 219 | # except build/, which is used as an MSBuild target. 220 | !**/[Pp]ackages/build/ 221 | # Uncomment if necessary however generally it will be regenerated when needed 222 | #!**/[Pp]ackages/repositories.config 223 | # NuGet v3's project.json files produces more ignorable files 224 | *.nuget.props 225 | *.nuget.targets 226 | 227 | # Microsoft Azure Build Output 228 | csx/ 229 | *.build.csdef 230 | 231 | # Microsoft Azure Emulator 232 | ecf/ 233 | rcf/ 234 | 235 | # Windows Store app package directories and files 236 | AppPackages/ 237 | BundleArtifacts/ 238 | Package.StoreAssociation.xml 239 | _pkginfo.txt 240 | *.appx 241 | *.appxbundle 242 | *.appxupload 243 | 244 | # Visual Studio cache files 245 | # files ending in .cache can be ignored 246 | *.[Cc]ache 247 | # but keep track of directories ending in .cache 248 | !?*.[Cc]ache/ 249 | 250 | # Others 251 | ClientBin/ 252 | ~$* 253 | *~ 254 | *.dbmdl 255 | *.dbproj.schemaview 256 | *.jfm 257 | *.pfx 258 | *.publishsettings 259 | orleans.codegen.cs 260 | 261 | # Including strong name files can present a security risk 262 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 263 | #*.snk 264 | 265 | # Since there are multiple workflows, uncomment next line to ignore bower_components 266 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 267 | #bower_components/ 268 | 269 | # RIA/Silverlight projects 270 | Generated_Code/ 271 | 272 | # Backup & report files from converting an old project file 273 | # to a newer Visual Studio version. Backup files are not needed, 274 | # because we have git ;-) 275 | _UpgradeReport_Files/ 276 | Backup*/ 277 | UpgradeLog*.XML 278 | UpgradeLog*.htm 279 | ServiceFabricBackup/ 280 | *.rptproj.bak 281 | 282 | # SQL Server files 283 | *.mdf 284 | *.ldf 285 | *.ndf 286 | 287 | # Business Intelligence projects 288 | *.rdl.data 289 | *.bim.layout 290 | *.bim_*.settings 291 | *.rptproj.rsuser 292 | *- [Bb]ackup.rdl 293 | *- [Bb]ackup ([0-9]).rdl 294 | *- [Bb]ackup ([0-9][0-9]).rdl 295 | 296 | # Microsoft Fakes 297 | FakesAssemblies/ 298 | 299 | # GhostDoc plugin setting file 300 | *.GhostDoc.xml 301 | 302 | # Node.js Tools for Visual Studio 303 | .ntvs_analysis.dat 304 | node_modules/ 305 | 306 | # Visual Studio 6 build log 307 | *.plg 308 | 309 | # Visual Studio 6 workspace options file 310 | *.opt 311 | 312 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 313 | *.vbw 314 | 315 | # Visual Studio LightSwitch build output 316 | **/*.HTMLClient/GeneratedArtifacts 317 | **/*.DesktopClient/GeneratedArtifacts 318 | **/*.DesktopClient/ModelManifest.xml 319 | **/*.Server/GeneratedArtifacts 320 | **/*.Server/ModelManifest.xml 321 | _Pvt_Extensions 322 | 323 | # Paket dependency manager 324 | .paket/paket.exe 325 | paket-files/ 326 | 327 | # FAKE - F# Make 328 | .fake/ 329 | 330 | # CodeRush personal settings 331 | .cr/personal 332 | 333 | # Python Tools for Visual Studio (PTVS) 334 | __pycache__/ 335 | *.pyc 336 | 337 | # Cake - Uncomment if you are using it 338 | # tools/** 339 | # !tools/packages.config 340 | 341 | # Tabs Studio 342 | *.tss 343 | 344 | # Telerik's JustMock configuration file 345 | *.jmconfig 346 | 347 | # BizTalk build output 348 | *.btp.cs 349 | *.btm.cs 350 | *.odx.cs 351 | *.xsd.cs 352 | 353 | # OpenCover UI analysis results 354 | OpenCover/ 355 | 356 | # Azure Stream Analytics local run output 357 | ASALocalRun/ 358 | 359 | # MSBuild Binary and Structured Log 360 | *.binlog 361 | 362 | # NVidia Nsight GPU debugger configuration file 363 | *.nvuser 364 | 365 | # MFractors (Xamarin productivity tool) working folder 366 | .mfractor/ 367 | 368 | # Local History for Visual Studio 369 | .localhistory/ 370 | 371 | # BeatPulse healthcheck temp database 372 | healthchecksdb 373 | 374 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 375 | MigrationBackup/ 376 | 377 | # Ionide (cross platform F# VS Code tools) working folder 378 | .ionide/ 379 | 380 | # Fody - auto-generated XML schema 381 | FodyWeavers.xsd 382 | 383 | ## 384 | ## Visual studio for Mac 385 | ## 386 | 387 | 388 | # globs 389 | Makefile.in 390 | *.userprefs 391 | *.usertasks 392 | config.make 393 | config.status 394 | aclocal.m4 395 | install-sh 396 | autom4te.cache/ 397 | *.tar.gz 398 | tarballs/ 399 | test-results/ 400 | 401 | # Mac bundle stuff 402 | *.dmg 403 | *.app 404 | 405 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore 406 | # General 407 | .DS_Store 408 | .AppleDouble 409 | .LSOverride 410 | 411 | # Icon must end with two \r 412 | Icon 413 | 414 | 415 | # Thumbnails 416 | ._* 417 | 418 | # Files that might appear in the root of a volume 419 | .DocumentRevisions-V100 420 | .fseventsd 421 | .Spotlight-V100 422 | .TemporaryItems 423 | .Trashes 424 | .VolumeIcon.icns 425 | .com.apple.timemachine.donotpresent 426 | 427 | # Directories potentially created on remote AFP share 428 | .AppleDB 429 | .AppleDesktop 430 | Network Trash Folder 431 | Temporary Items 432 | .apdisk 433 | 434 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore 435 | # Windows thumbnail cache files 436 | Thumbs.db 437 | ehthumbs.db 438 | ehthumbs_vista.db 439 | 440 | # Dump file 441 | *.stackdump 442 | 443 | # Folder config file 444 | [Dd]esktop.ini 445 | 446 | # Recycle Bin used on file shares 447 | $RECYCLE.BIN/ 448 | 449 | # Windows Installer files 450 | *.cab 451 | *.msi 452 | *.msix 453 | *.msm 454 | *.msp 455 | 456 | # Windows shortcuts 457 | *.lnk 458 | 459 | # JetBrains Rider 460 | .idea/ 461 | *.sln.iml 462 | 463 | ## 464 | ## Visual Studio Code 465 | ## 466 | .vscode/* 467 | !.vscode/settings.json 468 | !.vscode/tasks.json 469 | !.vscode/launch.json 470 | !.vscode/extensions.json 471 | -------------------------------------------------------------------------------- /templates/vue/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | deploy.zip 14 | 15 | 16 | ## Ignore Visual Studio temporary files, build results, and 17 | ## files generated by popular Visual Studio add-ons. 18 | ## 19 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 20 | 21 | # User-specific files 22 | *.rsuser 23 | *.suo 24 | *.user 25 | *.userosscache 26 | *.sln.docstates 27 | .DS_Store 28 | .env 29 | # User-specific files (MonoDevelop/Xamarin Studio) 30 | *.userprefs 31 | 32 | # Mono auto generated files 33 | mono_crash.* 34 | dist/ 35 | # Build results 36 | [Dd]ebug/ 37 | [Dd]ebugPublic/ 38 | [Rr]elease/ 39 | [Rr]eleases/ 40 | x64/ 41 | x86/ 42 | [Ww][Ii][Nn]32/ 43 | [Aa][Rr][Mm]/ 44 | [Aa][Rr][Mm]64/ 45 | bld/ 46 | [Bb]in/ 47 | [Oo]bj/ 48 | [Ll]og/ 49 | [Ll]ogs/ 50 | 51 | # Visual Studio 2015/2017 cache/options directory 52 | .vs/ 53 | # Uncomment if you have tasks that create the project's static files in wwwroot 54 | #wwwroot/ 55 | 56 | # Visual Studio 2017 auto generated files 57 | Generated\ Files/ 58 | 59 | # MSTest test Results 60 | [Tt]est[Rr]esult*/ 61 | [Bb]uild[Ll]og.* 62 | 63 | # NUnit 64 | *.VisualState.xml 65 | TestResult.xml 66 | nunit-*.xml 67 | 68 | # Build Results of an ATL Project 69 | [Dd]ebugPS/ 70 | [Rr]eleasePS/ 71 | dlldata.c 72 | 73 | # Benchmark Results 74 | BenchmarkDotNet.Artifacts/ 75 | 76 | # .NET 77 | project.lock.json 78 | project.fragment.lock.json 79 | artifacts/ 80 | 81 | # Tye 82 | .tye/ 83 | 84 | # ASP.NET Scaffolding 85 | ScaffoldingReadMe.txt 86 | 87 | # StyleCop 88 | StyleCopReport.xml 89 | 90 | # Files built by Visual Studio 91 | *_i.c 92 | *_p.c 93 | *_h.h 94 | *.ilk 95 | *.meta 96 | *.obj 97 | *.iobj 98 | *.pch 99 | *.pdb 100 | *.ipdb 101 | *.pgc 102 | *.pgd 103 | *.rsp 104 | *.sbr 105 | *.tlb 106 | *.tli 107 | *.tlh 108 | *.tmp 109 | *.tmp_proj 110 | *_wpftmp.csproj 111 | *.log 112 | *.vspscc 113 | *.vssscc 114 | .builds 115 | *.pidb 116 | *.svclog 117 | *.scc 118 | 119 | # Chutzpah Test files 120 | _Chutzpah* 121 | 122 | # Visual C++ cache files 123 | ipch/ 124 | *.aps 125 | *.ncb 126 | *.opendb 127 | *.opensdf 128 | *.sdf 129 | *.cachefile 130 | *.VC.db 131 | *.VC.VC.opendb 132 | 133 | # Visual Studio profiler 134 | *.psess 135 | *.vsp 136 | *.vspx 137 | *.sap 138 | 139 | # Visual Studio Trace Files 140 | *.e2e 141 | 142 | # TFS 2012 Local Workspace 143 | $tf/ 144 | 145 | # Guidance Automation Toolkit 146 | *.gpState 147 | 148 | # ReSharper is a .NET coding add-in 149 | _ReSharper*/ 150 | *.[Rr]e[Ss]harper 151 | *.DotSettings.user 152 | 153 | # TeamCity is a build add-in 154 | _TeamCity* 155 | 156 | # DotCover is a Code Coverage Tool 157 | *.dotCover 158 | 159 | # AxoCover is a Code Coverage Tool 160 | .axoCover/* 161 | !.axoCover/settings.json 162 | 163 | # Coverlet is a free, cross platform Code Coverage Tool 164 | coverage*.json 165 | coverage*.xml 166 | coverage*.info 167 | 168 | # Visual Studio code coverage results 169 | *.coverage 170 | *.coveragexml 171 | 172 | # NCrunch 173 | _NCrunch_* 174 | .*crunch*.local.xml 175 | nCrunchTemp_* 176 | 177 | # MightyMoose 178 | *.mm.* 179 | AutoTest.Net/ 180 | 181 | # Web workbench (sass) 182 | .sass-cache/ 183 | 184 | # Installshield output folder 185 | [Ee]xpress/ 186 | 187 | # DocProject is a documentation generator add-in 188 | DocProject/buildhelp/ 189 | DocProject/Help/*.HxT 190 | DocProject/Help/*.HxC 191 | DocProject/Help/*.hhc 192 | DocProject/Help/*.hhk 193 | DocProject/Help/*.hhp 194 | DocProject/Help/Html2 195 | DocProject/Help/html 196 | 197 | # Click-Once directory 198 | publish/ 199 | 200 | # Publish Web Output 201 | *.[Pp]ublish.xml 202 | *.azurePubxml 203 | # Note: Comment the next line if you want to checkin your web deploy settings, 204 | # but database connection strings (with potential passwords) will be unencrypted 205 | *.pubxml 206 | *.publishproj 207 | 208 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 209 | # checkin your Azure Web App publish settings, but sensitive information contained 210 | # in these scripts will be unencrypted 211 | PublishScripts/ 212 | 213 | # NuGet Packages 214 | *.nupkg 215 | # NuGet Symbol Packages 216 | *.snupkg 217 | # The packages folder can be ignored because of Package Restore 218 | **/[Pp]ackages/* 219 | # except build/, which is used as an MSBuild target. 220 | !**/[Pp]ackages/build/ 221 | # Uncomment if necessary however generally it will be regenerated when needed 222 | #!**/[Pp]ackages/repositories.config 223 | # NuGet v3's project.json files produces more ignorable files 224 | *.nuget.props 225 | *.nuget.targets 226 | 227 | # Microsoft Azure Build Output 228 | csx/ 229 | *.build.csdef 230 | 231 | # Microsoft Azure Emulator 232 | ecf/ 233 | rcf/ 234 | 235 | # Windows Store app package directories and files 236 | AppPackages/ 237 | BundleArtifacts/ 238 | Package.StoreAssociation.xml 239 | _pkginfo.txt 240 | *.appx 241 | *.appxbundle 242 | *.appxupload 243 | 244 | # Visual Studio cache files 245 | # files ending in .cache can be ignored 246 | *.[Cc]ache 247 | # but keep track of directories ending in .cache 248 | !?*.[Cc]ache/ 249 | 250 | # Others 251 | ClientBin/ 252 | ~$* 253 | *~ 254 | *.dbmdl 255 | *.dbproj.schemaview 256 | *.jfm 257 | *.pfx 258 | *.publishsettings 259 | orleans.codegen.cs 260 | 261 | # Including strong name files can present a security risk 262 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 263 | #*.snk 264 | 265 | # Since there are multiple workflows, uncomment next line to ignore bower_components 266 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 267 | #bower_components/ 268 | 269 | # RIA/Silverlight projects 270 | Generated_Code/ 271 | 272 | # Backup & report files from converting an old project file 273 | # to a newer Visual Studio version. Backup files are not needed, 274 | # because we have git ;-) 275 | _UpgradeReport_Files/ 276 | Backup*/ 277 | UpgradeLog*.XML 278 | UpgradeLog*.htm 279 | ServiceFabricBackup/ 280 | *.rptproj.bak 281 | 282 | # SQL Server files 283 | *.mdf 284 | *.ldf 285 | *.ndf 286 | 287 | # Business Intelligence projects 288 | *.rdl.data 289 | *.bim.layout 290 | *.bim_*.settings 291 | *.rptproj.rsuser 292 | *- [Bb]ackup.rdl 293 | *- [Bb]ackup ([0-9]).rdl 294 | *- [Bb]ackup ([0-9][0-9]).rdl 295 | 296 | # Microsoft Fakes 297 | FakesAssemblies/ 298 | 299 | # GhostDoc plugin setting file 300 | *.GhostDoc.xml 301 | 302 | # Node.js Tools for Visual Studio 303 | .ntvs_analysis.dat 304 | node_modules/ 305 | 306 | # Visual Studio 6 build log 307 | *.plg 308 | 309 | # Visual Studio 6 workspace options file 310 | *.opt 311 | 312 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 313 | *.vbw 314 | 315 | # Visual Studio LightSwitch build output 316 | **/*.HTMLClient/GeneratedArtifacts 317 | **/*.DesktopClient/GeneratedArtifacts 318 | **/*.DesktopClient/ModelManifest.xml 319 | **/*.Server/GeneratedArtifacts 320 | **/*.Server/ModelManifest.xml 321 | _Pvt_Extensions 322 | 323 | # Paket dependency manager 324 | .paket/paket.exe 325 | paket-files/ 326 | 327 | # FAKE - F# Make 328 | .fake/ 329 | 330 | # CodeRush personal settings 331 | .cr/personal 332 | 333 | # Python Tools for Visual Studio (PTVS) 334 | __pycache__/ 335 | *.pyc 336 | 337 | # Cake - Uncomment if you are using it 338 | # tools/** 339 | # !tools/packages.config 340 | 341 | # Tabs Studio 342 | *.tss 343 | 344 | # Telerik's JustMock configuration file 345 | *.jmconfig 346 | 347 | # BizTalk build output 348 | *.btp.cs 349 | *.btm.cs 350 | *.odx.cs 351 | *.xsd.cs 352 | 353 | # OpenCover UI analysis results 354 | OpenCover/ 355 | 356 | # Azure Stream Analytics local run output 357 | ASALocalRun/ 358 | 359 | # MSBuild Binary and Structured Log 360 | *.binlog 361 | 362 | # NVidia Nsight GPU debugger configuration file 363 | *.nvuser 364 | 365 | # MFractors (Xamarin productivity tool) working folder 366 | .mfractor/ 367 | 368 | # Local History for Visual Studio 369 | .localhistory/ 370 | 371 | # BeatPulse healthcheck temp database 372 | healthchecksdb 373 | 374 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 375 | MigrationBackup/ 376 | 377 | # Ionide (cross platform F# VS Code tools) working folder 378 | .ionide/ 379 | 380 | # Fody - auto-generated XML schema 381 | FodyWeavers.xsd 382 | 383 | ## 384 | ## Visual studio for Mac 385 | ## 386 | 387 | 388 | # globs 389 | Makefile.in 390 | *.userprefs 391 | *.usertasks 392 | config.make 393 | config.status 394 | aclocal.m4 395 | install-sh 396 | autom4te.cache/ 397 | *.tar.gz 398 | tarballs/ 399 | test-results/ 400 | 401 | # Mac bundle stuff 402 | *.dmg 403 | *.app 404 | 405 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore 406 | # General 407 | .DS_Store 408 | .AppleDouble 409 | .LSOverride 410 | 411 | # Icon must end with two \r 412 | Icon 413 | 414 | 415 | # Thumbnails 416 | ._* 417 | 418 | # Files that might appear in the root of a volume 419 | .DocumentRevisions-V100 420 | .fseventsd 421 | .Spotlight-V100 422 | .TemporaryItems 423 | .Trashes 424 | .VolumeIcon.icns 425 | .com.apple.timemachine.donotpresent 426 | 427 | # Directories potentially created on remote AFP share 428 | .AppleDB 429 | .AppleDesktop 430 | Network Trash Folder 431 | Temporary Items 432 | .apdisk 433 | 434 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore 435 | # Windows thumbnail cache files 436 | Thumbs.db 437 | ehthumbs.db 438 | ehthumbs_vista.db 439 | 440 | # Dump file 441 | *.stackdump 442 | 443 | # Folder config file 444 | [Dd]esktop.ini 445 | 446 | # Recycle Bin used on file shares 447 | $RECYCLE.BIN/ 448 | 449 | # Windows Installer files 450 | *.cab 451 | *.msi 452 | *.msix 453 | *.msm 454 | *.msp 455 | 456 | # Windows shortcuts 457 | *.lnk 458 | 459 | # JetBrains Rider 460 | .idea/ 461 | *.sln.iml 462 | 463 | ## 464 | ## Visual Studio Code 465 | ## 466 | .vscode/* 467 | !.vscode/settings.json 468 | !.vscode/tasks.json 469 | !.vscode/launch.json 470 | !.vscode/extensions.json 471 | /test-results/ 472 | /playwright-report/ 473 | /playwright/.cache/ 474 | -------------------------------------------------------------------------------- /templates/vue/app/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app2", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "app2", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@vueuse/head": "^1.1.15", 12 | "pinia": "^2.0.26", 13 | "vue": "^3.2.45", 14 | "vue-router": "^4.1.6" 15 | }, 16 | "devDependencies": { 17 | "@playwright/test": "^1.28.1", 18 | "@vitejs/plugin-vue": "^3.2.0", 19 | "autoprefixer": "^10.4.13", 20 | "postcss": "^8.4.21", 21 | "tailwindcss": "^3.2.7", 22 | "vite": "^3.2.4" 23 | } 24 | }, 25 | "node_modules/@babel/parser": { 26 | "version": "7.21.1", 27 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", 28 | "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", 29 | "bin": { 30 | "parser": "bin/babel-parser.js" 31 | }, 32 | "engines": { 33 | "node": ">=6.0.0" 34 | } 35 | }, 36 | "node_modules/@esbuild/android-arm": { 37 | "version": "0.15.18", 38 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", 39 | "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", 40 | "cpu": [ 41 | "arm" 42 | ], 43 | "dev": true, 44 | "optional": true, 45 | "os": [ 46 | "android" 47 | ], 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/@esbuild/linux-loong64": { 53 | "version": "0.15.18", 54 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", 55 | "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", 56 | "cpu": [ 57 | "loong64" 58 | ], 59 | "dev": true, 60 | "optional": true, 61 | "os": [ 62 | "linux" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@nodelib/fs.scandir": { 69 | "version": "2.1.5", 70 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 71 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 72 | "dev": true, 73 | "dependencies": { 74 | "@nodelib/fs.stat": "2.0.5", 75 | "run-parallel": "^1.1.9" 76 | }, 77 | "engines": { 78 | "node": ">= 8" 79 | } 80 | }, 81 | "node_modules/@nodelib/fs.stat": { 82 | "version": "2.0.5", 83 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 84 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 85 | "dev": true, 86 | "engines": { 87 | "node": ">= 8" 88 | } 89 | }, 90 | "node_modules/@nodelib/fs.walk": { 91 | "version": "1.2.8", 92 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 93 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 94 | "dev": true, 95 | "dependencies": { 96 | "@nodelib/fs.scandir": "2.1.5", 97 | "fastq": "^1.6.0" 98 | }, 99 | "engines": { 100 | "node": ">= 8" 101 | } 102 | }, 103 | "node_modules/@playwright/test": { 104 | "version": "1.31.0", 105 | "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.0.tgz", 106 | "integrity": "sha512-Ys5s/06Dg9g3zAIdCIb/UOBYim3U7Zjb3DvC6XBtnRmnglH5O47iwYzmtxXu9fhSyzI2Jn28apkXIOD81GgCdw==", 107 | "dev": true, 108 | "dependencies": { 109 | "@types/node": "*", 110 | "playwright-core": "1.31.0" 111 | }, 112 | "bin": { 113 | "playwright": "cli.js" 114 | }, 115 | "engines": { 116 | "node": ">=14" 117 | }, 118 | "optionalDependencies": { 119 | "fsevents": "2.3.2" 120 | } 121 | }, 122 | "node_modules/@types/node": { 123 | "version": "18.14.0", 124 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", 125 | "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", 126 | "dev": true 127 | }, 128 | "node_modules/@unhead/dom": { 129 | "version": "1.1.15", 130 | "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.1.15.tgz", 131 | "integrity": "sha512-b1S8avVokif15pankINlFrKrxW2pEJ4R4vt/IEDLhjsAq4oDeLpbFUQNvFeEQafaXBdryCTWICJX8MQrzs9INA==", 132 | "dependencies": { 133 | "@unhead/schema": "1.1.15", 134 | "@unhead/shared": "1.1.15" 135 | }, 136 | "funding": { 137 | "url": "https://github.com/sponsors/harlan-zw" 138 | } 139 | }, 140 | "node_modules/@unhead/schema": { 141 | "version": "1.1.15", 142 | "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.1.15.tgz", 143 | "integrity": "sha512-331yP1JrJfvaa2TvfiVGLlgwl9bVgFVJ0pMy1hPBM/0+J09d6SKy4khZb2j0WtgVofY6FnThmKWDNCngCzRZhg==", 144 | "dependencies": { 145 | "hookable": "^5.4.2", 146 | "zhead": "^2.0.4" 147 | }, 148 | "funding": { 149 | "url": "https://github.com/sponsors/harlan-zw" 150 | } 151 | }, 152 | "node_modules/@unhead/shared": { 153 | "version": "1.1.15", 154 | "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.1.15.tgz", 155 | "integrity": "sha512-s41AbZFeTAV982pP5+MUno3UlKcSxziMjs+D6TAKP+OdNhyN/W557TUVKbBY/4EWWYl5c0wJhjeuVduJBQpSSQ==", 156 | "dependencies": { 157 | "@unhead/schema": "1.1.15" 158 | }, 159 | "funding": { 160 | "url": "https://github.com/sponsors/harlan-zw" 161 | } 162 | }, 163 | "node_modules/@unhead/ssr": { 164 | "version": "1.1.15", 165 | "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.1.15.tgz", 166 | "integrity": "sha512-ZDj3lJuMOTrhDrNFQLETC1xQN2z53GzXV4kRQ6Baeqb9uDR+3q1yeHV+eL7DEqR8aPCHt26gs5c8OYJsfE1HFQ==", 167 | "dependencies": { 168 | "@unhead/schema": "1.1.15", 169 | "@unhead/shared": "1.1.15" 170 | }, 171 | "funding": { 172 | "url": "https://github.com/sponsors/harlan-zw" 173 | } 174 | }, 175 | "node_modules/@unhead/vue": { 176 | "version": "1.1.15", 177 | "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.1.15.tgz", 178 | "integrity": "sha512-EX8zsb3dNhC72tpz6BExK3oIpy2t6f2QbpYsr6gthgtLMJqe8SPjgJlKGcVEegZhPw4bmMzMk72Dak3qomb98A==", 179 | "dependencies": { 180 | "@unhead/schema": "1.1.15", 181 | "@unhead/shared": "1.1.15", 182 | "hookable": "^5.4.2", 183 | "unhead": "1.1.15" 184 | }, 185 | "funding": { 186 | "url": "https://github.com/sponsors/harlan-zw" 187 | }, 188 | "peerDependencies": { 189 | "vue": ">=2.7 || >=3" 190 | } 191 | }, 192 | "node_modules/@vitejs/plugin-vue": { 193 | "version": "3.2.0", 194 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", 195 | "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", 196 | "dev": true, 197 | "engines": { 198 | "node": "^14.18.0 || >=16.0.0" 199 | }, 200 | "peerDependencies": { 201 | "vite": "^3.0.0", 202 | "vue": "^3.2.25" 203 | } 204 | }, 205 | "node_modules/@vue/compiler-core": { 206 | "version": "3.2.47", 207 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", 208 | "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", 209 | "dependencies": { 210 | "@babel/parser": "^7.16.4", 211 | "@vue/shared": "3.2.47", 212 | "estree-walker": "^2.0.2", 213 | "source-map": "^0.6.1" 214 | } 215 | }, 216 | "node_modules/@vue/compiler-dom": { 217 | "version": "3.2.47", 218 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", 219 | "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", 220 | "dependencies": { 221 | "@vue/compiler-core": "3.2.47", 222 | "@vue/shared": "3.2.47" 223 | } 224 | }, 225 | "node_modules/@vue/compiler-sfc": { 226 | "version": "3.2.47", 227 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", 228 | "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", 229 | "dependencies": { 230 | "@babel/parser": "^7.16.4", 231 | "@vue/compiler-core": "3.2.47", 232 | "@vue/compiler-dom": "3.2.47", 233 | "@vue/compiler-ssr": "3.2.47", 234 | "@vue/reactivity-transform": "3.2.47", 235 | "@vue/shared": "3.2.47", 236 | "estree-walker": "^2.0.2", 237 | "magic-string": "^0.25.7", 238 | "postcss": "^8.1.10", 239 | "source-map": "^0.6.1" 240 | } 241 | }, 242 | "node_modules/@vue/compiler-ssr": { 243 | "version": "3.2.47", 244 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", 245 | "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", 246 | "dependencies": { 247 | "@vue/compiler-dom": "3.2.47", 248 | "@vue/shared": "3.2.47" 249 | } 250 | }, 251 | "node_modules/@vue/devtools-api": { 252 | "version": "6.5.0", 253 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", 254 | "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" 255 | }, 256 | "node_modules/@vue/reactivity": { 257 | "version": "3.2.47", 258 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", 259 | "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", 260 | "dependencies": { 261 | "@vue/shared": "3.2.47" 262 | } 263 | }, 264 | "node_modules/@vue/reactivity-transform": { 265 | "version": "3.2.47", 266 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", 267 | "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", 268 | "dependencies": { 269 | "@babel/parser": "^7.16.4", 270 | "@vue/compiler-core": "3.2.47", 271 | "@vue/shared": "3.2.47", 272 | "estree-walker": "^2.0.2", 273 | "magic-string": "^0.25.7" 274 | } 275 | }, 276 | "node_modules/@vue/runtime-core": { 277 | "version": "3.2.47", 278 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", 279 | "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", 280 | "dependencies": { 281 | "@vue/reactivity": "3.2.47", 282 | "@vue/shared": "3.2.47" 283 | } 284 | }, 285 | "node_modules/@vue/runtime-dom": { 286 | "version": "3.2.47", 287 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", 288 | "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", 289 | "dependencies": { 290 | "@vue/runtime-core": "3.2.47", 291 | "@vue/shared": "3.2.47", 292 | "csstype": "^2.6.8" 293 | } 294 | }, 295 | "node_modules/@vue/server-renderer": { 296 | "version": "3.2.47", 297 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", 298 | "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", 299 | "dependencies": { 300 | "@vue/compiler-ssr": "3.2.47", 301 | "@vue/shared": "3.2.47" 302 | }, 303 | "peerDependencies": { 304 | "vue": "3.2.47" 305 | } 306 | }, 307 | "node_modules/@vue/shared": { 308 | "version": "3.2.47", 309 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", 310 | "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" 311 | }, 312 | "node_modules/@vueuse/head": { 313 | "version": "1.1.15", 314 | "resolved": "https://registry.npmjs.org/@vueuse/head/-/head-1.1.15.tgz", 315 | "integrity": "sha512-LJqvb7dpSqnsdn6YWUxv97vWCnn/s6IfBrE4ih5kRlh8XQXr/HjXJ8IyIxxp0X7QDr3FhOsjRDpJSiQbDYbBdQ==", 316 | "dependencies": { 317 | "@unhead/dom": "^1.1.15", 318 | "@unhead/schema": "^1.1.15", 319 | "@unhead/ssr": "^1.1.15", 320 | "@unhead/vue": "^1.1.15" 321 | }, 322 | "peerDependencies": { 323 | "vue": ">=2.7 || >=3" 324 | } 325 | }, 326 | "node_modules/acorn": { 327 | "version": "7.4.1", 328 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 329 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 330 | "dev": true, 331 | "bin": { 332 | "acorn": "bin/acorn" 333 | }, 334 | "engines": { 335 | "node": ">=0.4.0" 336 | } 337 | }, 338 | "node_modules/acorn-node": { 339 | "version": "1.8.2", 340 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 341 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 342 | "dev": true, 343 | "dependencies": { 344 | "acorn": "^7.0.0", 345 | "acorn-walk": "^7.0.0", 346 | "xtend": "^4.0.2" 347 | } 348 | }, 349 | "node_modules/acorn-walk": { 350 | "version": "7.2.0", 351 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 352 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 353 | "dev": true, 354 | "engines": { 355 | "node": ">=0.4.0" 356 | } 357 | }, 358 | "node_modules/anymatch": { 359 | "version": "3.1.3", 360 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 361 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 362 | "dev": true, 363 | "dependencies": { 364 | "normalize-path": "^3.0.0", 365 | "picomatch": "^2.0.4" 366 | }, 367 | "engines": { 368 | "node": ">= 8" 369 | } 370 | }, 371 | "node_modules/arg": { 372 | "version": "5.0.2", 373 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 374 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 375 | "dev": true 376 | }, 377 | "node_modules/autoprefixer": { 378 | "version": "10.4.13", 379 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 380 | "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 381 | "dev": true, 382 | "funding": [ 383 | { 384 | "type": "opencollective", 385 | "url": "https://opencollective.com/postcss/" 386 | }, 387 | { 388 | "type": "tidelift", 389 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 390 | } 391 | ], 392 | "dependencies": { 393 | "browserslist": "^4.21.4", 394 | "caniuse-lite": "^1.0.30001426", 395 | "fraction.js": "^4.2.0", 396 | "normalize-range": "^0.1.2", 397 | "picocolors": "^1.0.0", 398 | "postcss-value-parser": "^4.2.0" 399 | }, 400 | "bin": { 401 | "autoprefixer": "bin/autoprefixer" 402 | }, 403 | "engines": { 404 | "node": "^10 || ^12 || >=14" 405 | }, 406 | "peerDependencies": { 407 | "postcss": "^8.1.0" 408 | } 409 | }, 410 | "node_modules/binary-extensions": { 411 | "version": "2.2.0", 412 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 413 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 414 | "dev": true, 415 | "engines": { 416 | "node": ">=8" 417 | } 418 | }, 419 | "node_modules/braces": { 420 | "version": "3.0.2", 421 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 422 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 423 | "dev": true, 424 | "dependencies": { 425 | "fill-range": "^7.0.1" 426 | }, 427 | "engines": { 428 | "node": ">=8" 429 | } 430 | }, 431 | "node_modules/browserslist": { 432 | "version": "4.21.5", 433 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 434 | "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 435 | "dev": true, 436 | "funding": [ 437 | { 438 | "type": "opencollective", 439 | "url": "https://opencollective.com/browserslist" 440 | }, 441 | { 442 | "type": "tidelift", 443 | "url": "https://tidelift.com/funding/github/npm/browserslist" 444 | } 445 | ], 446 | "dependencies": { 447 | "caniuse-lite": "^1.0.30001449", 448 | "electron-to-chromium": "^1.4.284", 449 | "node-releases": "^2.0.8", 450 | "update-browserslist-db": "^1.0.10" 451 | }, 452 | "bin": { 453 | "browserslist": "cli.js" 454 | }, 455 | "engines": { 456 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 457 | } 458 | }, 459 | "node_modules/camelcase-css": { 460 | "version": "2.0.1", 461 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 462 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 463 | "dev": true, 464 | "engines": { 465 | "node": ">= 6" 466 | } 467 | }, 468 | "node_modules/caniuse-lite": { 469 | "version": "1.0.30001457", 470 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", 471 | "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", 472 | "dev": true, 473 | "funding": [ 474 | { 475 | "type": "opencollective", 476 | "url": "https://opencollective.com/browserslist" 477 | }, 478 | { 479 | "type": "tidelift", 480 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 481 | } 482 | ] 483 | }, 484 | "node_modules/chokidar": { 485 | "version": "3.5.3", 486 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 487 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 488 | "dev": true, 489 | "funding": [ 490 | { 491 | "type": "individual", 492 | "url": "https://paulmillr.com/funding/" 493 | } 494 | ], 495 | "dependencies": { 496 | "anymatch": "~3.1.2", 497 | "braces": "~3.0.2", 498 | "glob-parent": "~5.1.2", 499 | "is-binary-path": "~2.1.0", 500 | "is-glob": "~4.0.1", 501 | "normalize-path": "~3.0.0", 502 | "readdirp": "~3.6.0" 503 | }, 504 | "engines": { 505 | "node": ">= 8.10.0" 506 | }, 507 | "optionalDependencies": { 508 | "fsevents": "~2.3.2" 509 | } 510 | }, 511 | "node_modules/chokidar/node_modules/glob-parent": { 512 | "version": "5.1.2", 513 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 514 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 515 | "dev": true, 516 | "dependencies": { 517 | "is-glob": "^4.0.1" 518 | }, 519 | "engines": { 520 | "node": ">= 6" 521 | } 522 | }, 523 | "node_modules/color-name": { 524 | "version": "1.1.4", 525 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 526 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 527 | "dev": true 528 | }, 529 | "node_modules/cssesc": { 530 | "version": "3.0.0", 531 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 532 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 533 | "dev": true, 534 | "bin": { 535 | "cssesc": "bin/cssesc" 536 | }, 537 | "engines": { 538 | "node": ">=4" 539 | } 540 | }, 541 | "node_modules/csstype": { 542 | "version": "2.6.21", 543 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", 544 | "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" 545 | }, 546 | "node_modules/defined": { 547 | "version": "1.0.1", 548 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 549 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 550 | "dev": true, 551 | "funding": { 552 | "url": "https://github.com/sponsors/ljharb" 553 | } 554 | }, 555 | "node_modules/detective": { 556 | "version": "5.2.1", 557 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 558 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 559 | "dev": true, 560 | "dependencies": { 561 | "acorn-node": "^1.8.2", 562 | "defined": "^1.0.0", 563 | "minimist": "^1.2.6" 564 | }, 565 | "bin": { 566 | "detective": "bin/detective.js" 567 | }, 568 | "engines": { 569 | "node": ">=0.8.0" 570 | } 571 | }, 572 | "node_modules/didyoumean": { 573 | "version": "1.2.2", 574 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 575 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 576 | "dev": true 577 | }, 578 | "node_modules/dlv": { 579 | "version": "1.1.3", 580 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 581 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 582 | "dev": true 583 | }, 584 | "node_modules/electron-to-chromium": { 585 | "version": "1.4.308", 586 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.308.tgz", 587 | "integrity": "sha512-qyTx2aDFjEni4UnRWEME9ubd2Xc9c0zerTUl/ZinvD4QPsF0S7kJTV/Es/lPCTkNX6smyYar+z/n8Cl6pFr8yQ==", 588 | "dev": true 589 | }, 590 | "node_modules/esbuild": { 591 | "version": "0.15.18", 592 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", 593 | "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", 594 | "dev": true, 595 | "hasInstallScript": true, 596 | "bin": { 597 | "esbuild": "bin/esbuild" 598 | }, 599 | "engines": { 600 | "node": ">=12" 601 | }, 602 | "optionalDependencies": { 603 | "@esbuild/android-arm": "0.15.18", 604 | "@esbuild/linux-loong64": "0.15.18", 605 | "esbuild-android-64": "0.15.18", 606 | "esbuild-android-arm64": "0.15.18", 607 | "esbuild-darwin-64": "0.15.18", 608 | "esbuild-darwin-arm64": "0.15.18", 609 | "esbuild-freebsd-64": "0.15.18", 610 | "esbuild-freebsd-arm64": "0.15.18", 611 | "esbuild-linux-32": "0.15.18", 612 | "esbuild-linux-64": "0.15.18", 613 | "esbuild-linux-arm": "0.15.18", 614 | "esbuild-linux-arm64": "0.15.18", 615 | "esbuild-linux-mips64le": "0.15.18", 616 | "esbuild-linux-ppc64le": "0.15.18", 617 | "esbuild-linux-riscv64": "0.15.18", 618 | "esbuild-linux-s390x": "0.15.18", 619 | "esbuild-netbsd-64": "0.15.18", 620 | "esbuild-openbsd-64": "0.15.18", 621 | "esbuild-sunos-64": "0.15.18", 622 | "esbuild-windows-32": "0.15.18", 623 | "esbuild-windows-64": "0.15.18", 624 | "esbuild-windows-arm64": "0.15.18" 625 | } 626 | }, 627 | "node_modules/esbuild-android-64": { 628 | "version": "0.15.18", 629 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", 630 | "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", 631 | "cpu": [ 632 | "x64" 633 | ], 634 | "dev": true, 635 | "optional": true, 636 | "os": [ 637 | "android" 638 | ], 639 | "engines": { 640 | "node": ">=12" 641 | } 642 | }, 643 | "node_modules/esbuild-android-arm64": { 644 | "version": "0.15.18", 645 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", 646 | "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", 647 | "cpu": [ 648 | "arm64" 649 | ], 650 | "dev": true, 651 | "optional": true, 652 | "os": [ 653 | "android" 654 | ], 655 | "engines": { 656 | "node": ">=12" 657 | } 658 | }, 659 | "node_modules/esbuild-darwin-64": { 660 | "version": "0.15.18", 661 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", 662 | "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", 663 | "cpu": [ 664 | "x64" 665 | ], 666 | "dev": true, 667 | "optional": true, 668 | "os": [ 669 | "darwin" 670 | ], 671 | "engines": { 672 | "node": ">=12" 673 | } 674 | }, 675 | "node_modules/esbuild-darwin-arm64": { 676 | "version": "0.15.18", 677 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", 678 | "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", 679 | "cpu": [ 680 | "arm64" 681 | ], 682 | "dev": true, 683 | "optional": true, 684 | "os": [ 685 | "darwin" 686 | ], 687 | "engines": { 688 | "node": ">=12" 689 | } 690 | }, 691 | "node_modules/esbuild-freebsd-64": { 692 | "version": "0.15.18", 693 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", 694 | "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", 695 | "cpu": [ 696 | "x64" 697 | ], 698 | "dev": true, 699 | "optional": true, 700 | "os": [ 701 | "freebsd" 702 | ], 703 | "engines": { 704 | "node": ">=12" 705 | } 706 | }, 707 | "node_modules/esbuild-freebsd-arm64": { 708 | "version": "0.15.18", 709 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", 710 | "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", 711 | "cpu": [ 712 | "arm64" 713 | ], 714 | "dev": true, 715 | "optional": true, 716 | "os": [ 717 | "freebsd" 718 | ], 719 | "engines": { 720 | "node": ">=12" 721 | } 722 | }, 723 | "node_modules/esbuild-linux-32": { 724 | "version": "0.15.18", 725 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", 726 | "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", 727 | "cpu": [ 728 | "ia32" 729 | ], 730 | "dev": true, 731 | "optional": true, 732 | "os": [ 733 | "linux" 734 | ], 735 | "engines": { 736 | "node": ">=12" 737 | } 738 | }, 739 | "node_modules/esbuild-linux-64": { 740 | "version": "0.15.18", 741 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", 742 | "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", 743 | "cpu": [ 744 | "x64" 745 | ], 746 | "dev": true, 747 | "optional": true, 748 | "os": [ 749 | "linux" 750 | ], 751 | "engines": { 752 | "node": ">=12" 753 | } 754 | }, 755 | "node_modules/esbuild-linux-arm": { 756 | "version": "0.15.18", 757 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", 758 | "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", 759 | "cpu": [ 760 | "arm" 761 | ], 762 | "dev": true, 763 | "optional": true, 764 | "os": [ 765 | "linux" 766 | ], 767 | "engines": { 768 | "node": ">=12" 769 | } 770 | }, 771 | "node_modules/esbuild-linux-arm64": { 772 | "version": "0.15.18", 773 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", 774 | "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", 775 | "cpu": [ 776 | "arm64" 777 | ], 778 | "dev": true, 779 | "optional": true, 780 | "os": [ 781 | "linux" 782 | ], 783 | "engines": { 784 | "node": ">=12" 785 | } 786 | }, 787 | "node_modules/esbuild-linux-mips64le": { 788 | "version": "0.15.18", 789 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", 790 | "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", 791 | "cpu": [ 792 | "mips64el" 793 | ], 794 | "dev": true, 795 | "optional": true, 796 | "os": [ 797 | "linux" 798 | ], 799 | "engines": { 800 | "node": ">=12" 801 | } 802 | }, 803 | "node_modules/esbuild-linux-ppc64le": { 804 | "version": "0.15.18", 805 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", 806 | "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", 807 | "cpu": [ 808 | "ppc64" 809 | ], 810 | "dev": true, 811 | "optional": true, 812 | "os": [ 813 | "linux" 814 | ], 815 | "engines": { 816 | "node": ">=12" 817 | } 818 | }, 819 | "node_modules/esbuild-linux-riscv64": { 820 | "version": "0.15.18", 821 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", 822 | "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", 823 | "cpu": [ 824 | "riscv64" 825 | ], 826 | "dev": true, 827 | "optional": true, 828 | "os": [ 829 | "linux" 830 | ], 831 | "engines": { 832 | "node": ">=12" 833 | } 834 | }, 835 | "node_modules/esbuild-linux-s390x": { 836 | "version": "0.15.18", 837 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", 838 | "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", 839 | "cpu": [ 840 | "s390x" 841 | ], 842 | "dev": true, 843 | "optional": true, 844 | "os": [ 845 | "linux" 846 | ], 847 | "engines": { 848 | "node": ">=12" 849 | } 850 | }, 851 | "node_modules/esbuild-netbsd-64": { 852 | "version": "0.15.18", 853 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", 854 | "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", 855 | "cpu": [ 856 | "x64" 857 | ], 858 | "dev": true, 859 | "optional": true, 860 | "os": [ 861 | "netbsd" 862 | ], 863 | "engines": { 864 | "node": ">=12" 865 | } 866 | }, 867 | "node_modules/esbuild-openbsd-64": { 868 | "version": "0.15.18", 869 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", 870 | "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", 871 | "cpu": [ 872 | "x64" 873 | ], 874 | "dev": true, 875 | "optional": true, 876 | "os": [ 877 | "openbsd" 878 | ], 879 | "engines": { 880 | "node": ">=12" 881 | } 882 | }, 883 | "node_modules/esbuild-sunos-64": { 884 | "version": "0.15.18", 885 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", 886 | "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", 887 | "cpu": [ 888 | "x64" 889 | ], 890 | "dev": true, 891 | "optional": true, 892 | "os": [ 893 | "sunos" 894 | ], 895 | "engines": { 896 | "node": ">=12" 897 | } 898 | }, 899 | "node_modules/esbuild-windows-32": { 900 | "version": "0.15.18", 901 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", 902 | "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", 903 | "cpu": [ 904 | "ia32" 905 | ], 906 | "dev": true, 907 | "optional": true, 908 | "os": [ 909 | "win32" 910 | ], 911 | "engines": { 912 | "node": ">=12" 913 | } 914 | }, 915 | "node_modules/esbuild-windows-64": { 916 | "version": "0.15.18", 917 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", 918 | "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", 919 | "cpu": [ 920 | "x64" 921 | ], 922 | "dev": true, 923 | "optional": true, 924 | "os": [ 925 | "win32" 926 | ], 927 | "engines": { 928 | "node": ">=12" 929 | } 930 | }, 931 | "node_modules/esbuild-windows-arm64": { 932 | "version": "0.15.18", 933 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", 934 | "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", 935 | "cpu": [ 936 | "arm64" 937 | ], 938 | "dev": true, 939 | "optional": true, 940 | "os": [ 941 | "win32" 942 | ], 943 | "engines": { 944 | "node": ">=12" 945 | } 946 | }, 947 | "node_modules/escalade": { 948 | "version": "3.1.1", 949 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 950 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 951 | "dev": true, 952 | "engines": { 953 | "node": ">=6" 954 | } 955 | }, 956 | "node_modules/estree-walker": { 957 | "version": "2.0.2", 958 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 959 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 960 | }, 961 | "node_modules/fast-glob": { 962 | "version": "3.2.12", 963 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 964 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 965 | "dev": true, 966 | "dependencies": { 967 | "@nodelib/fs.stat": "^2.0.2", 968 | "@nodelib/fs.walk": "^1.2.3", 969 | "glob-parent": "^5.1.2", 970 | "merge2": "^1.3.0", 971 | "micromatch": "^4.0.4" 972 | }, 973 | "engines": { 974 | "node": ">=8.6.0" 975 | } 976 | }, 977 | "node_modules/fast-glob/node_modules/glob-parent": { 978 | "version": "5.1.2", 979 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 980 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 981 | "dev": true, 982 | "dependencies": { 983 | "is-glob": "^4.0.1" 984 | }, 985 | "engines": { 986 | "node": ">= 6" 987 | } 988 | }, 989 | "node_modules/fastq": { 990 | "version": "1.15.0", 991 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 992 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 993 | "dev": true, 994 | "dependencies": { 995 | "reusify": "^1.0.4" 996 | } 997 | }, 998 | "node_modules/fill-range": { 999 | "version": "7.0.1", 1000 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1001 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1002 | "dev": true, 1003 | "dependencies": { 1004 | "to-regex-range": "^5.0.1" 1005 | }, 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/fraction.js": { 1011 | "version": "4.2.0", 1012 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1013 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1014 | "dev": true, 1015 | "engines": { 1016 | "node": "*" 1017 | }, 1018 | "funding": { 1019 | "type": "patreon", 1020 | "url": "https://www.patreon.com/infusion" 1021 | } 1022 | }, 1023 | "node_modules/fsevents": { 1024 | "version": "2.3.2", 1025 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1026 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1027 | "dev": true, 1028 | "hasInstallScript": true, 1029 | "optional": true, 1030 | "os": [ 1031 | "darwin" 1032 | ], 1033 | "engines": { 1034 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1035 | } 1036 | }, 1037 | "node_modules/function-bind": { 1038 | "version": "1.1.1", 1039 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1040 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1041 | "dev": true 1042 | }, 1043 | "node_modules/glob-parent": { 1044 | "version": "6.0.2", 1045 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1046 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1047 | "dev": true, 1048 | "dependencies": { 1049 | "is-glob": "^4.0.3" 1050 | }, 1051 | "engines": { 1052 | "node": ">=10.13.0" 1053 | } 1054 | }, 1055 | "node_modules/has": { 1056 | "version": "1.0.3", 1057 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1058 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "function-bind": "^1.1.1" 1062 | }, 1063 | "engines": { 1064 | "node": ">= 0.4.0" 1065 | } 1066 | }, 1067 | "node_modules/hookable": { 1068 | "version": "5.4.2", 1069 | "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz", 1070 | "integrity": "sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==" 1071 | }, 1072 | "node_modules/is-binary-path": { 1073 | "version": "2.1.0", 1074 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1075 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1076 | "dev": true, 1077 | "dependencies": { 1078 | "binary-extensions": "^2.0.0" 1079 | }, 1080 | "engines": { 1081 | "node": ">=8" 1082 | } 1083 | }, 1084 | "node_modules/is-core-module": { 1085 | "version": "2.11.0", 1086 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1087 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1088 | "dev": true, 1089 | "dependencies": { 1090 | "has": "^1.0.3" 1091 | }, 1092 | "funding": { 1093 | "url": "https://github.com/sponsors/ljharb" 1094 | } 1095 | }, 1096 | "node_modules/is-extglob": { 1097 | "version": "2.1.1", 1098 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1099 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1100 | "dev": true, 1101 | "engines": { 1102 | "node": ">=0.10.0" 1103 | } 1104 | }, 1105 | "node_modules/is-glob": { 1106 | "version": "4.0.3", 1107 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1108 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "is-extglob": "^2.1.1" 1112 | }, 1113 | "engines": { 1114 | "node": ">=0.10.0" 1115 | } 1116 | }, 1117 | "node_modules/is-number": { 1118 | "version": "7.0.0", 1119 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1120 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1121 | "dev": true, 1122 | "engines": { 1123 | "node": ">=0.12.0" 1124 | } 1125 | }, 1126 | "node_modules/lilconfig": { 1127 | "version": "2.0.6", 1128 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 1129 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 1130 | "dev": true, 1131 | "engines": { 1132 | "node": ">=10" 1133 | } 1134 | }, 1135 | "node_modules/magic-string": { 1136 | "version": "0.25.9", 1137 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1138 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1139 | "dependencies": { 1140 | "sourcemap-codec": "^1.4.8" 1141 | } 1142 | }, 1143 | "node_modules/merge2": { 1144 | "version": "1.4.1", 1145 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1146 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1147 | "dev": true, 1148 | "engines": { 1149 | "node": ">= 8" 1150 | } 1151 | }, 1152 | "node_modules/micromatch": { 1153 | "version": "4.0.5", 1154 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1155 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1156 | "dev": true, 1157 | "dependencies": { 1158 | "braces": "^3.0.2", 1159 | "picomatch": "^2.3.1" 1160 | }, 1161 | "engines": { 1162 | "node": ">=8.6" 1163 | } 1164 | }, 1165 | "node_modules/minimist": { 1166 | "version": "1.2.8", 1167 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1168 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1169 | "dev": true, 1170 | "funding": { 1171 | "url": "https://github.com/sponsors/ljharb" 1172 | } 1173 | }, 1174 | "node_modules/nanoid": { 1175 | "version": "3.3.4", 1176 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1177 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1178 | "bin": { 1179 | "nanoid": "bin/nanoid.cjs" 1180 | }, 1181 | "engines": { 1182 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1183 | } 1184 | }, 1185 | "node_modules/node-releases": { 1186 | "version": "2.0.10", 1187 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 1188 | "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 1189 | "dev": true 1190 | }, 1191 | "node_modules/normalize-path": { 1192 | "version": "3.0.0", 1193 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1194 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1195 | "dev": true, 1196 | "engines": { 1197 | "node": ">=0.10.0" 1198 | } 1199 | }, 1200 | "node_modules/normalize-range": { 1201 | "version": "0.1.2", 1202 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1203 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1204 | "dev": true, 1205 | "engines": { 1206 | "node": ">=0.10.0" 1207 | } 1208 | }, 1209 | "node_modules/object-hash": { 1210 | "version": "3.0.0", 1211 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1212 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1213 | "dev": true, 1214 | "engines": { 1215 | "node": ">= 6" 1216 | } 1217 | }, 1218 | "node_modules/path-parse": { 1219 | "version": "1.0.7", 1220 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1221 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1222 | "dev": true 1223 | }, 1224 | "node_modules/picocolors": { 1225 | "version": "1.0.0", 1226 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1227 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1228 | }, 1229 | "node_modules/picomatch": { 1230 | "version": "2.3.1", 1231 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1232 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1233 | "dev": true, 1234 | "engines": { 1235 | "node": ">=8.6" 1236 | }, 1237 | "funding": { 1238 | "url": "https://github.com/sponsors/jonschlinkert" 1239 | } 1240 | }, 1241 | "node_modules/pify": { 1242 | "version": "2.3.0", 1243 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1244 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1245 | "dev": true, 1246 | "engines": { 1247 | "node": ">=0.10.0" 1248 | } 1249 | }, 1250 | "node_modules/pinia": { 1251 | "version": "2.0.32", 1252 | "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.32.tgz", 1253 | "integrity": "sha512-8Tw4OrpCSJ028UUyp0gYPP/wyjigLoEceuO/x1G+FlHVf73337e5vLm4uDmrRIoBG1hvaed/eSHnrCFjOc4nkA==", 1254 | "dependencies": { 1255 | "@vue/devtools-api": "^6.5.0", 1256 | "vue-demi": "*" 1257 | }, 1258 | "funding": { 1259 | "url": "https://github.com/sponsors/posva" 1260 | }, 1261 | "peerDependencies": { 1262 | "@vue/composition-api": "^1.4.0", 1263 | "typescript": ">=4.4.4", 1264 | "vue": "^2.6.14 || ^3.2.0" 1265 | }, 1266 | "peerDependenciesMeta": { 1267 | "@vue/composition-api": { 1268 | "optional": true 1269 | }, 1270 | "typescript": { 1271 | "optional": true 1272 | } 1273 | } 1274 | }, 1275 | "node_modules/pinia/node_modules/vue-demi": { 1276 | "version": "0.13.11", 1277 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", 1278 | "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", 1279 | "hasInstallScript": true, 1280 | "bin": { 1281 | "vue-demi-fix": "bin/vue-demi-fix.js", 1282 | "vue-demi-switch": "bin/vue-demi-switch.js" 1283 | }, 1284 | "engines": { 1285 | "node": ">=12" 1286 | }, 1287 | "funding": { 1288 | "url": "https://github.com/sponsors/antfu" 1289 | }, 1290 | "peerDependencies": { 1291 | "@vue/composition-api": "^1.0.0-rc.1", 1292 | "vue": "^3.0.0-0 || ^2.6.0" 1293 | }, 1294 | "peerDependenciesMeta": { 1295 | "@vue/composition-api": { 1296 | "optional": true 1297 | } 1298 | } 1299 | }, 1300 | "node_modules/playwright-core": { 1301 | "version": "1.31.0", 1302 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.0.tgz", 1303 | "integrity": "sha512-/KquBjS5DcASCh8cGeNVHuC0kyb7c9plKTwaKxgOGtxT7+DZO2fjmFvPDBSXslEIK5CeOO/2kk5rOCktFXKEdA==", 1304 | "dev": true, 1305 | "bin": { 1306 | "playwright": "cli.js" 1307 | }, 1308 | "engines": { 1309 | "node": ">=14" 1310 | } 1311 | }, 1312 | "node_modules/postcss": { 1313 | "version": "8.4.21", 1314 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 1315 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 1316 | "funding": [ 1317 | { 1318 | "type": "opencollective", 1319 | "url": "https://opencollective.com/postcss/" 1320 | }, 1321 | { 1322 | "type": "tidelift", 1323 | "url": "https://tidelift.com/funding/github/npm/postcss" 1324 | } 1325 | ], 1326 | "dependencies": { 1327 | "nanoid": "^3.3.4", 1328 | "picocolors": "^1.0.0", 1329 | "source-map-js": "^1.0.2" 1330 | }, 1331 | "engines": { 1332 | "node": "^10 || ^12 || >=14" 1333 | } 1334 | }, 1335 | "node_modules/postcss-import": { 1336 | "version": "14.1.0", 1337 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 1338 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "postcss-value-parser": "^4.0.0", 1342 | "read-cache": "^1.0.0", 1343 | "resolve": "^1.1.7" 1344 | }, 1345 | "engines": { 1346 | "node": ">=10.0.0" 1347 | }, 1348 | "peerDependencies": { 1349 | "postcss": "^8.0.0" 1350 | } 1351 | }, 1352 | "node_modules/postcss-js": { 1353 | "version": "4.0.1", 1354 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 1355 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 1356 | "dev": true, 1357 | "dependencies": { 1358 | "camelcase-css": "^2.0.1" 1359 | }, 1360 | "engines": { 1361 | "node": "^12 || ^14 || >= 16" 1362 | }, 1363 | "funding": { 1364 | "type": "opencollective", 1365 | "url": "https://opencollective.com/postcss/" 1366 | }, 1367 | "peerDependencies": { 1368 | "postcss": "^8.4.21" 1369 | } 1370 | }, 1371 | "node_modules/postcss-load-config": { 1372 | "version": "3.1.4", 1373 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 1374 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "lilconfig": "^2.0.5", 1378 | "yaml": "^1.10.2" 1379 | }, 1380 | "engines": { 1381 | "node": ">= 10" 1382 | }, 1383 | "funding": { 1384 | "type": "opencollective", 1385 | "url": "https://opencollective.com/postcss/" 1386 | }, 1387 | "peerDependencies": { 1388 | "postcss": ">=8.0.9", 1389 | "ts-node": ">=9.0.0" 1390 | }, 1391 | "peerDependenciesMeta": { 1392 | "postcss": { 1393 | "optional": true 1394 | }, 1395 | "ts-node": { 1396 | "optional": true 1397 | } 1398 | } 1399 | }, 1400 | "node_modules/postcss-nested": { 1401 | "version": "6.0.0", 1402 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 1403 | "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 1404 | "dev": true, 1405 | "dependencies": { 1406 | "postcss-selector-parser": "^6.0.10" 1407 | }, 1408 | "engines": { 1409 | "node": ">=12.0" 1410 | }, 1411 | "funding": { 1412 | "type": "opencollective", 1413 | "url": "https://opencollective.com/postcss/" 1414 | }, 1415 | "peerDependencies": { 1416 | "postcss": "^8.2.14" 1417 | } 1418 | }, 1419 | "node_modules/postcss-selector-parser": { 1420 | "version": "6.0.11", 1421 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", 1422 | "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", 1423 | "dev": true, 1424 | "dependencies": { 1425 | "cssesc": "^3.0.0", 1426 | "util-deprecate": "^1.0.2" 1427 | }, 1428 | "engines": { 1429 | "node": ">=4" 1430 | } 1431 | }, 1432 | "node_modules/postcss-value-parser": { 1433 | "version": "4.2.0", 1434 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1435 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1436 | "dev": true 1437 | }, 1438 | "node_modules/queue-microtask": { 1439 | "version": "1.2.3", 1440 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1441 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1442 | "dev": true, 1443 | "funding": [ 1444 | { 1445 | "type": "github", 1446 | "url": "https://github.com/sponsors/feross" 1447 | }, 1448 | { 1449 | "type": "patreon", 1450 | "url": "https://www.patreon.com/feross" 1451 | }, 1452 | { 1453 | "type": "consulting", 1454 | "url": "https://feross.org/support" 1455 | } 1456 | ] 1457 | }, 1458 | "node_modules/quick-lru": { 1459 | "version": "5.1.1", 1460 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1461 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1462 | "dev": true, 1463 | "engines": { 1464 | "node": ">=10" 1465 | }, 1466 | "funding": { 1467 | "url": "https://github.com/sponsors/sindresorhus" 1468 | } 1469 | }, 1470 | "node_modules/read-cache": { 1471 | "version": "1.0.0", 1472 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1473 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1474 | "dev": true, 1475 | "dependencies": { 1476 | "pify": "^2.3.0" 1477 | } 1478 | }, 1479 | "node_modules/readdirp": { 1480 | "version": "3.6.0", 1481 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1482 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1483 | "dev": true, 1484 | "dependencies": { 1485 | "picomatch": "^2.2.1" 1486 | }, 1487 | "engines": { 1488 | "node": ">=8.10.0" 1489 | } 1490 | }, 1491 | "node_modules/resolve": { 1492 | "version": "1.22.1", 1493 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1494 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1495 | "dev": true, 1496 | "dependencies": { 1497 | "is-core-module": "^2.9.0", 1498 | "path-parse": "^1.0.7", 1499 | "supports-preserve-symlinks-flag": "^1.0.0" 1500 | }, 1501 | "bin": { 1502 | "resolve": "bin/resolve" 1503 | }, 1504 | "funding": { 1505 | "url": "https://github.com/sponsors/ljharb" 1506 | } 1507 | }, 1508 | "node_modules/reusify": { 1509 | "version": "1.0.4", 1510 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1511 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1512 | "dev": true, 1513 | "engines": { 1514 | "iojs": ">=1.0.0", 1515 | "node": ">=0.10.0" 1516 | } 1517 | }, 1518 | "node_modules/rollup": { 1519 | "version": "2.79.1", 1520 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 1521 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 1522 | "dev": true, 1523 | "bin": { 1524 | "rollup": "dist/bin/rollup" 1525 | }, 1526 | "engines": { 1527 | "node": ">=10.0.0" 1528 | }, 1529 | "optionalDependencies": { 1530 | "fsevents": "~2.3.2" 1531 | } 1532 | }, 1533 | "node_modules/run-parallel": { 1534 | "version": "1.2.0", 1535 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1536 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1537 | "dev": true, 1538 | "funding": [ 1539 | { 1540 | "type": "github", 1541 | "url": "https://github.com/sponsors/feross" 1542 | }, 1543 | { 1544 | "type": "patreon", 1545 | "url": "https://www.patreon.com/feross" 1546 | }, 1547 | { 1548 | "type": "consulting", 1549 | "url": "https://feross.org/support" 1550 | } 1551 | ], 1552 | "dependencies": { 1553 | "queue-microtask": "^1.2.2" 1554 | } 1555 | }, 1556 | "node_modules/source-map": { 1557 | "version": "0.6.1", 1558 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1559 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1560 | "engines": { 1561 | "node": ">=0.10.0" 1562 | } 1563 | }, 1564 | "node_modules/source-map-js": { 1565 | "version": "1.0.2", 1566 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1567 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1568 | "engines": { 1569 | "node": ">=0.10.0" 1570 | } 1571 | }, 1572 | "node_modules/sourcemap-codec": { 1573 | "version": "1.4.8", 1574 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1575 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1576 | "deprecated": "Please use @jridgewell/sourcemap-codec instead" 1577 | }, 1578 | "node_modules/supports-preserve-symlinks-flag": { 1579 | "version": "1.0.0", 1580 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1581 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1582 | "dev": true, 1583 | "engines": { 1584 | "node": ">= 0.4" 1585 | }, 1586 | "funding": { 1587 | "url": "https://github.com/sponsors/ljharb" 1588 | } 1589 | }, 1590 | "node_modules/tailwindcss": { 1591 | "version": "3.2.7", 1592 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", 1593 | "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", 1594 | "dev": true, 1595 | "dependencies": { 1596 | "arg": "^5.0.2", 1597 | "chokidar": "^3.5.3", 1598 | "color-name": "^1.1.4", 1599 | "detective": "^5.2.1", 1600 | "didyoumean": "^1.2.2", 1601 | "dlv": "^1.1.3", 1602 | "fast-glob": "^3.2.12", 1603 | "glob-parent": "^6.0.2", 1604 | "is-glob": "^4.0.3", 1605 | "lilconfig": "^2.0.6", 1606 | "micromatch": "^4.0.5", 1607 | "normalize-path": "^3.0.0", 1608 | "object-hash": "^3.0.0", 1609 | "picocolors": "^1.0.0", 1610 | "postcss": "^8.0.9", 1611 | "postcss-import": "^14.1.0", 1612 | "postcss-js": "^4.0.0", 1613 | "postcss-load-config": "^3.1.4", 1614 | "postcss-nested": "6.0.0", 1615 | "postcss-selector-parser": "^6.0.11", 1616 | "postcss-value-parser": "^4.2.0", 1617 | "quick-lru": "^5.1.1", 1618 | "resolve": "^1.22.1" 1619 | }, 1620 | "bin": { 1621 | "tailwind": "lib/cli.js", 1622 | "tailwindcss": "lib/cli.js" 1623 | }, 1624 | "engines": { 1625 | "node": ">=12.13.0" 1626 | }, 1627 | "peerDependencies": { 1628 | "postcss": "^8.0.9" 1629 | } 1630 | }, 1631 | "node_modules/to-regex-range": { 1632 | "version": "5.0.1", 1633 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1634 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1635 | "dev": true, 1636 | "dependencies": { 1637 | "is-number": "^7.0.0" 1638 | }, 1639 | "engines": { 1640 | "node": ">=8.0" 1641 | } 1642 | }, 1643 | "node_modules/unhead": { 1644 | "version": "1.1.15", 1645 | "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.1.15.tgz", 1646 | "integrity": "sha512-rpOTD35CDz9KFvBKt42KRKZRsYIDY7Sjh5XhBL2SH6XUHdRdqTDIVjHtrxIwRQkfnMdUAZUSy6KYaiAMQFUOiw==", 1647 | "dependencies": { 1648 | "@unhead/dom": "1.1.15", 1649 | "@unhead/schema": "1.1.15", 1650 | "@unhead/shared": "1.1.15", 1651 | "hookable": "^5.4.2" 1652 | }, 1653 | "funding": { 1654 | "url": "https://github.com/sponsors/harlan-zw" 1655 | } 1656 | }, 1657 | "node_modules/update-browserslist-db": { 1658 | "version": "1.0.10", 1659 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 1660 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 1661 | "dev": true, 1662 | "funding": [ 1663 | { 1664 | "type": "opencollective", 1665 | "url": "https://opencollective.com/browserslist" 1666 | }, 1667 | { 1668 | "type": "tidelift", 1669 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1670 | } 1671 | ], 1672 | "dependencies": { 1673 | "escalade": "^3.1.1", 1674 | "picocolors": "^1.0.0" 1675 | }, 1676 | "bin": { 1677 | "browserslist-lint": "cli.js" 1678 | }, 1679 | "peerDependencies": { 1680 | "browserslist": ">= 4.21.0" 1681 | } 1682 | }, 1683 | "node_modules/util-deprecate": { 1684 | "version": "1.0.2", 1685 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1686 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1687 | "dev": true 1688 | }, 1689 | "node_modules/vite": { 1690 | "version": "3.2.5", 1691 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", 1692 | "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", 1693 | "dev": true, 1694 | "dependencies": { 1695 | "esbuild": "^0.15.9", 1696 | "postcss": "^8.4.18", 1697 | "resolve": "^1.22.1", 1698 | "rollup": "^2.79.1" 1699 | }, 1700 | "bin": { 1701 | "vite": "bin/vite.js" 1702 | }, 1703 | "engines": { 1704 | "node": "^14.18.0 || >=16.0.0" 1705 | }, 1706 | "optionalDependencies": { 1707 | "fsevents": "~2.3.2" 1708 | }, 1709 | "peerDependencies": { 1710 | "@types/node": ">= 14", 1711 | "less": "*", 1712 | "sass": "*", 1713 | "stylus": "*", 1714 | "sugarss": "*", 1715 | "terser": "^5.4.0" 1716 | }, 1717 | "peerDependenciesMeta": { 1718 | "@types/node": { 1719 | "optional": true 1720 | }, 1721 | "less": { 1722 | "optional": true 1723 | }, 1724 | "sass": { 1725 | "optional": true 1726 | }, 1727 | "stylus": { 1728 | "optional": true 1729 | }, 1730 | "sugarss": { 1731 | "optional": true 1732 | }, 1733 | "terser": { 1734 | "optional": true 1735 | } 1736 | } 1737 | }, 1738 | "node_modules/vue": { 1739 | "version": "3.2.47", 1740 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", 1741 | "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", 1742 | "dependencies": { 1743 | "@vue/compiler-dom": "3.2.47", 1744 | "@vue/compiler-sfc": "3.2.47", 1745 | "@vue/runtime-dom": "3.2.47", 1746 | "@vue/server-renderer": "3.2.47", 1747 | "@vue/shared": "3.2.47" 1748 | } 1749 | }, 1750 | "node_modules/vue-router": { 1751 | "version": "4.1.6", 1752 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", 1753 | "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", 1754 | "dependencies": { 1755 | "@vue/devtools-api": "^6.4.5" 1756 | }, 1757 | "funding": { 1758 | "url": "https://github.com/sponsors/posva" 1759 | }, 1760 | "peerDependencies": { 1761 | "vue": "^3.2.0" 1762 | } 1763 | }, 1764 | "node_modules/xtend": { 1765 | "version": "4.0.2", 1766 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1767 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1768 | "dev": true, 1769 | "engines": { 1770 | "node": ">=0.4" 1771 | } 1772 | }, 1773 | "node_modules/yaml": { 1774 | "version": "1.10.2", 1775 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1776 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1777 | "dev": true, 1778 | "engines": { 1779 | "node": ">= 6" 1780 | } 1781 | }, 1782 | "node_modules/zhead": { 1783 | "version": "2.0.4", 1784 | "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.0.4.tgz", 1785 | "integrity": "sha512-V4R94t3ifk9AURym6OskbKcnowzgp5Z88tkoL/NF67vyryNxC62u6mx5F1Ux4oh4+YN7FFmKYEyWy6m5kfPH6g==", 1786 | "funding": { 1787 | "url": "https://github.com/sponsors/harlan-zw" 1788 | } 1789 | } 1790 | } 1791 | } 1792 | --------------------------------------------------------------------------------