Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,4 +20,5 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md
**/*.md
**/dist
41 changes: 17 additions & 24 deletions .github/workflows/build.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,40 +2,33 @@ name: Build And Test
on:
push:
branches:
- '**'
- "**"
pull_request:
branches:
- 'dev'
- "dev"

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v4
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Setup pnpm
uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5

- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
cache: "pnpm"

- name: Use corepack
run: corepack enable
- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Install Dependencies
run: yarn install --immutable
- name: Lint
run: pnpm biome:ci

- name: Lint
run: yarn lint:check

- name: Build
run: yarn build
- name: Build
run: pnpm build
16 changes: 8 additions & 8 deletions .github/workflows/docker.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,14 +16,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build Test Image
uses: docker/build-push-action@v6
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
env:
DOCKER_BUILD_SUMMARY: false
with:
Expand All@@ -33,7 +33,7 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ steps.meta.outputs.tags }}
output: trivy.md
Expand DownExpand Up@@ -62,23 +62,23 @@ jobs:
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
push: true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/sbom.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
format: 'github'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/scan.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

Expand All@@ -39,7 +39,7 @@ jobs:
fi

- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/trivy-action@0.33.1
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
output: trivy.md
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,7 +94,7 @@ typings/
Data

# Typescript mapper file
dist/**/*.map
dist/

# Config
config.json
Expand Down
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,7 @@
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph",
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
"biomejs.biome",
"redhat.vscode-yaml"
]
}
26 changes: 14 additions & 12 deletions .vscode/settings.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,26 +2,28 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, bun*, renovate.json, .mergify.yml, .browserslistrc, trivy.yaml",
"tailwindcss.config.js": "tailwind.config.*, postcss.config.*",
".gitignore": ".git*",
".env.example": ".env*",
"Dockerfile": ".dockerignore, docker-compose.yml, nginx.conf",
"README.md": "CHANGELOG.md, CONTRIBUTING.md, LICENSE"
},
"eslint.format.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit",
"source.fixAll.biome": "explicit",
"source.fixAll": "explicit"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"npm.packageManager": "yarn"
"editor.formatOnSaveMode": "modificationsIfAvailable",
"npm.packageManager": "pnpm",
"biome.configurationPath": "biome.json"
}
2 changes: 0 additions & 2 deletions .yarnrc.yml

This file was deleted.

35 changes: 29 additions & 6 deletions Dockerfile
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
FROM node:22-alpine
WORKDIR /app

# https://pnpm.io/docker
FROM node:24-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV NODE_ENV=production
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0

RUN corepack enable
WORKDIR /app
COPY package.json /app/package.json
COPY pnpm-lock.yaml /app/pnpm-lock.yaml
COPY pnpm-workspace.yaml /app/pnpm-workspace.yaml
RUN pnpm fetch --prod

FROM base AS prod
RUN pnpm install --prod --frozen-lockfile

COPY . .
RUN yarn install --immutable
FROM base AS builder
COPY . /app
RUN pnpm install --frozen-lockfile
RUN pnpm run build

FROM node:24-alpine
ENV NODE_ENV=production
RUN apk -U upgrade

# Remove system package in production
RUN npm remove -g corepack
RUN npm remove -g yarn
RUN npm remove -g npm
RUN rm -r /opt/yarn-v1.22.22/

WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules
COPY --from=builder /app/dist /app/dist
EXPOSE 8080
CMD ["node", "dist"]
56 changes: 56 additions & 0 deletions biome.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 180,
"includes": ["src/**"]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {},
"style": {
"noUselessElse": "error",
"useNamingConvention": {
"level": "error",
"options": {
"strictCase": false
}
}
},
"suspicious": {
"noEmptyBlockStatements": "error",
"noVar": "error"
}
},
"includes": ["src/**"]
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "asNeeded",
"quoteStyle": "single"
},
"globals": []
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
61 changes: 29 additions & 32 deletions config.json.example
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
{
"bot": {
"token": "",
"prefix": "?",
"admin": [
"userID"
],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"messageCooldownSecond": 300
"bot": {
"token": "",
"admin": ["userID"],
"embed": {
"color": 4886754,
"errorColor": 13632027,
"rank": {
"description": "Rank"
}
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
"messageCooldownSecond": 300
},
"database": {
"host": "mongodb://localhost:27017",
"name": "analysisbot"
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cache": {
"host": "redis://127.0.0.1:6379"
},
"web": {
"host": "0.0.0.0",
"port": 8080,
"devPort": 8081,
"devMode": false,
"origin": "*",
"recaptcha": {
"secretKey": "",
"minScore": 0.7
},
"cacheDayTTL": 10
}
"cacheDayTTL": 10
}
}
Loading
Loading