Merge pull request 'Feature/Include linters' (#2) from feature/include-linters into main
All checks were successful
Lint and Check Types / Validations (push) Successful in 45s
All checks were successful
Lint and Check Types / Validations (push) Successful in 45s
Reviewed-on: #2
This commit is contained in:
commit
5bd08c5a36
30 changed files with 260 additions and 126 deletions
|
@ -11,6 +11,7 @@ MINIO_BUCKET_NAME=your-bucket-name
|
|||
MINIO_ENDPOINT=your-endpoint
|
||||
MINIO_SECRET_KEY=your-secret-key
|
||||
MINIO_USE_SSL=true
|
||||
MINIO_PORT=9000
|
||||
NODE_ENV=production
|
||||
TOKEN_SECRET=your-secret-key
|
||||
|
||||
|
|
|
@ -1,12 +1,21 @@
|
|||
name: CI
|
||||
name: Lint and Check Types
|
||||
on: [push]
|
||||
jobs:
|
||||
test:
|
||||
validations:
|
||||
name: Validations
|
||||
runs-on: docker
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Status
|
||||
run: git status
|
||||
- name: Host
|
||||
run: cat /etc/hosts
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
- name: Install
|
||||
run: npm install
|
||||
- name: Prisma Generate
|
||||
run: npm run prisma:generate
|
||||
- name: Lint
|
||||
run: npm run lint
|
||||
- name: Check Types
|
||||
run: npm run check-types
|
||||
|
|
3
apps/api/.gitignore
vendored
3
apps/api/.gitignore
vendored
|
@ -56,3 +56,6 @@ profile-*
|
|||
profile*
|
||||
*clinic*
|
||||
*flamegraph*
|
||||
|
||||
# prisma
|
||||
prisma/client
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint . --max-warnings 0",
|
||||
"check-types": "tsc --noEmit",
|
||||
"test": "ts-node --test test/**/*.test.ts",
|
||||
"start": "node dist/index.js",
|
||||
"dev": "nodemon --delay 2000ms src/index.ts",
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
output = "./client"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
|
|
|
@ -3,7 +3,7 @@ import dotenv from 'dotenv';
|
|||
import path from 'path';
|
||||
|
||||
const rootDir = path.resolve(process.cwd(), '../../');
|
||||
dotenv.config({ path: `${rootDir}/.env.local` });
|
||||
dotenv.config({ path: `${rootDir}/.env` });
|
||||
|
||||
const schema = z
|
||||
.object({
|
||||
|
|
|
@ -4,7 +4,7 @@ import fastifyCookie from '@fastify/cookie';
|
|||
import fastifyCors from '@fastify/cors';
|
||||
import mercurius from 'mercurius';
|
||||
import mercuriusCodegen from 'mercurius-codegen';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { PrismaClient } from '../prisma/client';
|
||||
import config from './config';
|
||||
import { resolvers } from './resolvers';
|
||||
import schema from './schema';
|
||||
|
|
|
@ -91,7 +91,7 @@ export class MinioService {
|
|||
try {
|
||||
await this.client.statObject(this.bucketName, objectName);
|
||||
return true;
|
||||
} catch (error) {
|
||||
} catch (_error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ import jwt from 'jsonwebtoken';
|
|||
import { v4 as uuidv4 } from 'uuid';
|
||||
import crypto from 'crypto';
|
||||
import { TokenConfig } from '../config';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { PrismaClient } from '../../prisma/client';
|
||||
import { MemcService } from './memc.service';
|
||||
|
||||
type TransactionClient = Omit<
|
||||
|
@ -90,7 +90,7 @@ export class TokenService {
|
|||
);
|
||||
|
||||
const tx = txn
|
||||
? (callback: Function) => callback(txn)
|
||||
? (callback: (tx: TransactionClient) => Promise<void>) => callback(txn)
|
||||
: this.prisma.$transaction.bind(this.prisma);
|
||||
|
||||
await tx(async (tx) => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { PrismaClient } from '@prisma/client';
|
||||
import type { PrismaClient } from '../prisma/client';
|
||||
import {
|
||||
MinioService,
|
||||
TokenService,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable @typescript-eslint/no-unsafe-function-type */
|
||||
import { MercuriusContext } from 'mercurius';
|
||||
|
||||
const isCallback = (
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
"name": "web",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"lint": "eslint . --max-warnings 0",
|
||||
"check-types": "tsc --noEmit",
|
||||
"dev": "vite",
|
||||
"build": "tsc -b && vite build",
|
||||
"preview": "vite preview"
|
||||
|
|
|
@ -27,8 +27,8 @@ function App() {
|
|||
|
||||
// Check if user is already authenticated
|
||||
const checkAuth = () => {
|
||||
const token = localStorage.getItem('token');
|
||||
const storedUserId = localStorage.getItem('userId');
|
||||
const token = window.localStorage.getItem('token');
|
||||
const storedUserId = window.localStorage.getItem('userId');
|
||||
|
||||
if (token && storedUserId) {
|
||||
setIsAuthenticated(true);
|
||||
|
@ -52,8 +52,8 @@ function App() {
|
|||
} catch (error) {
|
||||
console.error('Logout failed:', error);
|
||||
} finally {
|
||||
localStorage.removeItem('token');
|
||||
localStorage.removeItem('userId');
|
||||
window.localStorage.removeItem('token');
|
||||
window.localStorage.removeItem('userId');
|
||||
setIsAuthenticated(false);
|
||||
setUserId('');
|
||||
setSelectedRoomId(null);
|
||||
|
|
|
@ -75,10 +75,7 @@ interface ChatRoomProps {
|
|||
}
|
||||
|
||||
export function ChatRoom(props: ChatRoomProps) {
|
||||
const [variables, setVariables] = createSignal({
|
||||
id: props.roomId,
|
||||
roomId: props.roomId,
|
||||
});
|
||||
const [variables, setVariables] = createSignal({});
|
||||
const [message, setMessage] = createSignal('');
|
||||
const [messages, setMessages] = createSignal<Message[]>([]);
|
||||
const [confirmLeave, setConfirmLeave] = createSignal(false);
|
||||
|
@ -240,9 +237,9 @@ export function ChatRoom(props: ChatRoomProps) {
|
|||
}
|
||||
};
|
||||
|
||||
document.addEventListener('mousedown', handleClickOutside);
|
||||
window.document.addEventListener('mousedown', handleClickOutside);
|
||||
return () => {
|
||||
document.removeEventListener('mousedown', handleClickOutside);
|
||||
window.document.removeEventListener('mousedown', handleClickOutside);
|
||||
};
|
||||
});
|
||||
|
||||
|
@ -345,8 +342,8 @@ export function ChatRoom(props: ChatRoomProps) {
|
|||
|
||||
{showEmojiPicker() && (
|
||||
<div ref={emojiPickerContainer} class='emoji-picker-container'>
|
||||
{/* @ts-ignore */}
|
||||
<emoji-picker ref={(el: Picker) => setPickerRef(el)}></emoji-picker>
|
||||
{/* @ts-expect-error - emoji-picker-element is not typed */}
|
||||
<emoji-picker ref={(el: Picker) => setPickerRef(el)} />
|
||||
</div>
|
||||
)}
|
||||
</form>
|
||||
|
|
|
@ -48,8 +48,8 @@ export function LoginForm(props: LoginFormProps) {
|
|||
|
||||
if (result.data?.login) {
|
||||
const { accessToken, user } = result.data.login;
|
||||
localStorage.setItem('token', accessToken);
|
||||
localStorage.setItem('userId', user.id);
|
||||
window.localStorage.setItem('token', accessToken);
|
||||
window.localStorage.setItem('userId', user.id);
|
||||
props.onLoginSuccess(accessToken, user.id);
|
||||
} else {
|
||||
setError('Login failed: No data received from server');
|
||||
|
|
|
@ -56,8 +56,8 @@ export function RegisterForm(props: RegisterFormProps) {
|
|||
|
||||
if (result.data?.register) {
|
||||
const { accessToken, user } = result.data.register;
|
||||
localStorage.setItem('token', accessToken);
|
||||
localStorage.setItem('userId', user.id);
|
||||
window.localStorage.setItem('token', accessToken);
|
||||
window.localStorage.setItem('userId', user.id);
|
||||
props.onRegisterSuccess(accessToken, user.id);
|
||||
} else {
|
||||
setError('Registration failed: No data received from server');
|
||||
|
|
|
@ -172,7 +172,7 @@ export function RoomList(props: RoomListProps) {
|
|||
|
||||
// Check if the current user is a member of a room
|
||||
const isMember = (room: Room) => {
|
||||
const userId = localStorage.getItem('userId');
|
||||
const userId = window.localStorage.getItem('userId');
|
||||
return room.members?.some((member) => member.id === userId);
|
||||
};
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ export const client = createClient({
|
|||
],
|
||||
// For development, we'll add a simple header-based authentication
|
||||
fetchOptions: () => {
|
||||
const token = localStorage.getItem('token');
|
||||
const token = window.localStorage.getItem('token');
|
||||
return {
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
|
|
219
package-lock.json
generated
219
package-lock.json
generated
|
@ -158,19 +158,25 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/code-frame": {
|
||||
"version": "7.26.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
|
||||
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": "^7.25.9",
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"js-tokens": "^4.0.0",
|
||||
"picocolors": "^1.0.0"
|
||||
"picocolors": "^1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/code-frame/node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/@babel/compat-data": {
|
||||
"version": "7.26.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
|
||||
|
@ -407,18 +413,18 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/helper-string-parser": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
|
||||
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
|
||||
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-validator-identifier": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
|
||||
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
|
||||
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -434,25 +440,25 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/helpers": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
|
||||
"integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
|
||||
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/template": "^7.26.9",
|
||||
"@babel/types": "^7.26.9"
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
|
||||
"integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz",
|
||||
"integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.26.9"
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
|
@ -879,40 +885,36 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
|
||||
"integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
|
||||
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime-corejs3": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.9.tgz",
|
||||
"integrity": "sha512-5EVjbTegqN7RSJle6hMWYxO4voo4rI+9krITk+DWR+diJgGrjZjrIBnJhjrHYYQsFgI7j1w1QnrvV7YSKBfYGg==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz",
|
||||
"integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"core-js-pure": "^3.30.2",
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
"core-js-pure": "^3.30.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/template": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
|
||||
"integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
|
||||
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.26.2",
|
||||
"@babel/parser": "^7.26.9",
|
||||
"@babel/types": "^7.26.9"
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/parser": "^7.27.2",
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -946,13 +948,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/types": {
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
|
||||
"integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
|
||||
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-string-parser": "^7.25.9",
|
||||
"@babel/helper-validator-identifier": "^7.25.9"
|
||||
"@babel/helper-string-parser": "^7.27.1",
|
||||
"@babel/helper-validator-identifier": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -5231,9 +5233,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/fastify": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-5.2.1.tgz",
|
||||
"integrity": "sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==",
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.2.tgz",
|
||||
"integrity": "sha512-AIPqBgtqBAwkOkrnwesEE+dOyU30dQ4kh7udxeGVR05CRGwubZx+p2H8P0C4cRnQT0+EPK4VGea2DTL2RtWttg==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
|
@ -5256,9 +5258,9 @@
|
|||
"find-my-way": "^9.0.0",
|
||||
"light-my-request": "^6.0.0",
|
||||
"pino": "^9.0.0",
|
||||
"process-warning": "^4.0.0",
|
||||
"process-warning": "^5.0.0",
|
||||
"rfdc": "^1.3.1",
|
||||
"secure-json-parse": "^3.0.1",
|
||||
"secure-json-parse": "^4.0.0",
|
||||
"semver": "^7.6.0",
|
||||
"toad-cache": "^3.7.0"
|
||||
}
|
||||
|
@ -5269,6 +5271,38 @@
|
|||
"integrity": "sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fastify/node_modules/process-warning": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz",
|
||||
"integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/fastify"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/fastify"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fastify/node_modules/secure-json-parse": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz",
|
||||
"integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/fastify"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/fastify"
|
||||
}
|
||||
],
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/fastparallel": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz",
|
||||
|
@ -8170,6 +8204,7 @@
|
|||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
|
||||
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
|
@ -8537,12 +8572,6 @@
|
|||
"node": ">= 12.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/registry-auth-token": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
|
||||
|
@ -9420,6 +9449,51 @@
|
|||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.13",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
|
||||
"integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fdir": "^6.4.4",
|
||||
"picomatch": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby/node_modules/fdir": {
|
||||
"version": "6.4.4",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
|
||||
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"picomatch": "^3 || ^4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"picomatch": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby/node_modules/picomatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/tinygradient": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz",
|
||||
|
@ -9965,15 +10039,18 @@
|
|||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz",
|
||||
"integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==",
|
||||
"version": "6.3.5",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
|
||||
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.4.4",
|
||||
"picomatch": "^4.0.2",
|
||||
"postcss": "^8.5.3",
|
||||
"rollup": "^4.30.1"
|
||||
"rollup": "^4.34.9",
|
||||
"tinyglobby": "^0.2.13"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
|
@ -10061,6 +10138,34 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/fdir": {
|
||||
"version": "6.4.4",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
|
||||
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"picomatch": "^3 || ^4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"picomatch": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/picomatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/vitefu": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz",
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
"start:api": "turbo run start --filter=api",
|
||||
"lint": "turbo run lint",
|
||||
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
|
||||
"check-types": "turbo run check-types"
|
||||
"check-types": "turbo run check-types",
|
||||
"prisma:generate": "turbo run prisma:generate"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.13.9",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import js from '@eslint/js';
|
||||
import eslint from '@eslint/js';
|
||||
import turboPlugin from 'eslint-plugin-turbo';
|
||||
import tseslint from 'typescript-eslint';
|
||||
|
||||
|
@ -7,18 +7,30 @@ import tseslint from 'typescript-eslint';
|
|||
*
|
||||
* @type {import("eslint").Linter.Config[]}
|
||||
* */
|
||||
export const config = [
|
||||
js.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
export const config = tseslint.config(
|
||||
eslint.configs.recommended,
|
||||
tseslint.configs.recommended,
|
||||
[
|
||||
{
|
||||
plugins: {
|
||||
turbo: turboPlugin,
|
||||
},
|
||||
rules: {
|
||||
'turbo/no-undeclared-env-vars': 'warn',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-empty-object-type': 'off',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'error',
|
||||
{
|
||||
argsIgnorePattern: '^_',
|
||||
varsIgnorePattern: '^_',
|
||||
caughtErrorsIgnorePattern: '^_',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
ignores: ['dist/**'],
|
||||
ignores: ['dist/**', 'prisma/client/**'],
|
||||
},
|
||||
];
|
||||
]
|
||||
);
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import js from '@eslint/js';
|
||||
import solid from 'eslint-plugin-solid/configs/typescript';
|
||||
import * as tsParser from '@typescript-eslint/parser';
|
||||
import { config as baseConfig } from './base.js';
|
||||
|
@ -9,15 +8,19 @@ import { config as baseConfig } from './base.js';
|
|||
* @type {import("eslint").Linter.Config[]} */
|
||||
export const config = [
|
||||
...baseConfig,
|
||||
js.configs.recommended,
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
...solid,
|
||||
ignores: ['turbo/generators/**', 'vite.config.ts'],
|
||||
languageOptions: {
|
||||
parser: tsParser,
|
||||
parserOptions: {
|
||||
project: 'tsconfig.json',
|
||||
},
|
||||
globals: {
|
||||
window: true,
|
||||
console: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
"exports": {
|
||||
"./*": "./src/*.tsx"
|
||||
},
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"lint": "eslint . --max-warnings 0",
|
||||
"generate:component": "turbo gen react-component",
|
||||
|
|
|
@ -8,13 +8,13 @@ interface ButtonProps {
|
|||
appName: string;
|
||||
}
|
||||
|
||||
export const Button = ({ children, className, appName }: ButtonProps) => {
|
||||
export const Button = (props: ButtonProps) => {
|
||||
return (
|
||||
<button
|
||||
class={className}
|
||||
onClick={() => alert(`Hello from your ${appName} app!`)}
|
||||
class={props.className}
|
||||
onClick={() => window.alert(`Hello from your ${props.appName} app!`)}
|
||||
>
|
||||
{children}
|
||||
{props.children}
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
import { type JSX } from 'solid-js/jsx-runtime';
|
||||
|
||||
export function Card({
|
||||
className,
|
||||
title,
|
||||
children,
|
||||
href,
|
||||
}: {
|
||||
export function Card(props: {
|
||||
className?: string;
|
||||
title: string;
|
||||
children: JSX.Element;
|
||||
|
@ -13,15 +8,15 @@ export function Card({
|
|||
}): JSX.Element {
|
||||
return (
|
||||
<a
|
||||
class={className}
|
||||
href={`${href}?utm_source=create-turbo&utm_medium=basic&utm_campaign=create-turbo"`}
|
||||
class={props.className}
|
||||
href={`${props.href}?utm_source=create-turbo&utm_medium=basic&utm_campaign=create-turbo"`}
|
||||
rel='noopener noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<h2>
|
||||
{title} <span>-></span>
|
||||
{props.title} <span>-></span>
|
||||
</h2>
|
||||
<p>{children}</p>
|
||||
<p>{props.children}</p>
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
import { type JSX } from 'solid-js/jsx-runtime';
|
||||
|
||||
export function Code({
|
||||
children,
|
||||
className,
|
||||
}: {
|
||||
export function Code(props: {
|
||||
children: JSX.Element;
|
||||
className?: string;
|
||||
}): JSX.Element {
|
||||
return <code class={className}>{children}</code>;
|
||||
return <code class={props.className}>{props.children}</code>;
|
||||
}
|
||||
|
|
|
@ -3,5 +3,6 @@
|
|||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src"]
|
||||
"include": ["src"],
|
||||
"exclude": ["turbo/generators"]
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
],
|
||||
"tasks": {
|
||||
"build": {
|
||||
"dependsOn": ["^build"],
|
||||
"dependsOn": ["^build", "^prisma:generate"],
|
||||
"inputs": [".env*"],
|
||||
"outputs": ["dist/**"]
|
||||
},
|
||||
|
@ -34,9 +34,13 @@
|
|||
"dependsOn": ["^check-types"]
|
||||
},
|
||||
"dev": {
|
||||
"dependsOn": ["^prisma:generate"],
|
||||
"cache": false,
|
||||
"persistent": true
|
||||
},
|
||||
"prisma:generate": {
|
||||
"cache": false
|
||||
},
|
||||
"start": {
|
||||
"cache": false,
|
||||
"persistent": true
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue