Compare commits
41 Commits
88abf11a14
...
067ba4a548
Author | SHA1 | Date | |
---|---|---|---|
067ba4a548 | |||
a1cdf41c49 | |||
2f1c9835ff | |||
770c02bd7e | |||
9dca5e4a90 | |||
1a87cda87f | |||
d7fee99e18 | |||
0812e5faba | |||
760b174553 | |||
810ce8b2bc | |||
5ae657dcd2 | |||
9d5caf3523 | |||
4623e7ee79 | |||
a7474f67eb | |||
21e120de07 | |||
2b29836c82 | |||
413a1b2294 | |||
721c8e9076 | |||
e9e1ea1858 | |||
e41b352806 | |||
53909d08c5 | |||
dac4735e52 | |||
b26021386e | |||
ced7450823 | |||
2b7932a352 | |||
0fa838892c | |||
6463064a1e | |||
10de5da046 | |||
5ba781a3a9 | |||
ca11b6dc07 | |||
d400023f51 | |||
d22a155a97 | |||
b09549b69f | |||
a5990e8ae9 | |||
861578cc90 | |||
05beac41dd | |||
da590d385a | |||
df7601e142 | |||
e0ea362344 | |||
1fa36bfdab | |||
cf889e2225 |
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
dist
|
|
@ -1,28 +0,0 @@
|
|||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: scoresaber-reloaded-backend
|
|
||||||
namespace: public-services
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: scoresaber-reloaded-backend
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: scoresaber-reloaded-backend
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: scoresaber-reloaded-backend-container
|
|
||||||
image: git.fascinated.cc/fascinated/scoresaber-reloaded-backend:latest
|
|
||||||
imagePullPolicy: Always
|
|
||||||
ports:
|
|
||||||
- containerPort: 8080
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
cpu: 50m
|
|
||||||
memory: 128Mi
|
|
||||||
limits:
|
|
||||||
cpu: 1000m # 1 vCPU
|
|
||||||
memory: 512Mi
|
|
@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: traefik.io/v1alpha1
|
|
||||||
kind: IngressRoute
|
|
||||||
metadata:
|
|
||||||
name: scoresaber-reloaded-backend-ingress
|
|
||||||
namespace: public-services
|
|
||||||
annotations:
|
|
||||||
kubernetes.io/ingress.class: traefik-external
|
|
||||||
spec:
|
|
||||||
entryPoints:
|
|
||||||
- websecure
|
|
||||||
routes:
|
|
||||||
- match: Host(`ssr.fascinated.cc`) && PathPrefix(`/api`)
|
|
||||||
kind: Rule
|
|
||||||
middlewares:
|
|
||||||
- name: default-headers
|
|
||||||
namespace: traefik
|
|
||||||
- name: compress
|
|
||||||
namespace: traefik
|
|
||||||
- name: scoresaber-reloaded-backend-strip-api-prefix
|
|
||||||
namespace: public-services
|
|
||||||
services:
|
|
||||||
- name: scoresaber-reloaded-backend-service
|
|
||||||
port: 8080
|
|
||||||
tls:
|
|
||||||
secretName: fascinated-cc
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: scoresaber-reloaded-backend-service
|
|
||||||
namespace: public-services
|
|
||||||
spec:
|
|
||||||
type: ClusterIP
|
|
||||||
ports:
|
|
||||||
- port: 8080
|
|
||||||
targetPort: 8080
|
|
||||||
selector:
|
|
||||||
app: scoresaber-reloaded-backend
|
|
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: traefik.io/v1alpha1
|
|
||||||
kind: Middleware
|
|
||||||
metadata:
|
|
||||||
name: scoresaber-reloaded-backend-strip-api-prefix
|
|
||||||
namespace: public-services
|
|
||||||
spec:
|
|
||||||
stripPrefix:
|
|
||||||
prefixes:
|
|
||||||
- "/api"
|
|
@ -1,21 +1,21 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: scoresaber-reloaded-website
|
name: scoresaber-reloaded-frontend
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: scoresaber-reloaded-website
|
app: scoresaber-reloaded-frontend
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: scoresaber-reloaded-website
|
app: scoresaber-reloaded-frontend
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: scoresaber-reloaded-website-container
|
- name: scoresaber-reloaded-frontend-container
|
||||||
image: git.fascinated.cc/fascinated/scoresaber-reloaded-website:latest
|
image: git.fascinated.cc/fascinated/scoresaber-reloaded-frontend:latest
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
@ -2,7 +2,7 @@
|
|||||||
apiVersion: traefik.io/v1alpha1
|
apiVersion: traefik.io/v1alpha1
|
||||||
kind: IngressRoute
|
kind: IngressRoute
|
||||||
metadata:
|
metadata:
|
||||||
name: scoresaber-reloaded-website-ingress
|
name: scoresaber-reloaded-frontend-ingress
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: traefik-external
|
kubernetes.io/ingress.class: traefik-external
|
||||||
@ -18,7 +18,7 @@ spec:
|
|||||||
- name: compress
|
- name: compress
|
||||||
namespace: traefik
|
namespace: traefik
|
||||||
services:
|
services:
|
||||||
- name: scoresaber-reloaded-website-service
|
- name: scoresaber-reloaded-frontend-service
|
||||||
port: 3000
|
port: 3000
|
||||||
tls:
|
tls:
|
||||||
secretName: fascinated-cc
|
secretName: fascinated-cc
|
@ -3,7 +3,7 @@ apiVersion: bitnami.com/v1alpha1
|
|||||||
kind: SealedSecret
|
kind: SealedSecret
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: ssr-secret
|
name: ssr-frontend-secret
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
spec:
|
spec:
|
||||||
encryptedData:
|
encryptedData:
|
||||||
@ -15,6 +15,6 @@ spec:
|
|||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: ssr-secret
|
name: ssr-frontend-secret
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
type: Opaque
|
type: Opaque
|
@ -2,7 +2,7 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: scoresaber-reloaded-website-service
|
name: scoresaber-reloaded-frontend-service
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
spec:
|
spec:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
@ -10,4 +10,4 @@ spec:
|
|||||||
- port: 3000
|
- port: 3000
|
||||||
targetPort: 3000
|
targetPort: 3000
|
||||||
selector:
|
selector:
|
||||||
app: scoresaber-reloaded-website
|
app: scoresaber-reloaded-frontend
|
@ -1,63 +0,0 @@
|
|||||||
name: "Deploy Backend"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
paths:
|
|
||||||
- backend/**
|
|
||||||
- common/**
|
|
||||||
- .gitea/kubernetes/backend/**
|
|
||||||
- .gitea/workflows/deploy-backend.yml
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ secrets.REGISTRY_TOKEN }}
|
|
||||||
registry: git.fascinated.cc
|
|
||||||
|
|
||||||
- name: Build Image
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: ./backend/Dockerfile
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-backend:${{ github.sha }}
|
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-backend:latest
|
|
||||||
build-args: |
|
|
||||||
GIT_REV=${{ gitea.sha }}
|
|
||||||
|
|
||||||
- name: Install kubectl
|
|
||||||
uses: azure/setup-kubectl@v4
|
|
||||||
id: install
|
|
||||||
|
|
||||||
- name: Setup Kubernetes Context
|
|
||||||
uses: azure/k8s-set-context@v4
|
|
||||||
with:
|
|
||||||
kubeconfig: ${{ secrets.KUBECONFIG }}
|
|
||||||
|
|
||||||
- name: Deploy to Kubernetes
|
|
||||||
uses: Azure/k8s-deploy@v5
|
|
||||||
with:
|
|
||||||
action: deploy
|
|
||||||
namespace: public-services
|
|
||||||
manifests: |
|
|
||||||
.gitea/kubernetes/backend/deployment.yaml
|
|
||||||
.gitea/kubernetes/backend/service.yaml
|
|
||||||
.gitea/kubernetes/backend/strip-api-prefix-middleware.yaml
|
|
||||||
.gitea/kubernetes/backend/ingress.yaml
|
|
||||||
images: |
|
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-backend:${{ github.sha }}
|
|
@ -1,15 +1,9 @@
|
|||||||
name: "Deploy Website"
|
name: "Deploy Frontend"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
paths:
|
|
||||||
- website/**
|
|
||||||
- common/**
|
|
||||||
- .gitea/kubernetes/website/**
|
|
||||||
- .gitea/workflows/deploy-website.yml
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
@ -32,11 +26,11 @@ jobs:
|
|||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./website/Dockerfile
|
file: ./apps/frontend/Dockerfile
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-website:${{ github.sha }}
|
git.fascinated.cc/fascinated/scoresaber-reloaded-frontend:${{ github.sha }}
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-website:latest
|
git.fascinated.cc/fascinated/scoresaber-reloaded-frontend:latest
|
||||||
build-args: |
|
build-args: |
|
||||||
GIT_REV=${{ gitea.sha }}
|
GIT_REV=${{ gitea.sha }}
|
||||||
SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
@ -56,9 +50,9 @@ jobs:
|
|||||||
action: deploy
|
action: deploy
|
||||||
namespace: public-services
|
namespace: public-services
|
||||||
manifests: |
|
manifests: |
|
||||||
.gitea/kubernetes/website/sealed-secrets.yaml
|
.gitea/kubernetes/frontend/sealed-secrets.yaml
|
||||||
.gitea/kubernetes/website/deployment.yaml
|
.gitea/kubernetes/frontend/deployment.yaml
|
||||||
.gitea/kubernetes/website/service.yaml
|
.gitea/kubernetes/frontend/service.yaml
|
||||||
.gitea/kubernetes/website/ingress.yaml
|
.gitea/kubernetes/frontend/ingress.yaml
|
||||||
images: |
|
images: |
|
||||||
git.fascinated.cc/fascinated/scoresaber-reloaded-website:${{ github.sha }}
|
git.fascinated.cc/fascinated/scoresaber-reloaded-frontend:${{ github.sha }}
|
105
.gitignore
vendored
@ -1,79 +1,38 @@
|
|||||||
logs
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
*.log
|
|
||||||
|
# dependencies
|
||||||
|
node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
lerna-debug.log*
|
|
||||||
.pnpm-debug.log*
|
# local env files
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
lib-cov
|
|
||||||
coverage
|
|
||||||
*.lcov
|
|
||||||
.nyc_output
|
|
||||||
.grunt
|
|
||||||
bower_components
|
|
||||||
.lock-wscript
|
|
||||||
build/Release
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
web_modules/
|
|
||||||
*.tsbuildinfo
|
|
||||||
.npm
|
|
||||||
.eslintcache
|
|
||||||
.stylelintcache
|
|
||||||
.rpt2_cache/
|
|
||||||
.rts2_cache_cjs/
|
|
||||||
.rts2_cache_es/
|
|
||||||
.rts2_cache_umd/
|
|
||||||
.node_repl_history
|
|
||||||
*.tgz
|
|
||||||
.yarn-integrity
|
|
||||||
.env
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
.env.local
|
|
||||||
.cache
|
|
||||||
.parcel-cache
|
|
||||||
.next
|
|
||||||
out
|
|
||||||
.nuxt
|
|
||||||
dist
|
|
||||||
.cache/
|
|
||||||
.vuepress/dist
|
|
||||||
.temp
|
|
||||||
.docusaurus
|
|
||||||
.serverless/
|
|
||||||
.fusebox/
|
|
||||||
.dynamodb/
|
|
||||||
.tern-port
|
|
||||||
.vscode-test
|
|
||||||
.yarn/cache
|
|
||||||
.yarn/unplugged
|
|
||||||
.yarn/build-state.yml
|
|
||||||
.yarn/install-state.gz
|
|
||||||
.pnp.*
|
|
||||||
.DS_*
|
|
||||||
**/*.backup.*
|
|
||||||
**/*.back.*
|
|
||||||
node_modules
|
|
||||||
*.sublime*
|
|
||||||
psd
|
|
||||||
thumb
|
|
||||||
sketch
|
|
||||||
/node_modules
|
|
||||||
/.pnp
|
|
||||||
.pnp.js
|
|
||||||
/coverage
|
|
||||||
/.next/
|
|
||||||
/out/
|
|
||||||
/build
|
|
||||||
.DS_Store
|
|
||||||
*.pem
|
|
||||||
.env*.local
|
.env*.local
|
||||||
|
|
||||||
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
|
.turbo
|
||||||
|
|
||||||
|
.idea
|
7
apps/frontend/.env
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
NEXT_PUBLIC_SITE_URL=http://localhost:3000
|
||||||
|
NEXT_PUBLIC_TRIGGER_PUBLIC_API_KEY=
|
||||||
|
|
||||||
|
TRIGGER_API_KEY=
|
||||||
|
TRIGGER_API_URL=https://trigger.example.com
|
||||||
|
MONGO_URI=mongodb://root:jGZuYukpb9n4yDJJE8nMeUbj2ACE7DR3@10.0.50.37:27017/ssr-dev?authSource=admin
|
||||||
|
SENTRY_AUTH_TOKEN=
|
@ -2,7 +2,7 @@
|
|||||||
"extends": ["next/core-web-vitals", "next/typescript"],
|
"extends": ["next/core-web-vitals", "next/typescript"],
|
||||||
"rules": {
|
"rules": {
|
||||||
"@typescript-eslint/no-unused-vars": "off",
|
"@typescript-eslint/no-unused-vars": "off",
|
||||||
"@typescript-eslint/no-unused-expressions": "off",
|
"@typescript-eslint/no-empty-object-type": "off",
|
||||||
"@typescript-eslint/no-empty-object-type": "off"
|
"@typescript-eslint/no-unused-expressions": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
65
apps/frontend/Dockerfile
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
FROM fascinated/docker-images:nodejs_20_with_pnpm AS base
|
||||||
|
|
||||||
|
FROM base AS builder
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN pnpm i -g turbo@^2
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Generate a partial monorepo with a pruned lockfile for a target workspace.
|
||||||
|
# Assuming "frontend" is the name entered in the project's package.json: { name: "frontend" }
|
||||||
|
RUN turbo prune frontend --docker
|
||||||
|
|
||||||
|
# Add lockfile and package.json's of isolated subworkspace
|
||||||
|
FROM base AS installer
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Add the commit hash
|
||||||
|
ARG GIT_REV
|
||||||
|
ENV GIT_REV=${GIT_REV}
|
||||||
|
|
||||||
|
# Add the sentry auth token
|
||||||
|
ARG SENTRY_AUTH_TOKEN
|
||||||
|
ENV SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN}
|
||||||
|
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
|
||||||
|
RUN pnpm i -g turbo@^2
|
||||||
|
|
||||||
|
# First install the dependencies (as they change less often)
|
||||||
|
COPY --from=builder /app/out/json/ .
|
||||||
|
RUN pnpm install
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
COPY --from=builder /app/out/full/ .
|
||||||
|
|
||||||
|
RUN ls -la
|
||||||
|
|
||||||
|
RUN pnpm turbo run build --filter=frontend...
|
||||||
|
|
||||||
|
FROM base AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
|
||||||
|
# Add the commit hash
|
||||||
|
ARG GIT_REV
|
||||||
|
ENV GIT_REV=${GIT_REV}
|
||||||
|
|
||||||
|
# Don't run production as root
|
||||||
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
# Automatically leverage output traces to reduce image size
|
||||||
|
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/frontend/.next/standalone ./
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/frontend/.next/static ./apps/frontend/.next/static
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/frontend/public ./apps/frontend/public
|
||||||
|
|
||||||
|
CMD node apps/frontend/server.js
|
@ -1,8 +1,18 @@
|
|||||||
import { withSentryConfig } from "@sentry/nextjs";
|
import { withSentryConfig } from "@sentry/nextjs";
|
||||||
import { format } from "@formkit/tempo";
|
import { format } from "@formkit/tempo";
|
||||||
|
import path from "path";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
|
||||||
|
const __dirname = path.dirname(__filename); // get the name of the directory
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
|
output: "standalone",
|
||||||
|
webpack: (config) => {
|
||||||
|
config.resolve.alias['@'] = path.join(__dirname, 'src');
|
||||||
|
return config;
|
||||||
|
},
|
||||||
images: {
|
images: {
|
||||||
remotePatterns: [
|
remotePatterns: [
|
||||||
{
|
{
|
||||||
@ -14,7 +24,8 @@ const nextConfig = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
env: {
|
env: {
|
||||||
NEXT_PUBLIC_BUILD_ID: process.env.GIT_REV || "dev",
|
NEXT_PUBLIC_BUILD_ID:
|
||||||
|
process.env.GIT_REV || "dev",
|
||||||
NEXT_PUBLIC_BUILD_TIME: new Date().toLocaleDateString("en-US", {
|
NEXT_PUBLIC_BUILD_TIME: new Date().toLocaleDateString("en-US", {
|
||||||
year: "numeric",
|
year: "numeric",
|
||||||
month: "long",
|
month: "long",
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "website",
|
"name": "frontend",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -8,6 +8,10 @@
|
|||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
|
"imports": {
|
||||||
|
"@/*": "./src/*"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@9.12.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@formkit/tempo": "^0.1.2",
|
"@formkit/tempo": "^0.1.2",
|
||||||
"@heroicons/react": "^2.1.5",
|
"@heroicons/react": "^2.1.5",
|
||||||
@ -61,4 +65,4 @@
|
|||||||
"trigger.dev": {
|
"trigger.dev": {
|
||||||
"endpointId": "scoresaber-reloaded-KB0Z"
|
"endpointId": "scoresaber-reloaded-KB0Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 841 B After Width: | Height: | Size: 841 B |
Before Width: | Height: | Size: 132 B After Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 766 B After Width: | Height: | Size: 766 B |
Before Width: | Height: | Size: 659 B After Width: | Height: | Size: 659 B |
Before Width: | Height: | Size: 604 B After Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 121 B After Width: | Height: | Size: 121 B |
Before Width: | Height: | Size: 522 B After Width: | Height: | Size: 522 B |
Before Width: | Height: | Size: 445 B After Width: | Height: | Size: 445 B |
Before Width: | Height: | Size: 320 B After Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 909 B After Width: | Height: | Size: 909 B |
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 109 B |
Before Width: | Height: | Size: 554 B After Width: | Height: | Size: 554 B |
Before Width: | Height: | Size: 311 B After Width: | Height: | Size: 311 B |
Before Width: | Height: | Size: 179 B After Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 339 B After Width: | Height: | Size: 339 B |
Before Width: | Height: | Size: 324 B After Width: | Height: | Size: 324 B |
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 127 B |
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 105 B |
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 326 B |
Before Width: | Height: | Size: 651 B After Width: | Height: | Size: 651 B |
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 127 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 132 B After Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 810 B After Width: | Height: | Size: 810 B |
Before Width: | Height: | Size: 792 B After Width: | Height: | Size: 792 B |
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 287 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 206 B |
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 377 B After Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 359 B After Width: | Height: | Size: 359 B |
Before Width: | Height: | Size: 561 B After Width: | Height: | Size: 561 B |
Before Width: | Height: | Size: 523 B After Width: | Height: | Size: 523 B |
Before Width: | Height: | Size: 286 B After Width: | Height: | Size: 286 B |
Before Width: | Height: | Size: 344 B After Width: | Height: | Size: 344 B |
Before Width: | Height: | Size: 135 B After Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 123 B |
Before Width: | Height: | Size: 717 B After Width: | Height: | Size: 717 B |
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 286 B After Width: | Height: | Size: 286 B |
Before Width: | Height: | Size: 135 B After Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 419 B After Width: | Height: | Size: 419 B |
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B |
Before Width: | Height: | Size: 444 B After Width: | Height: | Size: 444 B |
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 260 B |
Before Width: | Height: | Size: 641 B After Width: | Height: | Size: 641 B |
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 486 B |
Before Width: | Height: | Size: 361 B After Width: | Height: | Size: 361 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 105 B |
Before Width: | Height: | Size: 530 B After Width: | Height: | Size: 530 B |
Before Width: | Height: | Size: 163 B After Width: | Height: | Size: 163 B |
Before Width: | Height: | Size: 501 B After Width: | Height: | Size: 501 B |
Before Width: | Height: | Size: 459 B After Width: | Height: | Size: 459 B |
Before Width: | Height: | Size: 368 B After Width: | Height: | Size: 368 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 106 B |
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 533 B |
Before Width: | Height: | Size: 828 B After Width: | Height: | Size: 828 B |
Before Width: | Height: | Size: 559 B After Width: | Height: | Size: 559 B |
Before Width: | Height: | Size: 160 B After Width: | Height: | Size: 160 B |
Before Width: | Height: | Size: 991 B After Width: | Height: | Size: 991 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 123 B |
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 106 B |
Before Width: | Height: | Size: 134 B After Width: | Height: | Size: 134 B |