├── .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 |
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 |
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 |
9 | count is {count}
10 |
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
--------------------------------------------------------------------------------