Clean repo

This commit is contained in:
2025-07-29 05:29:10 +07:00
parent 36cb672ce4
commit d281d7cd02
40 changed files with 165 additions and 10182 deletions

165
CLAUDE.md Normal file
View File

@@ -0,0 +1,165 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Common Development Commands
### Backend (.NET)
```bash
# Build entire solution
dotnet build src/Managing.sln
# Run main API (port 80/443)
dotnet run --project src/Managing.Api/Managing.Api.csproj
# Run worker API (port 81/444)
dotnet run --project src/Managing.Api.Workers/Managing.Api.Workers.csproj
# Run tests
dotnet test src/Managing.Application.Tests/
dotnet test src/Managing.Infrastructure.Tests/
# Run specific test
dotnet test --filter "TestMethodName"
# Database migrations
dotnet ef database update --project src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj --context ManagingDbContext
dotnet ef migrations add <MigrationName> --project src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj --context ManagingDbContext
# Regenerate API client (after API changes)
cd src/Managing.Nswag && dotnet build
```
### Frontend (React/TypeScript)
```bash
cd src/Managing.WebApp
# Install dependencies
npm install
# Development server
npm run dev
# Build for production
npm run build
# Linting and type checking
npm run lint
npm run typecheck
# Tests
npm run test
```
### Full Stack Development
```bash
# Quick start with Docker
./scripts/build_and_run.sh
# Alternative using Aspire
cd src && ./run-aspire.sh
```
## Architecture Overview
### Clean Architecture Pattern
The codebase follows Clean Architecture with clear layer separation:
- **Domain** (`Managing.Domain`): Business entities and core rules
- **Application** (`Managing.Application*`): Use cases, commands, and business orchestration
- **Infrastructure** (`Managing.Infrastructure.*`): External integrations (databases, Web3, messaging)
- **Presentation** (`Managing.Api*`): REST APIs and controllers
### Service Architecture
Multiple coordinated services handle different concerns:
- **Managing.Api**: Main trading operations, bot management, backtesting
- **Managing.Api.Workers**: Background workers for price data, genetic algorithms, statistics
- **Managing.Web3Proxy**: Node.js service for Web3/GMX blockchain interactions
- **Managing.WebApp**: React frontend with real-time SignalR updates
### Data Storage Strategy (Polyglot Persistence)
- **PostgreSQL**: Transactional data (users, bots, positions, scenarios, backtests)
- **InfluxDB**: Time-series data (OHLCV candles, agent balances, performance metrics)
- **MongoDB**: Document storage for certain data types
### Key Domain Concepts
- **Bot**: Abstract base with lifecycle management for trading automation
- **Position**: Trading positions with PnL tracking and trade history
- **Scenario**: Collections of technical indicators defining trading strategies
- **Indicator**: Technical analysis tools (RSI, MACD, EMA, SuperTrend, etc.)
- **MoneyManagement**: Risk parameters (stop loss, take profit, position sizing)
- **Account**: Multi-exchange trading accounts (CEX, GMX V2, Privy wallets)
## Development Patterns
### Adding New Features
1. **Domain First**: Create entities in `Managing.Domain`
2. **Application Layer**: Add services/command handlers in `Managing.Application`
3. **Infrastructure**: Implement repositories and external integrations
4. **API Layer**: Add controllers and endpoints
5. **Frontend**: Update React components and API client
### Bot Development
- Inherit from `Bot` base class in `Managing.Domain/Bots/`
- Implement `SaveBackup()` and `LoadBackup()` for persistence
- Use dependency injection pattern for services
- Follow worker pattern for background execution
### Adding Technical Indicators
1. Create indicator class implementing `IIndicator`
2. Add to `IndicatorType` enum in `Managing.Common`
3. Register in DI container via `ApiBootstrap`
4. Implement calculation logic in `TradingService`
### Database Changes
1. Update entities in domain layer
2. Modify `ManagingDbContext` with new DbSets
3. Generate EF Core migration
4. Update repository interfaces and implementations
5. Consider InfluxDB for time-series data
### Web3 Integration
- GMX V2 interactions go through `Managing.Web3Proxy` Node.js service
- Use `Managing.Infrastructure.Web3` for .NET integration
- Privy handles wallet management and authentication
## Configuration & Environment
### Key Configuration Files
- `src/Managing.Api/appsettings.*.json`: Main API configuration
- `src/Managing.Api.Workers/appsettings.*.json`: Worker configuration
- `src/Managing.WebApp/.env`: Frontend environment variables
### Environment-Specific Deployments
- Development: `appsettings.Development.json`
- Sandbox: `appsettings.Sandbox.json`
- Production: `appsettings.Production.json`
- Docker: `appsettings.Oda-docker.json`
## Important Development Guidelines
### Quantitative Finance Principles
- Use `decimal` for all monetary calculations (never `float` or `double`)
- Implement proper audit trails for financial operations
- Validate trading strategies with historical backtesting
- Optimize time-series processing for performance
### Code Architecture Rules
- Follow Controller → Application → Repository pattern (never inject repositories directly into controllers)
- Use CQRS pattern with command handlers for complex operations
- Implement proper error handling with user-friendly messages
- Maintain separation between domain logic and infrastructure concerns
### API Development
- Follow RESTful conventions
- Use attribute routing in controllers
- Return appropriate HTTP status codes
- Implement proper validation using Data Annotations
### Testing Strategy
- Unit tests focus on domain logic and indicators
- Integration tests for external service interactions
- Use data-driven testing with JSON fixtures for backtesting scenarios
## Real-time Features
- SignalR hubs provide live updates for trading data, bot status, and market information
- Frontend uses reactive patterns with real-time price feeds and position updates

18
package-lock.json generated
View File

@@ -1,18 +0,0 @@
{
"name": "managing-apps",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"genetic-js": "^0.1.14"
}
},
"node_modules/genetic-js": {
"version": "0.1.14",
"resolved": "https://registry.npmjs.org/genetic-js/-/genetic-js-0.1.14.tgz",
"integrity": "sha512-HHm21naCEF1EVKTWPFzKX4ENB7Nn/my4kTy2POi4u/2gB0XPUOh8oDlhhESVCZVBge3b7nuLrZNZNAt4ObH19Q==",
"license": "BSD"
}
}
}

View File

@@ -1,5 +0,0 @@
{
"dependencies": {
"genetic-js": "^0.1.14"
}
}

View File

@@ -1 +0,0 @@

View File

@@ -1,7 +0,0 @@
VITE_API_URL_LOCAL=http://localhost:5000
VITE_API_URL_SERVER=https://dev-managing-api.apps.managing.live
VITE_WORKER_URL_LOCAL=https://localhost:5002
VITE_WORKER_URL_SERVER=https://dev-managing-worker.apps.managing.live
ALCHEMY_ID=Bao7OirVe4bmYiDbPh0l8cs5gYb5D4_9
WALLET_CONNECT_PROJECT_ID=363bf09c10fec2293b21ee199b2ce8d5
VITE_PRIVY_APP_ID=cm7u09v0u002zrkuf2yjjr58p

View File

@@ -1,2 +0,0 @@
node_modules
dist

View File

@@ -1,98 +0,0 @@
{
"root": true,
"extends": [
"plugin:@typescript-eslint/recommended",
"plugin:jsx-a11y/recommended"
],
"parser": "@typescript-eslint/parser",
"plugins": [
"jsx-a11y",
"import",
"sort-keys-fix",
"react-hooks",
"@typescript-eslint",
"prettier"
],
"env": {
"browser": true,
"node": true,
"es6": true,
"jest": true
},
"globals": {
"JSX": "readonly"
},
"settings": {
"react": {
"version": "detect"
},
"import/parsers": {
"@typescript-eslint/parser": [".ts", ".tsx"]
},
"import/resolver": {
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"]
},
"typescript": {
"alwaysTryTypes": true,
// always try to resolve types under `<root>@types` directory even it doesn't contain any source code, like `@types/unist`
"project": ["tsconfig.json"]
}
}
},
"rules": {
"no-alert": "error",
"no-console": "error",
"react-hooks/rules-of-hooks": "error",
"prettier/prettier": [
"warn",
{},
{
"properties": {
"usePrettierrc": true
}
}
],
"import/order": [
"warn",
{
"groups": [
"builtin",
"external",
"internal",
"parent",
"sibling",
"index",
"object"
],
"newlines-between": "always",
"alphabetize": {
"order": "asc",
"caseInsensitive": true
}
}
],
"import/named": "error",
"import/default": "error",
"import/export": "error",
"import/no-named-as-default": "warn",
"import/no-duplicates": "error",
"sort-keys-fix/sort-keys-fix": "warn",
"@import/no-named-as-default-member": "off",
"@typescript-eslint/consistent-type-imports": "warn",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-empty-function": "off"
},
"overrides": [
{
"files": ["*.js"],
"rules": {
"@typescript-eslint/explicit-module-boundary-types": ["off"],
"@typescript-eslint/no-var-requires": ["off"]
}
}
]
}

View File

@@ -1,3 +0,0 @@
.jest/* linguist-vendored
mocks/* linguist-vendored
mockServiceWorker.js linguist-vendored

View File

@@ -1,18 +0,0 @@
name: Build
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: '18.1.0'
- run: yarn install
- run: yarn build

View File

@@ -1,18 +0,0 @@
name: Lint
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: '18.1.0'
- run: yarn install
- run: yarn lint

View File

@@ -1,18 +0,0 @@
name: Test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: '18.1.0'
- run: yarn install
- run: yarn test

View File

@@ -1,18 +0,0 @@
name: Typecheck
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: '18.1.0'
- run: yarn install
- run: yarn typecheck

View File

@@ -1,5 +0,0 @@
node_modules
.DS_Store
dist
dist-ssr
*.local

View File

@@ -1,5 +0,0 @@
.git
node_modules
.eslintignore
.gitignore
LICENSE

View File

@@ -1,4 +0,0 @@
{
"singleQuote": true,
"semi": false
}

View File

@@ -1,42 +0,0 @@
# Use an official Node.js image as the base
FROM node:18-alpine
# Set the working directory in the container
WORKDIR /app
# Set environment variable to skip Chromium download
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
# Install git and Python
RUN apk update && apk add --no-cache git python3 make g++
# Create a symlink for python3 as python
RUN ln -sf /usr/bin/python3 /usr/bin/python
# Copy package.json and package-lock.json to the container
# COPY package*.json ./
COPY /src/Managing.WebApp/package.json ./
# Install dependencies with the --legacy-peer-deps flag to bypass peer dependency conflicts
RUN npm install --legacy-peer-deps
RUN npm install -g tailwindcss postcss autoprefixer @tailwindcss/typography
# Copy the rest of the app's source code to the container
# COPY . .
COPY src/Managing.WebApp/ /app/
RUN node --max-old-space-size=8192 ./node_modules/.bin/vite build
# Build the app
RUN npm run build
# Use NGINX as the web server
FROM nginx:alpine
# Copy the built app to the NGINX web server directory
COPY --from=0 /app/build /usr/share/nginx/html
# Expose port 80 for the NGINX web server
EXPOSE 80
# Start the NGINX web server
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,44 +0,0 @@
# Use an official Node.js image as the base
FROM node:18-alpine
# Set the working directory in the container
WORKDIR /app
# Set environment variable to skip Chromium download
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
# Install git and Python
RUN apk update && apk add --no-cache git python3 make g++
# Create a symlink for python3 as python
RUN ln -sf /usr/bin/python3 /usr/bin/python
# Copy package.json and package-lock.json to the container
# COPY package*.json ./
COPY /src/Managing.Pinky/package.json ./
# Install dependencies with the --legacy-peer-deps flag to bypass peer dependency conflicts
RUN npm install --legacy-peer-deps
RUN npm install -g tailwindcss postcss autoprefixer @tailwindcss/typography
# Copy the rest of the app's source code to the container
# COPY . .
RUN ls -la
COPY src/Managing.Pinky/ .
RUN node --max-old-space-size=8192 ./node_modules/.bin/vite build
# Build the app
RUN npm run build
# Use NGINX as the web server
FROM nginx:alpine
# Copy the built app to the NGINX web server directory
# COPY --from=0 /app/build /usr/share/nginx/html
COPY --from=0 /app/dist /usr/share/nginx/html
# Expose port 80 for the NGINX web server
EXPOSE 80
# Start the NGINX web server
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) Managing
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,94 +0,0 @@
# vite-react-ts-extended [![Typecheck](https://github.com/laststance/vite-react-ts-extended/actions/workflows/typecheck.yml/badge.svg)](https://github.com/laststance/vite-react-ts-extended/actions/workflows/typecheck.yml) [![Test](https://github.com/laststance/vite-react-ts-extended/actions/workflows/test.yml/badge.svg)](https://github.com/laststance/vite-react-ts-extended/actions/workflows/test.yml) [![Build](https://github.com/laststance/vite-react-ts-extended/actions/workflows/build.yml/badge.svg)](https://github.com/laststance/vite-react-ts-extended/actions/workflows/build.yml) [![Lint](https://github.com/laststance/vite-react-ts-extended/actions/workflows/lint.yml/badge.svg)](https://github.com/laststance/vite-react-ts-extended/actions/workflows/lint.yml) [![Depfu](https://badges.depfu.com/badges/6c7775918ccc8647160750e168617a65/overview.svg)](https://depfu.com/github/laststance/vite-react-ts-extended?project_id=32682)
> My CRA alternative.
> Create plain and lightweight React+TS programming environment with familiar pre-setup tooling
> eslint/prettier, jest/TS/react-testing-library/msw, tailwindcss, CI.
## [Trying this Online!](https://codesandbox.io/s/vite-react-ts-extended-cbgyfz?file=/src/App.tsx)
<img src="https://digital3.nyc3.cdn.digitaloceanspaces.com/ext.png" />
This is the official [Vite](https://vitejs.dev/) template(`npm init vite@latest myapp -- --template react-ts`) and some extended setup.
- [eslint-typescript](https://github.com/typescript-eslint/typescript-eslint) and [Prettier](https://prettier.io/) integration. Rules are 100% my personal setup 💅
- [jest](https://jestjs.io/), [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/), [react-hooks-testing-library](https://github.com/testing-library/react-hooks-testing-library), [MSW](https://mswjs.io/)
- [tailwindcss](https://tailwindcss.com/)
- [Github Actions](https://github.com/features/actions)
All npm package are keeping least release version powered by [Depfu](https://depfu.com/).
# Installation
```
npx degit laststance/vite-react-ts-extended myapp
```
### yarn
```sh
cd myapp
yarn install
yarn validate # The installation was successful if no error occurs after running 'validate'.
yarn dev
```
### npm
```sh
cd myapp
npm install
npm run validate # The installation was successful if no error occurs after running 'validate'.
npm run dev
```
### Commands
```sh
yarn dev # start development server
yarn validate # run test,lint,build,typecheck concurrently
yarn test # run jest
yarn lint # run eslint
yarn lint:fix # run eslint with --fix option
yarn typecheck # run TypeScript compiler check
yarn build # build production bundle to 'dist' directly
yarn prettier # run prettier for json|yml|css|md|mdx files
yarn clean # remove 'node_modules' 'yarn.lock' 'dist' completely
yarn serve # launch server for production bundle in local
```
# Background
The evolution of the React framework is accelerating more than ever before.
[Next.js](https://nextjs.org/), [Remix](https://remix.run/), [RedwoodJS](https://redwoodjs.com/), [Gatsby](https://www.gatsbyjs.com/), [Blitz](https://blitzjs.com/) etc...
Ahthough I still need plain React programming starter some reason. (.e.g Demo, Experiment like Deep Dive React Core.)
So far, [create-react-app](https://github.com/facebook/create-react-app) **was** it.
In short, [create-react-app](https://github.com/facebook/create-react-app) development couldn't say active. Please read the [Issue](https://github.com/facebook/create-react-app/issues/11180) in details.
So I created an alternative to [create-react-app](https://github.com/facebook/create-react-app) for myself, based on [Vite](https://github.com/facebook/create-react-app).
This project contains my very opinionted setup,
but I hope it will be a useful tool for people who have similar needs to mine! 😀
# License
MIT
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="http://ryota-murakami.github.io/"><img src="https://avatars1.githubusercontent.com/u/5501268?s=400&u=7bf6b1580b95930980af2588ef0057f3e9ec1ff8&v=4?s=100" width="100px;" alt=""/><br /><sub><b>ryota-murakami</b></sub></a><br /><a href="https://github.com/laststance/vite-react-ts-extended/laststance/vite-react-ts-extended/commits?author=ryota-murakami" title="Code">💻</a> <a href="https://github.com/laststance/vite-react-ts-extended/laststance/vite-react-ts-extended/commits?author=ryota-murakami" title="Documentation">📖</a> <a href="https://github.com/laststance/vite-react-ts-extended/laststance/vite-react-ts-extended/commits?author=ryota-murakami" title="Tests">⚠️</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

View File

@@ -1,493 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Happy Birthday My Love</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap');
body {
font-family: 'Press Start 2P', cursive;
background-color: #f5e6ff;
color: #5a3d7a;
overflow-x: hidden;
touch-action: manipulation;
}
.pixel-box {
border: 4px solid #5a3d7a;
box-shadow: 8px 8px 0 rgba(90, 61, 122, 0.2);
position: relative;
}
.pixel-box::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
right: 2px;
bottom: 2px;
border: 2px solid #d9b3ff;
pointer-events: none;
}
.pixel-btn {
border: 3px solid #5a3d7a;
box-shadow: 4px 4px 0 rgba(90, 61, 122, 0.2);
transition: all 0.1s;
}
.pixel-btn:active {
transform: translate(2px, 2px);
box-shadow: 2px 2px 0 rgba(90, 61, 122, 0.2);
}
.pixel-divider {
height: 4px;
background-color: #5a3d7a;
position: relative;
}
.pixel-divider::after {
content: '';
position: absolute;
top: 2px;
left: 0;
right: 0;
height: 2px;
background-color: #d9b3ff;
}
.pixel-avatar {
border: 3px solid #5a3d7a;
}
.section {
min-height: 100vh;
padding: 2rem;
display: flex;
flex-direction: column;
justify-content: center;
}
.pixel-text {
text-shadow: 2px 2px 0 rgba(90, 61, 122, 0.2);
line-height: 1.6;
}
.pixel-scene {
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
/* Hide audio controls */
#bgMusic {
display: none;
}
/* Pixel heart animation */
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
.pixel-heart {
animation: pulse 1.5s infinite;
image-rendering: pixelated;
}
/* Password modal styles */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background-color: #fff;
padding: 2rem;
border-radius: 8px;
text-align: center;
animation: fadeIn 0.3s ease-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: scale(0.8); }
to { opacity: 1; transform: scale(1); }
}
.content-hidden {
display: none;
}
.shake {
animation: shake 0.5s ease-in-out;
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-10px); }
75% { transform: translateX(10px); }
}
</style>
</head>
<body class="relative">
<!-- Password Modal -->
<div id="passwordModal" class="modal-overlay">
<div class="modal-content pixel-box">
<h2 class="text-xl mb-6 text-purple-800 pixel-text">Enter Password</h2>
<div class="mb-4">
<input type="password" id="passwordInput"
class="w-full px-4 py-2 border-2 border-purple-300 rounded focus:outline-none focus:border-purple-500"
placeholder="Password">
</div>
<button id="submitPassword"
class="pixel-btn bg-purple-500 text-white px-6 py-2 rounded hover:bg-purple-600 transition-colors">
Enter
</button>
<p id="errorMessage" class="mt-4 text-red-500 text-sm hidden pixel-text">Incorrect password. Try again!</p>
</div>
</div>
<!-- Main Content -->
<div id="mainContent" class="content-hidden">
<!-- Background Music -->
<audio id="bgMusic" loop>
<source src="sound.mp3" type="audio/mpeg" autoplay>
</audio>
<!-- Music Toggle Button -->
<button id="musicToggle" class="fixed bottom-4 right-4 z-50 w-12 h-12 bg-purple-300 pixel-btn rounded-full flex items-center justify-center">
<svg id="musicIcon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#5a3d7a">
<path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/>
</svg>
</button>
<!-- Navigation Dots -->
<div class="fixed right-4 top-1/2 transform -translate-y-1/2 z-40 flex flex-col space-y-3">
<a href="#section1" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section2" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section3" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section4" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section5" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section6" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section7" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section8" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
<a href="#section9" class="w-3 h-3 rounded-full bg-purple-300 border-2 border-purple-700 dot"></a>
</div>
<!-- Sections -->
<div id="section1" class="section bg-pink-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://img.freepik.com/premium-photo/high-rise-buildings-downtown-bangkok-night_5219-2322.jpg?w=996" alt="Rooftop pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h1 class="text-xl md:text-2xl text-center mb-6 text-purple-800 pixel-text">Happy Birthday My Love!</h1>
<p class="text-xs md:text-sm mb-4 pixel-text">Our journey together began on a rooftop...</p>
<p class="text-xs md:text-sm pixel-text">Where we first met under the stars ✨</p>
<div class="flex justify-center mt-8">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-10 h-10 pixel-heart">
</div>
</div>
</div>
<div id="section2" class="section bg-purple-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQcLaTSzF2i_kDkosNQgoW8bgqg4rq-568TXw&s" alt="Park pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Our First Date</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Walking in the park together</p>
<p class="text-xs md:text-sm pixel-text">I knew then you were special 💕</p>
<div class="flex justify-between mt-8">
<img src="pics/khaosok.JPG" alt="You" class="w-16 h-16 pixel-avatar">
<img src="pics/temple.jpg" alt="Her" class="w-16 h-16 pixel-avatar">
</div>
</div>
</div>
<div id="section3" class="section bg-pink-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="pics/cook.jpg" alt="Kitchen pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Our First Cooking Night</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Making dinner together in your kitchen</p>
<p class="text-xs md:text-sm pixel-text">Simple moments that mean everything 🍳</p>
<div class="flex justify-center mt-8">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-10 h-10 pixel-heart">
</div>
</div>
</div>
<div id="section4" class="section bg-purple-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://www.airportels.asia/wp-content/uploads/2023/12/Shopping-Spots-in-Chinatown-scaled.webp" alt="Chinese restaurant pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Chinese Restaurant</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">"I like to try things"</p>
<p class="text-xs md:text-sm pixel-text">And trying life with you has been the best adventure 🥢</p>
<div class="flex justify-center mt-8">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-10 h-10 pixel-heart">
</div>
</div>
</div>
<div id="section5" class="section bg-pink-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/00/a4/db.jpg" alt="Kao Sok pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Kao Sok Adventure</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Our trip to Kao Sok with my best friend</p>
<p class="text-xs md:text-sm pixel-text">Sharing my world with you 🌿</p>
<div class="flex justify-center mt-8">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel jungle" class="w-24 h-24">
</div>
</div>
</div>
<div id="section6" class="section bg-purple-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://dynamic-media-cdn.tripadvisor.com/media/photo-o/07/b9/58/b4/photo0jpg.jpg?w=1200&h=-1&s=1&cx=1000&cy=543&chk=v1_d6044045ef865bfe074a" alt="Kuala Lumpur pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Kuala Lumpur</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Joining you during your work trip</p>
<p class="text-xs md:text-sm pixel-text">Because every moment with you is precious 🌆</p>
<div class="flex justify-center mt-8">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-10 h-10 pixel-heart">
</div>
</div>
</div>
<div id="section7" class="section bg-pink-100">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="https://img.static-af.com/transform/45cb9a13-b167-4842-8ea8-05d0cc7a4d04/" alt="France pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Time Apart</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Me leaving for France</p>
<p class="text-xs md:text-sm mb-4 pixel-text">You facing work difficulties</p>
<p class="text-xs md:text-sm text-purple-600 pixel-text">Remember to take time for yourself</p>
<p class="text-xs md:text-sm text-purple-600 pixel-text">Your health and happiness matter most 💖</p>
</div>
</div>
<div id="section8" class="section bg-gradient-to-b from-purple-200 to-pink-200">
<div class="pixel-box bg-white p-6 mx-auto max-w-md">
<div class="flex justify-center mb-6">
<img src="pics/boat.jpg" alt="Birthday kiss pixel art" class="w-64 h-64 pixel-avatar">
</div>
<h2 class="text-lg md:text-xl text-center mb-6 text-purple-800 pixel-text">Happy Birthday!</h2>
<p class="text-xs md:text-sm mb-4 pixel-text">Back together in Bangkok</p>
<p class="text-xs md:text-sm mb-6 pixel-text">Celebrating you on your special day 🎂</p>
<div class="flex justify-center mb-6">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-16 h-16 pixel-heart">
</div>
<p class="text-xs md:text-sm text-center pixel-text">I love you more than words can say</p>
<p class="text-xs md:text-sm text-center text-purple-600 pixel-text mt-4">(Tap the heart below)</p>
<div class="flex justify-center mt-6">
<button id="finalHeart" class="pixel-btn bg-pink-200 p-4 rounded-full">
<img src="https://cdn.pixabay.com/photo/2017/09/23/16/33/pixel-heart-2779422_1280.png" alt="Pixel heart" class="w-12 h-12 pixel-heart">
</button>
</div>
<div id="kissAnimation" class="hidden mt-6 flex justify-center">
<img src="https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/e7781e25-3bf5-4185-aad7-ec93d0b5e1b0/d7fa2wq-cf60174b-9a41-44de-bb2f-605cde85dad5.gif?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcL2U3NzgxZTI1LTNiZjUtNDE4NS1hYWQ3LWVjOTNkMGI1ZTFiMFwvZDdmYTJ3cS1jZjYwMTc0Yi05YTQxLTQ0ZGUtYmIyZi02MDVjZGU4NWRhZDUuZ2lmIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.vX_oTdMeJ4D5xWpqNQV4NOjiJW4ahpQWZ4Fyp4xX8x8" alt="Pixel kiss" class="w-32 h-32">
</div>
</div>
</div>
</div>
<script>
// Music toggle functionality
const musicToggle = document.getElementById('musicToggle');
const musicIcon = document.getElementById('musicIcon');
const bgMusic = document.getElementById('bgMusic');
let musicPlaying = true;
// Attempt to autoplay music (may be blocked by browser)
document.addEventListener('DOMContentLoaded', function() {
const playPromise = bgMusic.play();
if (playPromise !== undefined) {
playPromise.then(_ => {
musicPlaying = true;
musicIcon.innerHTML = '<path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/>';
})
.catch(error => {
musicPlaying = false;
musicIcon.innerHTML = '<path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/>';
});
}
});
musicToggle.addEventListener('click', function() {
if (musicPlaying) {
bgMusic.pause();
musicIcon.innerHTML = '<path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/>';
musicPlaying = false;
} else {
bgMusic.play();
musicIcon.innerHTML = '<path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/>';
musicPlaying = true;
}
});
// Final heart click animation
const finalHeart = document.getElementById('finalHeart');
const kissAnimation = document.getElementById('kissAnimation');
finalHeart.addEventListener('click', function() {
kissAnimation.classList.remove('hidden');
finalHeart.classList.add('hidden');
// Create floating hearts
for (let i = 0; i < 10; i++) {
createFloatingHeart();
}
});
function createFloatingHeart() {
const heart = document.createElement('div');
heart.innerHTML = '❤️';
heart.className = 'absolute text-xl animate-float';
heart.style.left = Math.random() * 100 + 'vw';
heart.style.top = '100vh';
heart.style.animationDuration = (Math.random() * 3 + 2) + 's';
document.body.appendChild(heart);
// Remove heart after animation
setTimeout(() => {
heart.remove();
}, 5000);
}
// Add animation style
const style = document.createElement('style');
style.innerHTML = `
@keyframes float {
0% {
transform: translateY(0) rotate(0deg);
opacity: 1;
}
100% {
transform: translateY(-100vh) rotate(360deg);
opacity: 0;
}
}
.animate-float {
animation: float linear forwards;
}
`;
document.head.appendChild(style);
// Update navigation dots based on scroll position
const dots = document.querySelectorAll('.dot');
const sections = document.querySelectorAll('.section');
function updateActiveDot() {
const scrollPosition = window.scrollY;
sections.forEach((section, index) => {
const sectionTop = section.offsetTop;
const sectionHeight = section.offsetHeight;
if (scrollPosition >= sectionTop - 50 && scrollPosition < sectionTop + sectionHeight - 50) {
dots.forEach(dot => dot.classList.remove('bg-purple-700'));
dots[index].classList.add('bg-purple-700');
}
});
}
window.addEventListener('scroll', updateActiveDot);
updateActiveDot(); // Initialize
// Password protection
document.addEventListener('DOMContentLoaded', function() {
const passwordModal = document.getElementById('passwordModal');
const mainContent = document.getElementById('mainContent');
const passwordInput = document.getElementById('passwordInput');
const submitButton = document.getElementById('submitPassword');
const errorMessage = document.getElementById('errorMessage');
const correctPassword = 'iloveyou';
const bgMusic = document.getElementById('bgMusic');
const musicToggle = document.getElementById('musicToggle');
const musicIcon = document.getElementById('musicIcon');
// Check if already authenticated
if (sessionStorage.getItem('authenticated') === 'true') {
passwordModal.style.display = 'none';
mainContent.classList.remove('content-hidden');
// Start playing music
bgMusic.play().catch(error => {
console.log('Auto-play prevented by browser');
musicPlaying = false;
updateMusicIcon(false);
});
}
function checkPassword() {
if (passwordInput.value === correctPassword) {
passwordModal.style.display = 'none';
mainContent.classList.remove('content-hidden');
sessionStorage.setItem('authenticated', 'true');
// Start playing music after password entry
bgMusic.play().catch(error => {
console.log('Auto-play prevented by browser');
musicPlaying = false;
updateMusicIcon(false);
});
} else {
errorMessage.classList.remove('hidden');
passwordInput.value = '';
passwordModal.querySelector('.modal-content').classList.add('shake');
setTimeout(() => {
passwordModal.querySelector('.modal-content').classList.remove('shake');
}, 500);
}
}
function updateMusicIcon(playing) {
if (playing) {
musicIcon.innerHTML = '<path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/>';
} else {
musicIcon.innerHTML = '<path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/>';
}
}
// Music toggle functionality
musicToggle.addEventListener('click', function() {
if (musicPlaying) {
bgMusic.pause();
musicPlaying = false;
} else {
bgMusic.play();
musicPlaying = true;
}
updateMusicIcon(musicPlaying);
});
submitButton.addEventListener('click', checkPassword);
passwordInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
checkPassword();
}
});
});
</script>
</body>
</html>

View File

@@ -1,32 +0,0 @@
#!/bin/bash
# Array of known potentially hanging packages
hanging_packages=("xmlhttprequest-ssl@latest" "engine.io-parser@latest")
# Timeout in seconds for each package installation attempt
install_with_timeout() {
package=$1
echo "Attempting to install $package with a timeout of $timeout_duration seconds."
# Start npm install in the background
npm install $package --verbose &> $package.log &
# Get PID of the npm process
pid=$!
# Wait for the npm process to finish or timeout
(sleep $timeout_duration && kill -0 $pid 2>/dev/null && kill -9 $pid && echo "Timeout reached for $package, process killed." && echo $package >> exclude.log) &
waiter_pid=$!
# Wait for the npm process to complete
wait $pid
# Kill the waiter process in case npm finished before the timeout
kill -0 $waiter_pid 2>/dev/null && kill -9 $waiter_pid
}
# Install potentially hanging packages first with a timeout
for package in "${hanging_packages[@]}"; do
install_with_timeout $package
done

View File

@@ -1,35 +0,0 @@
const config = {
collectCoverageFrom: ['<rootDir>/src/**/*.{js,jsx,ts,tsx}', '!src/**/*.d.ts'],
moduleDirectories: ['node_modules'],
moduleFileExtensions: ['js', 'mjs', 'jsx', 'ts', 'tsx', 'json'],
moduleNameMapper: {
'^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
},
notify: true,
notifyMode: 'success-change',
resetMocks: true,
roots: ['<rootDir>'],
setupFilesAfterEnv: ['<rootDir>/jest/setupTests.ts'],
testEnvironment: 'jsdom',
testMatch: [
'<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}',
'<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}',
],
transform: {
'^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)':
'<rootDir>/jest/fileTransform.js',
'^.+\\.[jt]sx?$': 'esbuild-jest',
'^.+\\.css$': '<rootDir>/jest/cssTransform.js',
},
transformIgnorePatterns: [
'[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|cjs|ts|tsx)$',
'^.+\\.module\\.(css|sass|scss)$',
],
verbose: true,
watchPlugins: [
'jest-watch-typeahead/filename',
'jest-watch-typeahead/testname',
],
}
module.exports = config

File diff suppressed because it is too large Load Diff

View File

@@ -1,48 +0,0 @@
{
"name": "managing",
"version": "2.0.0",
"license": "MIT",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"serve": "serve -s dist -p 3000",
"test": "jest",
"lint": "eslint . --ext .ts,.tsx,.js,jsx",
"lint:fix": "eslint . --ext .ts,.tsx,.js,jsx --fix",
"typecheck": "tsc --noEmit",
"prettier": "prettier --write \"**/*.+(json|yml|css|md|mdx)\"",
"clean": "rimraf node_modules yarn.lock dist",
"validate": "./scripts/validate"
},
"dependencies": {
"@heroicons/react": "^1.0.6",
"@tailwindcss/typography": "^0.5.0",
"@tanstack/react-query": "^5.67.1",
"autoprefixer": "^10.4.7",
"classnames": "^2.3.1",
"jotai": "^1.6.7",
"latest-version": "^9.0.0"
},
"devDependencies": {
"@types/elliptic": "^6.4.18",
"@types/react": "^18.0.9",
"@types/react-dom": "^18.0.4",
"@types/react-grid-layout": "^1.3.2",
"@types/react-plotly.js": "^2.6.0",
"@types/react-slider": "^1.3.1",
"@types/react-table": "^7.7.12",
"@vitejs/plugin-react": "^1.3.2",
"autoprefixer": "^10.4.7",
"daisyui": "^3.5.1",
"postcss": "^8.4.13",
"prettier": "^2.6.1",
"prettier-plugin-tailwind-css": "^1.5.0",
"tailwindcss": "^3.0.23",
"typescript": "^5.7.3",
"vite": "^6.0.11"
},
"msw": {
"workerDirectory": ""
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 475 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 850 KiB

View File

@@ -1,6 +0,0 @@
module.exports = {
plugins: {
autoprefixer: {},
tailwindcss: {},
},
}

View File

@@ -1,4 +0,0 @@
module.exports = {
plugins: [require('prettier-plugin-tailwindcss')],
tailwindConfig: './tailwind.config.js',
}

Binary file not shown.

View File

@@ -1,12 +0,0 @@
module.exports = {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
daisyui: {
themes: ['black', 'coffee', 'cyberpunk', 'lofi', 'retro', 'kaigen'],
},
plugins: [require('@tailwindcss/typography'), require('daisyui')],
theme: {
container: {
center: true,
},
},
}

View File

@@ -1,21 +0,0 @@
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["./src", "hardhat.config.js"],
"exclude": ["node_modules"]
}

View File

@@ -1,21 +0,0 @@
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: false,
sourcemap: false,
target: 'es2022',
},
optimizeDeps: {
esbuildOptions: {
target: 'es2022',
},
},
plugins: [react()],
publicDir: 'assets',
server: {
host: true,
open: true,
},
})

View File

@@ -1,37 +0,0 @@
{
"ManagingDatabase": {
"ConnectionString": "mongodb://managingdb:27017",
"DatabaseName": "ManagingDb"
},
"InfluxDb": {
"Url": "http://influxdb:8086/",
"Organization": "",
"Token": ""
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "http://elasticsearch:9200"
},
"Discord": {
"BotActivity": "trading strategies",
"HandleUserAction": true,
"ApplicationId": "",
"PublicKey": "",
"TokenId": "",
"SignalChannelId": 966080506473099314,
"TradesChannelId": 998374177763491851,
"TroublesChannelId": 1015761955321040917,
"CopyTradingChannelId": 1132022887012909126,
"RequestsChannelId": 1018589494968078356,
"ButtonExpirationMinutes": 10
},
"AllowedHosts": "*"
}

View File

@@ -1,38 +0,0 @@
{
"ManagingDatabase": {
"ConnectionString": "srv-captain--mongo-db",
"DatabaseName": "ManagingDb"
},
"InfluxDb": {
"Url": "https://influx-db.apps.managing.live",
"Token": "gzE8KEmIfBaZYkcEMwaZyY7byO3rVwVsIeAd3UPrmi1xTajQoGWktFQjoQ3Y8D6hCbdIK7l5zVqNYox3wGilrA==",
"Organization": "managing-org"
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "https://elastic-search.apps.managing.live"
},
"Discord": {
"ApplicationId": "1134966063075971144",
"PublicKey": "55bc79e483ffa203a1da1e49588c86cf1345dd66d676ab52c73dbf09cc1b4800",
"TokenId": "MTEzNDk2NjA2MzA3NTk3MTE0NA.GWHiDf.2s2qq3XCI2bftfnqm_0ndcou5LQwZPdsCZ9nQc",
"SignalChannelId": 1134858150667898910,
"TradesChannelId": 1134858092530634864,
"TroublesChannelId": 1134858233031446671,
"CopyTradingChannelId": 1134857874896588881,
"RequestsChannelId": 1018589494968078356,
"LeaderboardChannelId": 1133169725237633095,
"NoobiesboardChannelId": 1133504653485690940,
"ButtonExpirationMinutes": 10
},
"AllowedHosts": "*"
}

View File

@@ -1 +0,0 @@
GatewayExceptionResponse

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff