├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── frontend ├── .gitignore ├── .vscode │ └── extensions.json ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── pages │ ├── example.html │ └── example.ts ├── src │ ├── App.svelte │ ├── assets │ │ ├── github-mark-white.svg │ │ ├── github-mark.svg │ │ ├── svelte.svg │ │ └── vite.svg │ ├── lib │ │ └── Counter.svelte │ ├── main.css │ ├── main.ts │ └── vite-env.d.ts ├── svelte.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── main.py └── requirements.txt /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # My ignores 2 | public 3 | 4 | # Byte-compiled / optimized / DLL files 5 | __pycache__/ 6 | *.py[cod] 7 | *$py.class 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | wheels/ 26 | share/python-wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | *.py,cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | cover/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | db.sqlite3-journal 66 | 67 | # Flask stuff: 68 | instance/ 69 | .webassets-cache 70 | 71 | # Scrapy stuff: 72 | .scrapy 73 | 74 | # Sphinx documentation 75 | docs/_build/ 76 | 77 | # PyBuilder 78 | .pybuilder/ 79 | target/ 80 | 81 | # Jupyter Notebook 82 | .ipynb_checkpoints 83 | 84 | # IPython 85 | profile_default/ 86 | ipython_config.py 87 | 88 | # pyenv 89 | # For a library or package, you might want to ignore these files since the code is 90 | # intended to run in multiple environments; otherwise, check them in: 91 | # .python-version 92 | 93 | # pipenv 94 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 95 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 96 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 97 | # install all needed dependencies. 98 | #Pipfile.lock 99 | 100 | # poetry 101 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 102 | # This is especially recommended for binary packages to ensure reproducibility, and is more 103 | # commonly ignored for libraries. 104 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 105 | #poetry.lock 106 | 107 | # pdm 108 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 109 | #pdm.lock 110 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 111 | # in version control. 112 | # https://pdm.fming.dev/#use-with-ide 113 | .pdm.toml 114 | 115 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 116 | __pypackages__/ 117 | 118 | # Celery stuff 119 | celerybeat-schedule 120 | celerybeat.pid 121 | 122 | # SageMath parsed files 123 | *.sage.py 124 | 125 | # Environments 126 | .env 127 | .venv 128 | env/ 129 | venv/ 130 | ENV/ 131 | env.bak/ 132 | venv.bak/ 133 | 134 | # Spyder project settings 135 | .spyderproject 136 | .spyproject 137 | 138 | # Rope project settings 139 | .ropeproject 140 | 141 | # mkdocs documentation 142 | /site 143 | 144 | # mypy 145 | .mypy_cache/ 146 | .dmypy.json 147 | dmypy.json 148 | 149 | # Pyre type checker 150 | .pyre/ 151 | 152 | # pytype static type analyzer 153 | .pytype/ 154 | 155 | # Cython debug symbols 156 | cython_debug/ 157 | 158 | # PyCharm 159 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 160 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 161 | # and can be added to the global gitignore or merged into this file. For a more nuclear 162 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 163 | #.idea/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.analysis.typeCheckingMode": "basic" 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > **1Q2024 update**
3 | > Setup in Main branch is currently outdated, it worked for svelte 3, but there is an **[update to svelte 4](https://github.com/OriginalStefikO/fastapi-svelte-starter/tree/update-to-svelte4)** branch. It works with static router and prerendering (also trailing slash enabled for FastAPI). Sadly I don't have time to create the tutorial for it (like for the last version) right now, as i'm approaching the end of High school. So I won't push to main yet 4 | >

5 | > In July when I have time again, there will probably be Svelte 5 and I'm not thinking of leaving svelte behind at all, so update will probably arrive. Thanks for your time and support. 6 | 7 | Buy Me A Coffee 8 | 9 | # How to setup Fastapi with Svelte 10 | 11 | - Requirements: 12 | - [Python 3.10+](https://www.python.org/downloads/) 13 | - [NodeJS](https://nodejs.org/en) 14 | 15 | ## Installation without custom setup: 16 | 17 |
18 | Click here to expand 19 | 20 | 1. Clone this repository 21 | 22 | ```git 23 | git clone https://github.com/OriginalStefikO/fastapi-svelte-starter.git . 24 | ``` 25 | 26 | 2. Create Python virtual enviroment (further just venv)(optional, but will prevent some unexpected errors) 27 | - when you restart your workspace you will need to activate it again, just run the second line 28 | 29 | > first we create venv from our python installation 30 | ```cmd 31 | ~\AppData\Local\Programs\Python\Python311\python -m venv venv 32 | venv\Scripts\activate 33 | pip install -r requirements.txt #Here are just 34 | ``` 35 | > after that we activate it and install needed dependencies 36 | 37 | 3. Get all svelte packages 38 | ```cmd 39 | cd ./frontend 40 | npm install 41 | cd ../ 42 | ``` 43 | 44 | 4. Build svelte and run fastapi with uvicorn 45 | ```cmd 46 | cd ./frontend 47 | npm run build; cd ../ 48 | uvicorn main:app --reload 49 | ``` 50 | 5. When developing in Svelte, you can use dev server 51 | ```cmd 52 | npm run dev 53 | ``` 54 | 55 |
56 | 57 | # My way of setting up **Fastapi + Svelte** Hello world (1Q2023) 58 | 59 | ## How to setup **[FasAPI](https://fastapi.tiangolo.com)** with **[Svelte](https://svelte.dev)** using **Vite** 60 | 61 | #### This repo is just me trying to setup Fastapi with Svelte, I'm no expert and I just started, I just did't find any updated tutorials for this, so I made my own. 62 | 63 | ### Setting up Fastapi 64 | 65 | 1. Create Python Virtual Enviroment (further just venv) 66 | - this will make our life easier 67 | - when you restart your workspace you will need to activate it again, just run the second line 68 | 69 | > first we create venv from our python installation 70 | ``` 71 | ~\AppData\Local\Programs\Python\Python311\python -m venv venv 72 | 73 | venv\Scripts\activate 74 | ``` 75 | > after that we activate it 76 | 77 | 2. Create main.py 78 | ```py 79 | from fastapi import FastAPI 80 | from fastapi.responses import FileResponse 81 | from fastapi.staticfiles import StaticFiles 82 | 83 | app = FastAPI() 84 | 85 | # Define our static folder, where will be our svelte build later 86 | app.mount("/assets", StaticFiles(directory="public/assets"), name="static") 87 | 88 | # Simply the root will return our Svelte build 89 | @app.get("/", response_class=FileResponse) 90 | async def main(): 91 | return "public/index.html" 92 | ``` 93 | 94 | 3. Download dependencies 95 | - Make sure your venv is activate, if not activate it 96 | - it may ask you to install autopep8, type yes 97 | 98 | ``` 99 | pip install fastapi 100 | pip install "uvicorn[standard]" 101 | ``` 102 | 103 | 4. Run the Fastapi with uvicorn (not now, it won't work, we are missing frontend) 104 | ```cmd 105 | uvicorn main:app --reload 106 | ``` 107 | 108 | ### Setting up Svelte with Vite 109 | 110 | 1. Start by initializing Vite: 111 | - Choose the following options: 112 | - Package name: `frontend` 113 | - Install packages: `yes` 114 | - Template: `Svelte` 115 | - Typescript: `TS` I recommend typescript, you won't hate your life later haha 116 | 117 | ```cmd 118 | npm init vite; 119 | cd frontend; 120 | npm install 121 | ``` 122 | 123 | 2. Now it still won't work, we need to edit config first 124 | - find vite.config.ts 125 | - I made two scripts, the easy one and the better one, the second will make your life easier I think 126 | 127 | ```ts 128 | export default defineConfig({ 129 | plugins: [svelte()], 130 | base: './', 131 | build: { 132 | outDir: '../public', 133 | assetsDir: 'assets', 134 | emptyOutDir: true, 135 | }, 136 | }) 137 | ``` 138 | 139 | ```ts 140 | export default defineConfig({ 141 | plugins: [svelte()], 142 | base: "./", // This will make paths relative 143 | build: { 144 | emptyOutDir: true, 145 | outDir: '../public', // Where we want to put the build 146 | assetsDir: 'assets', // This will be folder inside the public 147 | rollupOptions: { 148 | input: { 149 | main: './index.html', // This index.html will be in public folder 150 | // if you have more pages, just add them bellow like this: 151 | // example: './pages/example.html', 152 | }, 153 | output: { 154 | entryFileNames: 'assets/js/[name]-[hash].js', // Here we put all js files into js folder 155 | chunkFileNames: 'assets/js/[name]-[hash].js', 156 | // But after that we need to define which files should go where with regex 157 | assetFileNames: ({ name }) => { 158 | if (/\.(gif|jpe?g|png|svg)$/.test(name ?? '')) { 159 | return 'assets/images/[name].[ext]'; 160 | } 161 | 162 | if (/\.css$/.test(name ?? '')) { 163 | return 'assets/css/[name]-[hash].[ext]'; 164 | } 165 | 166 | return 'assets/[name]-[hash].[ext]'; 167 | }, 168 | } 169 | } 170 | } 171 | }) 172 | ``` 173 | 174 | > When we build our app now, it will build it to "public" folder and the files should be in their correct subfolders 175 | 176 | *** 177 | 178 | > When you want to run or build svelte, just run one of those in ./frontend 179 | ```cmd 180 | npm run dev 181 | npm run build 182 | ``` 183 | 184 | > and as I said before, to run fastapi, run 185 | ```cmd 186 | uvicorn main:app --reload 187 | ``` 188 | 189 | ### That's it! You should now have a fully functional application with a FastAPI backend and Svelte frontend. Of course, this is just a starting point and you can customize and add to it as needed for your own projects. 190 | -------------------------------------------------------------------------------- /frontend/.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 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["svelte.svelte-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Svelte + TS + Vite 2 | 3 | This template should help get you started developing with Svelte and TypeScript in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). 8 | 9 | ## Need an official Svelte framework? 10 | 11 | Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. 12 | 13 | ## Technical considerations 14 | 15 | **Why use this over SvelteKit?** 16 | 17 | - It brings its own routing solution which might not be preferable for some users. 18 | - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. 19 | 20 | This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. 21 | 22 | Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. 23 | 24 | **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** 25 | 26 | Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. 27 | 28 | **Why include `.vscode/extensions.json`?** 29 | 30 | Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. 31 | 32 | **Why enable `allowJs` in the TS template?** 33 | 34 | While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. 35 | 36 | **Why is HMR not preserving my local component state?** 37 | 38 | HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). 39 | 40 | If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. 41 | 42 | ```ts 43 | // store.ts 44 | // An extremely simple external store 45 | import { writable } from 'svelte/store' 46 | export default writable(0) 47 | ``` 48 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Svelte + TS 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "frontend", 9 | "version": "0.0.0", 10 | "devDependencies": { 11 | "@sveltejs/vite-plugin-svelte": "^2.0.3", 12 | "@tsconfig/svelte": "^3.0.0", 13 | "svelte": "^3.55.1", 14 | "svelte-check": "^2.10.3", 15 | "tslib": "^2.5.0", 16 | "typescript": "^4.9.3", 17 | "vite": "^4.2.0" 18 | } 19 | }, 20 | "node_modules/@esbuild/android-arm": { 21 | "version": "0.17.16", 22 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", 23 | "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", 24 | "cpu": [ 25 | "arm" 26 | ], 27 | "dev": true, 28 | "optional": true, 29 | "os": [ 30 | "android" 31 | ], 32 | "engines": { 33 | "node": ">=12" 34 | } 35 | }, 36 | "node_modules/@esbuild/android-arm64": { 37 | "version": "0.17.16", 38 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", 39 | "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", 40 | "cpu": [ 41 | "arm64" 42 | ], 43 | "dev": true, 44 | "optional": true, 45 | "os": [ 46 | "android" 47 | ], 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/@esbuild/android-x64": { 53 | "version": "0.17.16", 54 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", 55 | "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", 56 | "cpu": [ 57 | "x64" 58 | ], 59 | "dev": true, 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@esbuild/darwin-arm64": { 69 | "version": "0.17.16", 70 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", 71 | "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", 72 | "cpu": [ 73 | "arm64" 74 | ], 75 | "dev": true, 76 | "optional": true, 77 | "os": [ 78 | "darwin" 79 | ], 80 | "engines": { 81 | "node": ">=12" 82 | } 83 | }, 84 | "node_modules/@esbuild/darwin-x64": { 85 | "version": "0.17.16", 86 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", 87 | "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", 88 | "cpu": [ 89 | "x64" 90 | ], 91 | "dev": true, 92 | "optional": true, 93 | "os": [ 94 | "darwin" 95 | ], 96 | "engines": { 97 | "node": ">=12" 98 | } 99 | }, 100 | "node_modules/@esbuild/freebsd-arm64": { 101 | "version": "0.17.16", 102 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", 103 | "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", 104 | "cpu": [ 105 | "arm64" 106 | ], 107 | "dev": true, 108 | "optional": true, 109 | "os": [ 110 | "freebsd" 111 | ], 112 | "engines": { 113 | "node": ">=12" 114 | } 115 | }, 116 | "node_modules/@esbuild/freebsd-x64": { 117 | "version": "0.17.16", 118 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", 119 | "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", 120 | "cpu": [ 121 | "x64" 122 | ], 123 | "dev": true, 124 | "optional": true, 125 | "os": [ 126 | "freebsd" 127 | ], 128 | "engines": { 129 | "node": ">=12" 130 | } 131 | }, 132 | "node_modules/@esbuild/linux-arm": { 133 | "version": "0.17.16", 134 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", 135 | "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", 136 | "cpu": [ 137 | "arm" 138 | ], 139 | "dev": true, 140 | "optional": true, 141 | "os": [ 142 | "linux" 143 | ], 144 | "engines": { 145 | "node": ">=12" 146 | } 147 | }, 148 | "node_modules/@esbuild/linux-arm64": { 149 | "version": "0.17.16", 150 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", 151 | "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", 152 | "cpu": [ 153 | "arm64" 154 | ], 155 | "dev": true, 156 | "optional": true, 157 | "os": [ 158 | "linux" 159 | ], 160 | "engines": { 161 | "node": ">=12" 162 | } 163 | }, 164 | "node_modules/@esbuild/linux-ia32": { 165 | "version": "0.17.16", 166 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", 167 | "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", 168 | "cpu": [ 169 | "ia32" 170 | ], 171 | "dev": true, 172 | "optional": true, 173 | "os": [ 174 | "linux" 175 | ], 176 | "engines": { 177 | "node": ">=12" 178 | } 179 | }, 180 | "node_modules/@esbuild/linux-loong64": { 181 | "version": "0.17.16", 182 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", 183 | "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", 184 | "cpu": [ 185 | "loong64" 186 | ], 187 | "dev": true, 188 | "optional": true, 189 | "os": [ 190 | "linux" 191 | ], 192 | "engines": { 193 | "node": ">=12" 194 | } 195 | }, 196 | "node_modules/@esbuild/linux-mips64el": { 197 | "version": "0.17.16", 198 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", 199 | "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", 200 | "cpu": [ 201 | "mips64el" 202 | ], 203 | "dev": true, 204 | "optional": true, 205 | "os": [ 206 | "linux" 207 | ], 208 | "engines": { 209 | "node": ">=12" 210 | } 211 | }, 212 | "node_modules/@esbuild/linux-ppc64": { 213 | "version": "0.17.16", 214 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", 215 | "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", 216 | "cpu": [ 217 | "ppc64" 218 | ], 219 | "dev": true, 220 | "optional": true, 221 | "os": [ 222 | "linux" 223 | ], 224 | "engines": { 225 | "node": ">=12" 226 | } 227 | }, 228 | "node_modules/@esbuild/linux-riscv64": { 229 | "version": "0.17.16", 230 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", 231 | "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", 232 | "cpu": [ 233 | "riscv64" 234 | ], 235 | "dev": true, 236 | "optional": true, 237 | "os": [ 238 | "linux" 239 | ], 240 | "engines": { 241 | "node": ">=12" 242 | } 243 | }, 244 | "node_modules/@esbuild/linux-s390x": { 245 | "version": "0.17.16", 246 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", 247 | "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", 248 | "cpu": [ 249 | "s390x" 250 | ], 251 | "dev": true, 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/@esbuild/linux-x64": { 261 | "version": "0.17.16", 262 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", 263 | "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", 264 | "cpu": [ 265 | "x64" 266 | ], 267 | "dev": true, 268 | "optional": true, 269 | "os": [ 270 | "linux" 271 | ], 272 | "engines": { 273 | "node": ">=12" 274 | } 275 | }, 276 | "node_modules/@esbuild/netbsd-x64": { 277 | "version": "0.17.16", 278 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", 279 | "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", 280 | "cpu": [ 281 | "x64" 282 | ], 283 | "dev": true, 284 | "optional": true, 285 | "os": [ 286 | "netbsd" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/@esbuild/openbsd-x64": { 293 | "version": "0.17.16", 294 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", 295 | "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", 296 | "cpu": [ 297 | "x64" 298 | ], 299 | "dev": true, 300 | "optional": true, 301 | "os": [ 302 | "openbsd" 303 | ], 304 | "engines": { 305 | "node": ">=12" 306 | } 307 | }, 308 | "node_modules/@esbuild/sunos-x64": { 309 | "version": "0.17.16", 310 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", 311 | "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", 312 | "cpu": [ 313 | "x64" 314 | ], 315 | "dev": true, 316 | "optional": true, 317 | "os": [ 318 | "sunos" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/@esbuild/win32-arm64": { 325 | "version": "0.17.16", 326 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", 327 | "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", 328 | "cpu": [ 329 | "arm64" 330 | ], 331 | "dev": true, 332 | "optional": true, 333 | "os": [ 334 | "win32" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/win32-ia32": { 341 | "version": "0.17.16", 342 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", 343 | "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", 344 | "cpu": [ 345 | "ia32" 346 | ], 347 | "dev": true, 348 | "optional": true, 349 | "os": [ 350 | "win32" 351 | ], 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/@esbuild/win32-x64": { 357 | "version": "0.17.16", 358 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", 359 | "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", 360 | "cpu": [ 361 | "x64" 362 | ], 363 | "dev": true, 364 | "optional": true, 365 | "os": [ 366 | "win32" 367 | ], 368 | "engines": { 369 | "node": ">=12" 370 | } 371 | }, 372 | "node_modules/@jridgewell/resolve-uri": { 373 | "version": "3.1.0", 374 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 375 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 376 | "dev": true, 377 | "engines": { 378 | "node": ">=6.0.0" 379 | } 380 | }, 381 | "node_modules/@jridgewell/sourcemap-codec": { 382 | "version": "1.4.15", 383 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 384 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 385 | "dev": true 386 | }, 387 | "node_modules/@jridgewell/trace-mapping": { 388 | "version": "0.3.18", 389 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 390 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 391 | "dev": true, 392 | "dependencies": { 393 | "@jridgewell/resolve-uri": "3.1.0", 394 | "@jridgewell/sourcemap-codec": "1.4.14" 395 | } 396 | }, 397 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 398 | "version": "1.4.14", 399 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 400 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 401 | "dev": true 402 | }, 403 | "node_modules/@nodelib/fs.scandir": { 404 | "version": "2.1.5", 405 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 406 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 407 | "dev": true, 408 | "dependencies": { 409 | "@nodelib/fs.stat": "2.0.5", 410 | "run-parallel": "^1.1.9" 411 | }, 412 | "engines": { 413 | "node": ">= 8" 414 | } 415 | }, 416 | "node_modules/@nodelib/fs.stat": { 417 | "version": "2.0.5", 418 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 419 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 420 | "dev": true, 421 | "engines": { 422 | "node": ">= 8" 423 | } 424 | }, 425 | "node_modules/@nodelib/fs.walk": { 426 | "version": "1.2.8", 427 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 428 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 429 | "dev": true, 430 | "dependencies": { 431 | "@nodelib/fs.scandir": "2.1.5", 432 | "fastq": "^1.6.0" 433 | }, 434 | "engines": { 435 | "node": ">= 8" 436 | } 437 | }, 438 | "node_modules/@sveltejs/vite-plugin-svelte": { 439 | "version": "2.0.4", 440 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.4.tgz", 441 | "integrity": "sha512-pjqhW00KwK2uzDGEr+yJBwut+D+4XfJO/+bHHdHzPRXn9+1Jeq5JcFHyrUiYaXgHtyhX0RsllCTm4ssAx4ZY7Q==", 442 | "dev": true, 443 | "dependencies": { 444 | "debug": "^4.3.4", 445 | "deepmerge": "^4.3.1", 446 | "kleur": "^4.1.5", 447 | "magic-string": "^0.30.0", 448 | "svelte-hmr": "^0.15.1", 449 | "vitefu": "^0.2.4" 450 | }, 451 | "engines": { 452 | "node": "^14.18.0 || >= 16" 453 | }, 454 | "peerDependencies": { 455 | "svelte": "^3.54.0", 456 | "vite": "^4.0.0" 457 | } 458 | }, 459 | "node_modules/@tsconfig/svelte": { 460 | "version": "3.0.0", 461 | "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", 462 | "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", 463 | "dev": true 464 | }, 465 | "node_modules/@types/pug": { 466 | "version": "2.0.6", 467 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 468 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 469 | "dev": true 470 | }, 471 | "node_modules/@types/sass": { 472 | "version": "1.45.0", 473 | "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", 474 | "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", 475 | "deprecated": "This is a stub types definition. sass provides its own type definitions, so you do not need this installed.", 476 | "dev": true, 477 | "dependencies": { 478 | "sass": "*" 479 | } 480 | }, 481 | "node_modules/anymatch": { 482 | "version": "3.1.3", 483 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 484 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 485 | "dev": true, 486 | "dependencies": { 487 | "normalize-path": "^3.0.0", 488 | "picomatch": "^2.0.4" 489 | }, 490 | "engines": { 491 | "node": ">= 8" 492 | } 493 | }, 494 | "node_modules/balanced-match": { 495 | "version": "1.0.2", 496 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 497 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 498 | "dev": true 499 | }, 500 | "node_modules/binary-extensions": { 501 | "version": "2.2.0", 502 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 503 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 504 | "dev": true, 505 | "engines": { 506 | "node": ">=8" 507 | } 508 | }, 509 | "node_modules/brace-expansion": { 510 | "version": "1.1.11", 511 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 512 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 513 | "dev": true, 514 | "dependencies": { 515 | "balanced-match": "^1.0.0", 516 | "concat-map": "0.0.1" 517 | } 518 | }, 519 | "node_modules/braces": { 520 | "version": "3.0.2", 521 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 522 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 523 | "dev": true, 524 | "dependencies": { 525 | "fill-range": "^7.0.1" 526 | }, 527 | "engines": { 528 | "node": ">=8" 529 | } 530 | }, 531 | "node_modules/buffer-crc32": { 532 | "version": "0.2.13", 533 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 534 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 535 | "dev": true, 536 | "engines": { 537 | "node": "*" 538 | } 539 | }, 540 | "node_modules/callsites": { 541 | "version": "3.1.0", 542 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 543 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 544 | "dev": true, 545 | "engines": { 546 | "node": ">=6" 547 | } 548 | }, 549 | "node_modules/chokidar": { 550 | "version": "3.5.3", 551 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 552 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 553 | "dev": true, 554 | "funding": [ 555 | { 556 | "type": "individual", 557 | "url": "https://paulmillr.com/funding/" 558 | } 559 | ], 560 | "dependencies": { 561 | "anymatch": "~3.1.2", 562 | "braces": "~3.0.2", 563 | "glob-parent": "~5.1.2", 564 | "is-binary-path": "~2.1.0", 565 | "is-glob": "~4.0.1", 566 | "normalize-path": "~3.0.0", 567 | "readdirp": "~3.6.0" 568 | }, 569 | "engines": { 570 | "node": ">= 8.10.0" 571 | }, 572 | "optionalDependencies": { 573 | "fsevents": "~2.3.2" 574 | } 575 | }, 576 | "node_modules/concat-map": { 577 | "version": "0.0.1", 578 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 579 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 580 | "dev": true 581 | }, 582 | "node_modules/debug": { 583 | "version": "4.3.4", 584 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 585 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 586 | "dev": true, 587 | "dependencies": { 588 | "ms": "2.1.2" 589 | }, 590 | "engines": { 591 | "node": ">=6.0" 592 | }, 593 | "peerDependenciesMeta": { 594 | "supports-color": { 595 | "optional": true 596 | } 597 | } 598 | }, 599 | "node_modules/deepmerge": { 600 | "version": "4.3.1", 601 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 602 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 603 | "dev": true, 604 | "engines": { 605 | "node": ">=0.10.0" 606 | } 607 | }, 608 | "node_modules/detect-indent": { 609 | "version": "6.1.0", 610 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 611 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 612 | "dev": true, 613 | "engines": { 614 | "node": ">=8" 615 | } 616 | }, 617 | "node_modules/es6-promise": { 618 | "version": "3.3.1", 619 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 620 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 621 | "dev": true 622 | }, 623 | "node_modules/esbuild": { 624 | "version": "0.17.16", 625 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", 626 | "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", 627 | "dev": true, 628 | "hasInstallScript": true, 629 | "bin": { 630 | "esbuild": "bin/esbuild" 631 | }, 632 | "engines": { 633 | "node": ">=12" 634 | }, 635 | "optionalDependencies": { 636 | "@esbuild/android-arm": "0.17.16", 637 | "@esbuild/android-arm64": "0.17.16", 638 | "@esbuild/android-x64": "0.17.16", 639 | "@esbuild/darwin-arm64": "0.17.16", 640 | "@esbuild/darwin-x64": "0.17.16", 641 | "@esbuild/freebsd-arm64": "0.17.16", 642 | "@esbuild/freebsd-x64": "0.17.16", 643 | "@esbuild/linux-arm": "0.17.16", 644 | "@esbuild/linux-arm64": "0.17.16", 645 | "@esbuild/linux-ia32": "0.17.16", 646 | "@esbuild/linux-loong64": "0.17.16", 647 | "@esbuild/linux-mips64el": "0.17.16", 648 | "@esbuild/linux-ppc64": "0.17.16", 649 | "@esbuild/linux-riscv64": "0.17.16", 650 | "@esbuild/linux-s390x": "0.17.16", 651 | "@esbuild/linux-x64": "0.17.16", 652 | "@esbuild/netbsd-x64": "0.17.16", 653 | "@esbuild/openbsd-x64": "0.17.16", 654 | "@esbuild/sunos-x64": "0.17.16", 655 | "@esbuild/win32-arm64": "0.17.16", 656 | "@esbuild/win32-ia32": "0.17.16", 657 | "@esbuild/win32-x64": "0.17.16" 658 | } 659 | }, 660 | "node_modules/fast-glob": { 661 | "version": "3.2.12", 662 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 663 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 664 | "dev": true, 665 | "dependencies": { 666 | "@nodelib/fs.stat": "^2.0.2", 667 | "@nodelib/fs.walk": "^1.2.3", 668 | "glob-parent": "^5.1.2", 669 | "merge2": "^1.3.0", 670 | "micromatch": "^4.0.4" 671 | }, 672 | "engines": { 673 | "node": ">=8.6.0" 674 | } 675 | }, 676 | "node_modules/fastq": { 677 | "version": "1.15.0", 678 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 679 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 680 | "dev": true, 681 | "dependencies": { 682 | "reusify": "^1.0.4" 683 | } 684 | }, 685 | "node_modules/fill-range": { 686 | "version": "7.0.1", 687 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 688 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 689 | "dev": true, 690 | "dependencies": { 691 | "to-regex-range": "^5.0.1" 692 | }, 693 | "engines": { 694 | "node": ">=8" 695 | } 696 | }, 697 | "node_modules/fs.realpath": { 698 | "version": "1.0.0", 699 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 700 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 701 | "dev": true 702 | }, 703 | "node_modules/fsevents": { 704 | "version": "2.3.2", 705 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 706 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 707 | "dev": true, 708 | "hasInstallScript": true, 709 | "optional": true, 710 | "os": [ 711 | "darwin" 712 | ], 713 | "engines": { 714 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 715 | } 716 | }, 717 | "node_modules/function-bind": { 718 | "version": "1.1.1", 719 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 720 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 721 | "dev": true 722 | }, 723 | "node_modules/glob": { 724 | "version": "7.2.3", 725 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 726 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 727 | "dev": true, 728 | "dependencies": { 729 | "fs.realpath": "^1.0.0", 730 | "inflight": "^1.0.4", 731 | "inherits": "2", 732 | "minimatch": "^3.1.1", 733 | "once": "^1.3.0", 734 | "path-is-absolute": "^1.0.0" 735 | }, 736 | "engines": { 737 | "node": "*" 738 | }, 739 | "funding": { 740 | "url": "https://github.com/sponsors/isaacs" 741 | } 742 | }, 743 | "node_modules/glob-parent": { 744 | "version": "5.1.2", 745 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 746 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 747 | "dev": true, 748 | "dependencies": { 749 | "is-glob": "^4.0.1" 750 | }, 751 | "engines": { 752 | "node": ">= 6" 753 | } 754 | }, 755 | "node_modules/graceful-fs": { 756 | "version": "4.2.11", 757 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 758 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 759 | "dev": true 760 | }, 761 | "node_modules/has": { 762 | "version": "1.0.3", 763 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 764 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 765 | "dev": true, 766 | "dependencies": { 767 | "function-bind": "^1.1.1" 768 | }, 769 | "engines": { 770 | "node": ">= 0.4.0" 771 | } 772 | }, 773 | "node_modules/immutable": { 774 | "version": "4.3.0", 775 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", 776 | "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", 777 | "dev": true 778 | }, 779 | "node_modules/import-fresh": { 780 | "version": "3.3.0", 781 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 782 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 783 | "dev": true, 784 | "dependencies": { 785 | "parent-module": "^1.0.0", 786 | "resolve-from": "^4.0.0" 787 | }, 788 | "engines": { 789 | "node": ">=6" 790 | }, 791 | "funding": { 792 | "url": "https://github.com/sponsors/sindresorhus" 793 | } 794 | }, 795 | "node_modules/inflight": { 796 | "version": "1.0.6", 797 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 798 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 799 | "dev": true, 800 | "dependencies": { 801 | "once": "^1.3.0", 802 | "wrappy": "1" 803 | } 804 | }, 805 | "node_modules/inherits": { 806 | "version": "2.0.4", 807 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 808 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 809 | "dev": true 810 | }, 811 | "node_modules/is-binary-path": { 812 | "version": "2.1.0", 813 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 814 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 815 | "dev": true, 816 | "dependencies": { 817 | "binary-extensions": "^2.0.0" 818 | }, 819 | "engines": { 820 | "node": ">=8" 821 | } 822 | }, 823 | "node_modules/is-core-module": { 824 | "version": "2.12.0", 825 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", 826 | "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", 827 | "dev": true, 828 | "dependencies": { 829 | "has": "^1.0.3" 830 | }, 831 | "funding": { 832 | "url": "https://github.com/sponsors/ljharb" 833 | } 834 | }, 835 | "node_modules/is-extglob": { 836 | "version": "2.1.1", 837 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 838 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 839 | "dev": true, 840 | "engines": { 841 | "node": ">=0.10.0" 842 | } 843 | }, 844 | "node_modules/is-glob": { 845 | "version": "4.0.3", 846 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 847 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 848 | "dev": true, 849 | "dependencies": { 850 | "is-extglob": "^2.1.1" 851 | }, 852 | "engines": { 853 | "node": ">=0.10.0" 854 | } 855 | }, 856 | "node_modules/is-number": { 857 | "version": "7.0.0", 858 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 859 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 860 | "dev": true, 861 | "engines": { 862 | "node": ">=0.12.0" 863 | } 864 | }, 865 | "node_modules/kleur": { 866 | "version": "4.1.5", 867 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 868 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 869 | "dev": true, 870 | "engines": { 871 | "node": ">=6" 872 | } 873 | }, 874 | "node_modules/magic-string": { 875 | "version": "0.30.0", 876 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 877 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 878 | "dev": true, 879 | "dependencies": { 880 | "@jridgewell/sourcemap-codec": "^1.4.13" 881 | }, 882 | "engines": { 883 | "node": ">=12" 884 | } 885 | }, 886 | "node_modules/merge2": { 887 | "version": "1.4.1", 888 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 889 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 890 | "dev": true, 891 | "engines": { 892 | "node": ">= 8" 893 | } 894 | }, 895 | "node_modules/micromatch": { 896 | "version": "4.0.5", 897 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 898 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 899 | "dev": true, 900 | "dependencies": { 901 | "braces": "^3.0.2", 902 | "picomatch": "^2.3.1" 903 | }, 904 | "engines": { 905 | "node": ">=8.6" 906 | } 907 | }, 908 | "node_modules/min-indent": { 909 | "version": "1.0.1", 910 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 911 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 912 | "dev": true, 913 | "engines": { 914 | "node": ">=4" 915 | } 916 | }, 917 | "node_modules/minimatch": { 918 | "version": "3.1.2", 919 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 920 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 921 | "dev": true, 922 | "dependencies": { 923 | "brace-expansion": "^1.1.7" 924 | }, 925 | "engines": { 926 | "node": "*" 927 | } 928 | }, 929 | "node_modules/minimist": { 930 | "version": "1.2.8", 931 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 932 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 933 | "dev": true, 934 | "funding": { 935 | "url": "https://github.com/sponsors/ljharb" 936 | } 937 | }, 938 | "node_modules/mkdirp": { 939 | "version": "0.5.6", 940 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 941 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 942 | "dev": true, 943 | "dependencies": { 944 | "minimist": "^1.2.6" 945 | }, 946 | "bin": { 947 | "mkdirp": "bin/cmd.js" 948 | } 949 | }, 950 | "node_modules/mri": { 951 | "version": "1.2.0", 952 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 953 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 954 | "dev": true, 955 | "engines": { 956 | "node": ">=4" 957 | } 958 | }, 959 | "node_modules/ms": { 960 | "version": "2.1.2", 961 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 962 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 963 | "dev": true 964 | }, 965 | "node_modules/nanoid": { 966 | "version": "3.3.6", 967 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 968 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 969 | "dev": true, 970 | "funding": [ 971 | { 972 | "type": "github", 973 | "url": "https://github.com/sponsors/ai" 974 | } 975 | ], 976 | "bin": { 977 | "nanoid": "bin/nanoid.cjs" 978 | }, 979 | "engines": { 980 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 981 | } 982 | }, 983 | "node_modules/normalize-path": { 984 | "version": "3.0.0", 985 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 986 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 987 | "dev": true, 988 | "engines": { 989 | "node": ">=0.10.0" 990 | } 991 | }, 992 | "node_modules/once": { 993 | "version": "1.4.0", 994 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 995 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 996 | "dev": true, 997 | "dependencies": { 998 | "wrappy": "1" 999 | } 1000 | }, 1001 | "node_modules/parent-module": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1004 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1005 | "dev": true, 1006 | "dependencies": { 1007 | "callsites": "^3.0.0" 1008 | }, 1009 | "engines": { 1010 | "node": ">=6" 1011 | } 1012 | }, 1013 | "node_modules/path-is-absolute": { 1014 | "version": "1.0.1", 1015 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1016 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1017 | "dev": true, 1018 | "engines": { 1019 | "node": ">=0.10.0" 1020 | } 1021 | }, 1022 | "node_modules/path-parse": { 1023 | "version": "1.0.7", 1024 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1025 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1026 | "dev": true 1027 | }, 1028 | "node_modules/picocolors": { 1029 | "version": "1.0.0", 1030 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1031 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1032 | "dev": true 1033 | }, 1034 | "node_modules/picomatch": { 1035 | "version": "2.3.1", 1036 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1037 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1038 | "dev": true, 1039 | "engines": { 1040 | "node": ">=8.6" 1041 | }, 1042 | "funding": { 1043 | "url": "https://github.com/sponsors/jonschlinkert" 1044 | } 1045 | }, 1046 | "node_modules/postcss": { 1047 | "version": "8.4.21", 1048 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 1049 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 1050 | "dev": true, 1051 | "funding": [ 1052 | { 1053 | "type": "opencollective", 1054 | "url": "https://opencollective.com/postcss/" 1055 | }, 1056 | { 1057 | "type": "tidelift", 1058 | "url": "https://tidelift.com/funding/github/npm/postcss" 1059 | } 1060 | ], 1061 | "dependencies": { 1062 | "nanoid": "^3.3.4", 1063 | "picocolors": "^1.0.0", 1064 | "source-map-js": "^1.0.2" 1065 | }, 1066 | "engines": { 1067 | "node": "^10 || ^12 || >=14" 1068 | } 1069 | }, 1070 | "node_modules/queue-microtask": { 1071 | "version": "1.2.3", 1072 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1073 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1074 | "dev": true, 1075 | "funding": [ 1076 | { 1077 | "type": "github", 1078 | "url": "https://github.com/sponsors/feross" 1079 | }, 1080 | { 1081 | "type": "patreon", 1082 | "url": "https://www.patreon.com/feross" 1083 | }, 1084 | { 1085 | "type": "consulting", 1086 | "url": "https://feross.org/support" 1087 | } 1088 | ] 1089 | }, 1090 | "node_modules/readdirp": { 1091 | "version": "3.6.0", 1092 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1093 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1094 | "dev": true, 1095 | "dependencies": { 1096 | "picomatch": "^2.2.1" 1097 | }, 1098 | "engines": { 1099 | "node": ">=8.10.0" 1100 | } 1101 | }, 1102 | "node_modules/resolve": { 1103 | "version": "1.22.3", 1104 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", 1105 | "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", 1106 | "dev": true, 1107 | "dependencies": { 1108 | "is-core-module": "^2.12.0", 1109 | "path-parse": "^1.0.7", 1110 | "supports-preserve-symlinks-flag": "^1.0.0" 1111 | }, 1112 | "bin": { 1113 | "resolve": "bin/resolve" 1114 | }, 1115 | "funding": { 1116 | "url": "https://github.com/sponsors/ljharb" 1117 | } 1118 | }, 1119 | "node_modules/resolve-from": { 1120 | "version": "4.0.0", 1121 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1122 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=4" 1126 | } 1127 | }, 1128 | "node_modules/reusify": { 1129 | "version": "1.0.4", 1130 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1131 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1132 | "dev": true, 1133 | "engines": { 1134 | "iojs": ">=1.0.0", 1135 | "node": ">=0.10.0" 1136 | } 1137 | }, 1138 | "node_modules/rimraf": { 1139 | "version": "2.7.1", 1140 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1141 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1142 | "dev": true, 1143 | "dependencies": { 1144 | "glob": "^7.1.3" 1145 | }, 1146 | "bin": { 1147 | "rimraf": "bin.js" 1148 | } 1149 | }, 1150 | "node_modules/rollup": { 1151 | "version": "3.20.2", 1152 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", 1153 | "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", 1154 | "dev": true, 1155 | "bin": { 1156 | "rollup": "dist/bin/rollup" 1157 | }, 1158 | "engines": { 1159 | "node": ">=14.18.0", 1160 | "npm": ">=8.0.0" 1161 | }, 1162 | "optionalDependencies": { 1163 | "fsevents": "~2.3.2" 1164 | } 1165 | }, 1166 | "node_modules/run-parallel": { 1167 | "version": "1.2.0", 1168 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1169 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1170 | "dev": true, 1171 | "funding": [ 1172 | { 1173 | "type": "github", 1174 | "url": "https://github.com/sponsors/feross" 1175 | }, 1176 | { 1177 | "type": "patreon", 1178 | "url": "https://www.patreon.com/feross" 1179 | }, 1180 | { 1181 | "type": "consulting", 1182 | "url": "https://feross.org/support" 1183 | } 1184 | ], 1185 | "dependencies": { 1186 | "queue-microtask": "^1.2.2" 1187 | } 1188 | }, 1189 | "node_modules/sade": { 1190 | "version": "1.8.1", 1191 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1192 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1193 | "dev": true, 1194 | "dependencies": { 1195 | "mri": "^1.1.0" 1196 | }, 1197 | "engines": { 1198 | "node": ">=6" 1199 | } 1200 | }, 1201 | "node_modules/sander": { 1202 | "version": "0.5.1", 1203 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1204 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 1205 | "dev": true, 1206 | "dependencies": { 1207 | "es6-promise": "^3.1.2", 1208 | "graceful-fs": "^4.1.3", 1209 | "mkdirp": "^0.5.1", 1210 | "rimraf": "^2.5.2" 1211 | } 1212 | }, 1213 | "node_modules/sass": { 1214 | "version": "1.62.0", 1215 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", 1216 | "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", 1217 | "dev": true, 1218 | "dependencies": { 1219 | "chokidar": ">=3.0.0 <4.0.0", 1220 | "immutable": "^4.0.0", 1221 | "source-map-js": ">=0.6.2 <2.0.0" 1222 | }, 1223 | "bin": { 1224 | "sass": "sass.js" 1225 | }, 1226 | "engines": { 1227 | "node": ">=14.0.0" 1228 | } 1229 | }, 1230 | "node_modules/sorcery": { 1231 | "version": "0.10.0", 1232 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", 1233 | "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", 1234 | "dev": true, 1235 | "dependencies": { 1236 | "buffer-crc32": "^0.2.5", 1237 | "minimist": "^1.2.0", 1238 | "sander": "^0.5.0", 1239 | "sourcemap-codec": "^1.3.0" 1240 | }, 1241 | "bin": { 1242 | "sorcery": "bin/index.js" 1243 | } 1244 | }, 1245 | "node_modules/source-map-js": { 1246 | "version": "1.0.2", 1247 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1248 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1249 | "dev": true, 1250 | "engines": { 1251 | "node": ">=0.10.0" 1252 | } 1253 | }, 1254 | "node_modules/sourcemap-codec": { 1255 | "version": "1.4.8", 1256 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1257 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1258 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1259 | "dev": true 1260 | }, 1261 | "node_modules/strip-indent": { 1262 | "version": "3.0.0", 1263 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 1264 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 1265 | "dev": true, 1266 | "dependencies": { 1267 | "min-indent": "^1.0.0" 1268 | }, 1269 | "engines": { 1270 | "node": ">=8" 1271 | } 1272 | }, 1273 | "node_modules/supports-preserve-symlinks-flag": { 1274 | "version": "1.0.0", 1275 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1276 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1277 | "dev": true, 1278 | "engines": { 1279 | "node": ">= 0.4" 1280 | }, 1281 | "funding": { 1282 | "url": "https://github.com/sponsors/ljharb" 1283 | } 1284 | }, 1285 | "node_modules/svelte": { 1286 | "version": "3.58.0", 1287 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", 1288 | "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", 1289 | "dev": true, 1290 | "engines": { 1291 | "node": ">= 8" 1292 | } 1293 | }, 1294 | "node_modules/svelte-check": { 1295 | "version": "2.10.3", 1296 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", 1297 | "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", 1298 | "dev": true, 1299 | "dependencies": { 1300 | "@jridgewell/trace-mapping": "^0.3.9", 1301 | "chokidar": "^3.4.1", 1302 | "fast-glob": "^3.2.7", 1303 | "import-fresh": "^3.2.1", 1304 | "picocolors": "^1.0.0", 1305 | "sade": "^1.7.4", 1306 | "svelte-preprocess": "^4.0.0", 1307 | "typescript": "*" 1308 | }, 1309 | "bin": { 1310 | "svelte-check": "bin/svelte-check" 1311 | }, 1312 | "peerDependencies": { 1313 | "svelte": "^3.24.0" 1314 | } 1315 | }, 1316 | "node_modules/svelte-hmr": { 1317 | "version": "0.15.1", 1318 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 1319 | "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 1320 | "dev": true, 1321 | "engines": { 1322 | "node": "^12.20 || ^14.13.1 || >= 16" 1323 | }, 1324 | "peerDependencies": { 1325 | "svelte": ">=3.19.0" 1326 | } 1327 | }, 1328 | "node_modules/svelte-preprocess": { 1329 | "version": "4.10.7", 1330 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", 1331 | "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", 1332 | "dev": true, 1333 | "hasInstallScript": true, 1334 | "dependencies": { 1335 | "@types/pug": "^2.0.4", 1336 | "@types/sass": "^1.16.0", 1337 | "detect-indent": "^6.0.0", 1338 | "magic-string": "^0.25.7", 1339 | "sorcery": "^0.10.0", 1340 | "strip-indent": "^3.0.0" 1341 | }, 1342 | "engines": { 1343 | "node": ">= 9.11.2" 1344 | }, 1345 | "peerDependencies": { 1346 | "@babel/core": "^7.10.2", 1347 | "coffeescript": "^2.5.1", 1348 | "less": "^3.11.3 || ^4.0.0", 1349 | "postcss": "^7 || ^8", 1350 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", 1351 | "pug": "^3.0.0", 1352 | "sass": "^1.26.8", 1353 | "stylus": "^0.55.0", 1354 | "sugarss": "^2.0.0", 1355 | "svelte": "^3.23.0", 1356 | "typescript": "^3.9.5 || ^4.0.0" 1357 | }, 1358 | "peerDependenciesMeta": { 1359 | "@babel/core": { 1360 | "optional": true 1361 | }, 1362 | "coffeescript": { 1363 | "optional": true 1364 | }, 1365 | "less": { 1366 | "optional": true 1367 | }, 1368 | "node-sass": { 1369 | "optional": true 1370 | }, 1371 | "postcss": { 1372 | "optional": true 1373 | }, 1374 | "postcss-load-config": { 1375 | "optional": true 1376 | }, 1377 | "pug": { 1378 | "optional": true 1379 | }, 1380 | "sass": { 1381 | "optional": true 1382 | }, 1383 | "stylus": { 1384 | "optional": true 1385 | }, 1386 | "sugarss": { 1387 | "optional": true 1388 | }, 1389 | "typescript": { 1390 | "optional": true 1391 | } 1392 | } 1393 | }, 1394 | "node_modules/svelte-preprocess/node_modules/magic-string": { 1395 | "version": "0.25.9", 1396 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1397 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1398 | "dev": true, 1399 | "dependencies": { 1400 | "sourcemap-codec": "^1.4.8" 1401 | } 1402 | }, 1403 | "node_modules/to-regex-range": { 1404 | "version": "5.0.1", 1405 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1406 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1407 | "dev": true, 1408 | "dependencies": { 1409 | "is-number": "^7.0.0" 1410 | }, 1411 | "engines": { 1412 | "node": ">=8.0" 1413 | } 1414 | }, 1415 | "node_modules/tslib": { 1416 | "version": "2.5.0", 1417 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 1418 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", 1419 | "dev": true 1420 | }, 1421 | "node_modules/typescript": { 1422 | "version": "4.9.5", 1423 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1424 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1425 | "dev": true, 1426 | "bin": { 1427 | "tsc": "bin/tsc", 1428 | "tsserver": "bin/tsserver" 1429 | }, 1430 | "engines": { 1431 | "node": ">=4.2.0" 1432 | } 1433 | }, 1434 | "node_modules/vite": { 1435 | "version": "4.2.1", 1436 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", 1437 | "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 1438 | "dev": true, 1439 | "dependencies": { 1440 | "esbuild": "^0.17.5", 1441 | "postcss": "^8.4.21", 1442 | "resolve": "^1.22.1", 1443 | "rollup": "^3.18.0" 1444 | }, 1445 | "bin": { 1446 | "vite": "bin/vite.js" 1447 | }, 1448 | "engines": { 1449 | "node": "^14.18.0 || >=16.0.0" 1450 | }, 1451 | "optionalDependencies": { 1452 | "fsevents": "~2.3.2" 1453 | }, 1454 | "peerDependencies": { 1455 | "@types/node": ">= 14", 1456 | "less": "*", 1457 | "sass": "*", 1458 | "stylus": "*", 1459 | "sugarss": "*", 1460 | "terser": "^5.4.0" 1461 | }, 1462 | "peerDependenciesMeta": { 1463 | "@types/node": { 1464 | "optional": true 1465 | }, 1466 | "less": { 1467 | "optional": true 1468 | }, 1469 | "sass": { 1470 | "optional": true 1471 | }, 1472 | "stylus": { 1473 | "optional": true 1474 | }, 1475 | "sugarss": { 1476 | "optional": true 1477 | }, 1478 | "terser": { 1479 | "optional": true 1480 | } 1481 | } 1482 | }, 1483 | "node_modules/vitefu": { 1484 | "version": "0.2.4", 1485 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 1486 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 1487 | "dev": true, 1488 | "peerDependencies": { 1489 | "vite": "^3.0.0 || ^4.0.0" 1490 | }, 1491 | "peerDependenciesMeta": { 1492 | "vite": { 1493 | "optional": true 1494 | } 1495 | } 1496 | }, 1497 | "node_modules/wrappy": { 1498 | "version": "1.0.2", 1499 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1500 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1501 | "dev": true 1502 | } 1503 | } 1504 | } 1505 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "check": "svelte-check --tsconfig ./tsconfig.json" 11 | }, 12 | "devDependencies": { 13 | "@sveltejs/vite-plugin-svelte": "^2.0.3", 14 | "@tsconfig/svelte": "^3.0.0", 15 | "svelte": "^3.55.1", 16 | "svelte-check": "^2.10.3", 17 | "tslib": "^2.5.0", 18 | "typescript": "^4.9.3", 19 | "vite": "^4.2.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /frontend/pages/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Svelte + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/pages/example.ts: -------------------------------------------------------------------------------- 1 | import '../src/main.css' 2 | import App from '../src/App.svelte' 3 | 4 | const app = new App({ 5 | target: document.getElementById('app'), 6 | }) 7 | 8 | export default app 9 | -------------------------------------------------------------------------------- /frontend/src/App.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |

Vite + Svelte

21 | 22 |
23 | 24 |
25 | 26 |

27 | Click on the Vite and Svelte logos to learn more 28 |

29 |
30 | 31 | 48 | -------------------------------------------------------------------------------- /frontend/src/assets/github-mark-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/github-mark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/svelte.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/lib/Counter.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /frontend/src/main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-text-size-adjust: 100%; 15 | } 16 | 17 | a { 18 | font-weight: 500; 19 | color: #646cff; 20 | text-decoration: inherit; 21 | } 22 | a:hover { 23 | color: #535bf2; 24 | } 25 | 26 | body { 27 | margin: 0; 28 | display: flex; 29 | place-items: center; 30 | min-width: 320px; 31 | min-height: 100vh; 32 | } 33 | 34 | h1 { 35 | font-size: 3.2em; 36 | line-height: 1.1; 37 | } 38 | 39 | .card { 40 | padding: 2em; 41 | } 42 | 43 | #app { 44 | max-width: 1280px; 45 | margin: 0 auto; 46 | padding: 2rem; 47 | text-align: center; 48 | } 49 | 50 | button { 51 | border-radius: 8px; 52 | border: 1px solid transparent; 53 | padding: 0.6em 1.2em; 54 | font-size: 1em; 55 | font-weight: 500; 56 | font-family: inherit; 57 | background-color: #1a1a1a; 58 | cursor: pointer; 59 | transition: border-color 0.25s; 60 | } 61 | button:hover { 62 | border-color: #646cff; 63 | } 64 | button:focus, 65 | button:focus-visible { 66 | outline: 4px auto -webkit-focus-ring-color; 67 | } 68 | 69 | @media (prefers-color-scheme: light) { 70 | :root { 71 | color: #213547; 72 | background-color: #ffffff; 73 | } 74 | a:hover { 75 | color: #747bff; 76 | } 77 | button { 78 | background-color: #f9f9f9; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import './main.css' 2 | import App from './App.svelte' 3 | 4 | const app = new App({ 5 | target: document.getElementById('app'), 6 | }) 7 | 8 | export default app 9 | -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /frontend/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | preprocess: vitePreprocess(), 7 | } 8 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": true, 15 | "checkJs": true, 16 | "isolatedModules": true, 17 | "ignoreDeprecations": "5.0", 18 | "verbatimModuleSyntax": true 19 | }, 20 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte", "pages/*.ts"], 21 | "references": [{ "path": "./tsconfig.node.json" }] 22 | } 23 | -------------------------------------------------------------------------------- /frontend/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | 4 | export default defineConfig({ 5 | plugins: [svelte()], 6 | base: "./", 7 | build: { 8 | emptyOutDir: true, 9 | outDir: '../public', 10 | assetsDir: 'assets', 11 | rollupOptions: { 12 | input: { 13 | main: './index.html', 14 | example: './pages/example.html', 15 | }, 16 | output: { 17 | entryFileNames: 'assets/js/[name]-[hash].js', 18 | chunkFileNames: 'assets/js/[name]-[hash].js', 19 | assetFileNames: ({ name }) => { 20 | if (/\.(gif|jpe?g|png|svg)$/.test(name ?? '')) { 21 | return 'assets/images/[name].[ext]'; 22 | } 23 | 24 | if (/\.css$/.test(name ?? '')) { 25 | return 'assets/css/[name]-[hash].[ext]'; 26 | } 27 | 28 | return 'assets/[name]-[hash].[ext]'; 29 | }, 30 | } 31 | } 32 | } 33 | }) 34 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import uvicorn 2 | import sys 3 | 4 | from fastapi import FastAPI 5 | from fastapi.responses import FileResponse 6 | from fastapi.staticfiles import StaticFiles 7 | 8 | app = FastAPI() 9 | 10 | app.mount("/assets", StaticFiles(directory="public/assets"), name="static") 11 | 12 | @app.get("/", response_class=FileResponse) 13 | def main(): 14 | return "public/index.html" 15 | 16 | if __name__ == "__main__" and len(sys.argv) > 1: 17 | match sys.argv[1]: 18 | case 'dev' | "--dev" | "-d": 19 | print("dev") 20 | uvicorn.run("main:app", port=8002, reload=True) 21 | case _: 22 | uvicorn.run("main:app", port=8002) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | fastapi 2 | uvicorn --------------------------------------------------------------------------------