Wothmag07 commited on
Commit
2471e68
·
1 Parent(s): 2510c5e

Project scaffold

Browse files
.env.example ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ JWT_SECRET_KEY=change-me
2
+ HF_OAUTH_CLIENT_ID=your-hf-client-id
3
+ HF_OAUTH_CLIENT_SECRET=your-hf-client-secret
4
+ VAULT_BASE_PATH=./data/vaults
.gitignore CHANGED
@@ -40,3 +40,6 @@ dist/
40
  build/
41
  *.egg-info/
42
 
 
 
 
 
40
  build/
41
  *.egg-info/
42
 
43
+ # Runtime data
44
+ data/
45
+
backend/.env.example ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ JWT_SECRET_KEY=your-secret-key-here
2
+ HF_OAUTH_CLIENT_ID=your-hf-client-id
3
+ HF_OAUTH_CLIENT_SECRET=your-hf-client-secret
4
+ VAULT_BASE_PATH=./data/vaults
backend/.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.11
backend/README.md ADDED
File without changes
backend/main.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ def main():
2
+ print("Hello from backend!")
3
+
4
+
5
+ if __name__ == "__main__":
6
+ main()
backend/pyproject.toml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "backend"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "fastapi>=0.121.2",
9
+ "fastmcp>=2.13.1",
10
+ "huggingface-hub>=1.1.4",
11
+ "pyjwt>=2.10.1",
12
+ "python-frontmatter>=1.1.0",
13
+ "uvicorn[standard]>=0.38.0",
14
+ ]
15
+
16
+ [dependency-groups]
17
+ dev = [
18
+ "httpx>=0.28.1",
19
+ "pytest>=9.0.1",
20
+ "pytest-asyncio>=1.3.0",
21
+ ]
backend/src/api/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """FastAPI application and routing."""
backend/src/api/middleware/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """FastAPI middleware for authentication and error handling."""
backend/src/api/routes/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """HTTP API route handlers."""
backend/src/mcp/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """MCP (Model Context Protocol) server implementation."""
backend/src/models/__init__.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ """Pydantic models for data validation and serialization."""
2
+
backend/src/services/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Service layer for business logic and external integrations."""
backend/src/services/database.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """SQLite database helpers for document indexing schema."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ import sqlite3
7
+ from typing import Iterable
8
+
9
+ PROJECT_ROOT = Path(__file__).resolve().parents[3]
10
+ DATA_DIR = PROJECT_ROOT / "data"
11
+ DEFAULT_DB_PATH = DATA_DIR / "index.db"
12
+
13
+ DDL_STATEMENTS: tuple[str, ...] = (
14
+ """
15
+ CREATE TABLE IF NOT EXISTS note_metadata (
16
+ user_id TEXT NOT NULL,
17
+ note_path TEXT NOT NULL,
18
+ version INTEGER NOT NULL DEFAULT 1,
19
+ title TEXT NOT NULL,
20
+ created TEXT NOT NULL,
21
+ updated TEXT NOT NULL,
22
+ size_bytes INTEGER NOT NULL DEFAULT 0,
23
+ normalized_title_slug TEXT,
24
+ normalized_path_slug TEXT,
25
+ PRIMARY KEY (user_id, note_path)
26
+ )
27
+ """,
28
+ "CREATE INDEX IF NOT EXISTS idx_metadata_user ON note_metadata(user_id)",
29
+ "CREATE INDEX IF NOT EXISTS idx_metadata_updated ON note_metadata(user_id, updated DESC)",
30
+ "CREATE INDEX IF NOT EXISTS idx_metadata_title_slug ON note_metadata(user_id, normalized_title_slug)",
31
+ "CREATE INDEX IF NOT EXISTS idx_metadata_path_slug ON note_metadata(user_id, normalized_path_slug)",
32
+ """
33
+ CREATE VIRTUAL TABLE IF NOT EXISTS note_fts USING fts5(
34
+ user_id UNINDEXED,
35
+ note_path UNINDEXED,
36
+ title,
37
+ body,
38
+ content='',
39
+ tokenize='porter unicode61',
40
+ prefix='2 3'
41
+ )
42
+ """,
43
+ """
44
+ CREATE TABLE IF NOT EXISTS note_tags (
45
+ user_id TEXT NOT NULL,
46
+ note_path TEXT NOT NULL,
47
+ tag TEXT NOT NULL,
48
+ PRIMARY KEY (user_id, note_path, tag)
49
+ )
50
+ """,
51
+ "CREATE INDEX IF NOT EXISTS idx_tags_user_tag ON note_tags(user_id, tag)",
52
+ "CREATE INDEX IF NOT EXISTS idx_tags_user_path ON note_tags(user_id, note_path)",
53
+ """
54
+ CREATE TABLE IF NOT EXISTS note_links (
55
+ user_id TEXT NOT NULL,
56
+ source_path TEXT NOT NULL,
57
+ target_path TEXT,
58
+ link_text TEXT NOT NULL,
59
+ is_resolved INTEGER NOT NULL DEFAULT 0,
60
+ PRIMARY KEY (user_id, source_path, link_text)
61
+ )
62
+ """,
63
+ "CREATE INDEX IF NOT EXISTS idx_links_user_source ON note_links(user_id, source_path)",
64
+ "CREATE INDEX IF NOT EXISTS idx_links_user_target ON note_links(user_id, target_path)",
65
+ "CREATE INDEX IF NOT EXISTS idx_links_unresolved ON note_links(user_id, is_resolved)",
66
+ """
67
+ CREATE TABLE IF NOT EXISTS index_health (
68
+ user_id TEXT PRIMARY KEY,
69
+ note_count INTEGER NOT NULL DEFAULT 0,
70
+ last_full_rebuild TEXT,
71
+ last_incremental_update TEXT
72
+ )
73
+ """,
74
+ )
75
+
76
+
77
+ class DatabaseService:
78
+ """Manage SQLite connections and schema initialization."""
79
+
80
+ def __init__(self, db_path: str | Path | None = None):
81
+ self.db_path = Path(db_path) if db_path else DEFAULT_DB_PATH
82
+
83
+ def _ensure_directory(self) -> None:
84
+ self.db_path.parent.mkdir(parents=True, exist_ok=True)
85
+
86
+ def connect(self) -> sqlite3.Connection:
87
+ """Return a sqlite3 connection with the proper data directory created."""
88
+ self._ensure_directory()
89
+ conn = sqlite3.connect(self.db_path)
90
+ conn.row_factory = sqlite3.Row
91
+ return conn
92
+
93
+ def initialize(self, statements: Iterable[str] | None = None) -> Path:
94
+ """Create all schema artifacts required for indexing."""
95
+ conn = self.connect()
96
+ try:
97
+ with conn: # Transactional apply of DDL
98
+ for statement in statements or DDL_STATEMENTS:
99
+ conn.execute(statement)
100
+ finally:
101
+ conn.close()
102
+ return self.db_path
103
+
104
+
105
+ def init_database(db_path: str | Path | None = None) -> Path:
106
+ """Convenience wrapper matching the quickstart instructions."""
107
+ return DatabaseService(db_path).initialize()
108
+
109
+
110
+ __all__ = ["DatabaseService", "init_database", "DEFAULT_DB_PATH"]
backend/tests/contract/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Contract tests for API endpoints."""
backend/tests/integration/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Integration tests for service interactions."""
backend/tests/unit/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Unit tests for individual components."""
backend/uv.lock ADDED
The diff for this file is too large to render. See raw diff
 
frontend/.cursor/mcp.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mcpServers": {
3
+ "shadcn": {
4
+ "command": "npx",
5
+ "args": [
6
+ "shadcn@latest",
7
+ "mcp"
8
+ ]
9
+ }
10
+ }
11
+ }
frontend/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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?
frontend/README.md ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # React + TypeScript + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+ ```
45
+
46
+ You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
+
48
+ ```js
49
+ // eslint.config.js
50
+ import reactX from 'eslint-plugin-react-x'
51
+ import reactDom from 'eslint-plugin-react-dom'
52
+
53
+ export default defineConfig([
54
+ globalIgnores(['dist']),
55
+ {
56
+ files: ['**/*.{ts,tsx}'],
57
+ extends: [
58
+ // Other configs...
59
+ // Enable lint rules for React
60
+ reactX.configs['recommended-typescript'],
61
+ // Enable lint rules for React DOM
62
+ reactDom.configs.recommended,
63
+ ],
64
+ languageOptions: {
65
+ parserOptions: {
66
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
+ tsconfigRootDir: import.meta.dirname,
68
+ },
69
+ // other options...
70
+ },
71
+ },
72
+ ])
73
+ ```
frontend/eslint.config.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+ export default defineConfig([
9
+ globalIgnores(['dist']),
10
+ {
11
+ files: ['**/*.{ts,tsx}'],
12
+ extends: [
13
+ js.configs.recommended,
14
+ tseslint.configs.recommended,
15
+ reactHooks.configs.flat.recommended,
16
+ reactRefresh.configs.vite,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ },
23
+ ])
frontend/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>frontend</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
frontend/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
frontend/package.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc -b && vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "react": "^19.2.0",
14
+ "react-dom": "^19.2.0",
15
+ "react-markdown": "^9.0.3",
16
+ "shadcn-ui": "^0.9.0",
17
+ "typescript": "~5.9.3",
18
+ "vite": "^7.2.2"
19
+ },
20
+ "devDependencies": {
21
+ "@eslint/js": "^9.39.1",
22
+ "@types/node": "^24.10.0",
23
+ "@types/react": "^19.2.2",
24
+ "@types/react-dom": "^19.2.2",
25
+ "@vitejs/plugin-react": "^5.1.0",
26
+ "eslint": "^9.39.1",
27
+ "eslint-plugin-react-hooks": "^7.0.1",
28
+ "eslint-plugin-react-refresh": "^0.4.24",
29
+ "globals": "^16.5.0",
30
+ "shadcn": "^3.5.0",
31
+ "typescript-eslint": "^8.46.3"
32
+ }
33
+ }
frontend/public/vite.svg ADDED
frontend/src/App.css ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #root {
2
+ max-width: 1280px;
3
+ margin: 0 auto;
4
+ padding: 2rem;
5
+ text-align: center;
6
+ }
7
+
8
+ .logo {
9
+ height: 6em;
10
+ padding: 1.5em;
11
+ will-change: filter;
12
+ transition: filter 300ms;
13
+ }
14
+ .logo:hover {
15
+ filter: drop-shadow(0 0 2em #646cffaa);
16
+ }
17
+ .logo.react:hover {
18
+ filter: drop-shadow(0 0 2em #61dafbaa);
19
+ }
20
+
21
+ @keyframes logo-spin {
22
+ from {
23
+ transform: rotate(0deg);
24
+ }
25
+ to {
26
+ transform: rotate(360deg);
27
+ }
28
+ }
29
+
30
+ @media (prefers-reduced-motion: no-preference) {
31
+ a:nth-of-type(2) .logo {
32
+ animation: logo-spin infinite 20s linear;
33
+ }
34
+ }
35
+
36
+ .card {
37
+ padding: 2em;
38
+ }
39
+
40
+ .read-the-docs {
41
+ color: #888;
42
+ }
frontend/src/App.tsx ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from 'react'
2
+ import reactLogo from './assets/react.svg'
3
+ import viteLogo from '/vite.svg'
4
+ import './App.css'
5
+
6
+ function App() {
7
+ const [count, setCount] = useState(0)
8
+
9
+ return (
10
+ <>
11
+ <div>
12
+ <a href="https://vite.dev" target="_blank">
13
+ <img src={viteLogo} className="logo" alt="Vite logo" />
14
+ </a>
15
+ <a href="https://react.dev" target="_blank">
16
+ <img src={reactLogo} className="logo react" alt="React logo" />
17
+ </a>
18
+ </div>
19
+ <h1>Vite + React</h1>
20
+ <div className="card">
21
+ <button onClick={() => setCount((count) => count + 1)}>
22
+ count is {count}
23
+ </button>
24
+ <p>
25
+ Edit <code>src/App.tsx</code> and save to test HMR
26
+ </p>
27
+ </div>
28
+ <p className="read-the-docs">
29
+ Click on the Vite and React logos to learn more
30
+ </p>
31
+ </>
32
+ )
33
+ }
34
+
35
+ export default App
frontend/src/assets/react.svg ADDED
frontend/src/components/.gitkeep ADDED
File without changes
frontend/src/components/ui/.gitkeep ADDED
File without changes
frontend/src/index.css ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ font-family: 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
+ }
15
+
16
+ a {
17
+ font-weight: 500;
18
+ color: #646cff;
19
+ text-decoration: inherit;
20
+ }
21
+ a:hover {
22
+ color: #535bf2;
23
+ }
24
+
25
+ body {
26
+ margin: 0;
27
+ display: flex;
28
+ place-items: center;
29
+ min-width: 320px;
30
+ min-height: 100vh;
31
+ }
32
+
33
+ h1 {
34
+ font-size: 3.2em;
35
+ line-height: 1.1;
36
+ }
37
+
38
+ button {
39
+ border-radius: 8px;
40
+ border: 1px solid transparent;
41
+ padding: 0.6em 1.2em;
42
+ font-size: 1em;
43
+ font-weight: 500;
44
+ font-family: inherit;
45
+ background-color: #1a1a1a;
46
+ cursor: pointer;
47
+ transition: border-color 0.25s;
48
+ }
49
+ button:hover {
50
+ border-color: #646cff;
51
+ }
52
+ button:focus,
53
+ button:focus-visible {
54
+ outline: 4px auto -webkit-focus-ring-color;
55
+ }
56
+
57
+ @media (prefers-color-scheme: light) {
58
+ :root {
59
+ color: #213547;
60
+ background-color: #ffffff;
61
+ }
62
+ a:hover {
63
+ color: #747bff;
64
+ }
65
+ button {
66
+ background-color: #f9f9f9;
67
+ }
68
+ }
frontend/src/lib/.gitkeep ADDED
File without changes
frontend/src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.tsx'
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
frontend/src/pages/.gitkeep ADDED
File without changes
frontend/src/services/.gitkeep ADDED
File without changes
frontend/src/types/.gitkeep ADDED
File without changes
frontend/tests/.gitkeep ADDED
File without changes
frontend/tests/e2e/.gitkeep ADDED
File without changes
frontend/tests/unit/.gitkeep ADDED
File without changes
frontend/tsconfig.app.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "verbatimModuleSyntax": true,
15
+ "moduleDetection": "force",
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "erasableSyntaxOnly": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+ "noUncheckedSideEffectImports": true
26
+ },
27
+ "include": ["src"]
28
+ }
frontend/tsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
frontend/tsconfig.node.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "types": ["node"],
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "erasableSyntaxOnly": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noUncheckedSideEffectImports": true
24
+ },
25
+ "include": ["vite.config.ts"]
26
+ }
frontend/vite.config.ts ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ // https://vite.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ server: {
8
+ proxy: {
9
+ '/api': {
10
+ target: 'http://localhost:8000',
11
+ changeOrigin: true,
12
+ },
13
+ },
14
+ },
15
+ })