feat: 支持一键发布服务端
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -21,6 +21,7 @@ dist-ssr/
|
||||
Thumbs.db
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
212
deploy-server.sh
Executable file
212
deploy-server.sh
Executable file
@@ -0,0 +1,212 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================================
|
||||
# mp-pilates 服务端一键部署脚本
|
||||
# 流程:本地构建 shared + server → 上传 → 服务器安装依赖 → PM2 重启
|
||||
# ============================================================
|
||||
|
||||
# 部署配置
|
||||
SERVER_USER="root"
|
||||
SERVER_HOST="129.204.155.94"
|
||||
SERVER_PATH="/usr/local/web/mp-pilates-server"
|
||||
PM2_APP_NAME="mp-pilates-server"
|
||||
PORT=3008
|
||||
|
||||
# 项目根目录(脚本所在位置)
|
||||
PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
# 颜色输出
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||
echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
echo_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
# 检查 SSH 连接
|
||||
echo_info "检查服务器连接..."
|
||||
if ! ssh -o ConnectTimeout=5 ${SERVER_USER}@${SERVER_HOST} "echo '连接成功'" > /dev/null 2>&1; then
|
||||
echo_error "无法连接到服务器 ${SERVER_HOST}"
|
||||
echo_warn "请确保:"
|
||||
echo_warn " 1. 服务器地址正确"
|
||||
echo_warn " 2. 已配置 SSH 密钥认证或密码"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PROJECT_ROOT}"
|
||||
|
||||
# 1. 构建 shared 包(server 依赖 shared)
|
||||
echo_info "构建 shared 包..."
|
||||
pnpm build:shared
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "shared 构建失败,部署终止"
|
||||
exit 1
|
||||
fi
|
||||
echo_info "shared 构建完成"
|
||||
|
||||
# 2. 构建 server 包
|
||||
echo_info "构建 server 包..."
|
||||
pnpm build:server
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "server 构建失败,部署终止"
|
||||
exit 1
|
||||
fi
|
||||
echo_info "server 构建完成"
|
||||
|
||||
# 3. 生成 Prisma Client
|
||||
echo_info "生成 Prisma Client..."
|
||||
cd packages/server && pnpm prisma:generate && cd "${PROJECT_ROOT}"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Prisma Client 生成失败"
|
||||
exit 1
|
||||
fi
|
||||
echo_info "Prisma Client 生成完成"
|
||||
|
||||
# 4. 创建服务器目录
|
||||
echo_info "准备服务器目录..."
|
||||
ssh ${SERVER_USER}@${SERVER_HOST} "mkdir -p ${SERVER_PATH}"
|
||||
|
||||
# 5. 上传文件到服务器
|
||||
echo_info "上传文件到服务器 ${SERVER_HOST}:${SERVER_PATH}"
|
||||
|
||||
# 上传 server 包(含构建产物、prisma、package.json)
|
||||
# 注意:排除 .env 避免覆盖服务器环境配置
|
||||
rsync -avz --delete \
|
||||
--exclude 'node_modules' \
|
||||
--exclude '.git' \
|
||||
--exclude '.claude' \
|
||||
--exclude '.env' \
|
||||
--exclude '.env.local' \
|
||||
--exclude '.DS_Store' \
|
||||
--exclude '*.log' \
|
||||
--exclude 'src' \
|
||||
--exclude '__tests__' \
|
||||
--exclude 'test' \
|
||||
--exclude 'coverage' \
|
||||
--exclude 'tsconfig*.json' \
|
||||
--exclude 'nest-cli.json' \
|
||||
packages/server/ ${SERVER_USER}@${SERVER_HOST}:${SERVER_PATH}/
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "server 文件上传失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 上传 shared 包构建产物
|
||||
ssh ${SERVER_USER}@${SERVER_HOST} "mkdir -p ${SERVER_PATH}/../mp-pilates-shared"
|
||||
rsync -avz --delete \
|
||||
--exclude 'node_modules' \
|
||||
--exclude 'src' \
|
||||
--exclude '.DS_Store' \
|
||||
packages/shared/ ${SERVER_USER}@${SERVER_HOST}:${SERVER_PATH}/../mp-pilates-shared/
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "shared 文件上传失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 上传本地 Prisma Client(已生成好的,避免服务器上版本不一致)
|
||||
echo_info "上传 Prisma Client..."
|
||||
PRISMA_CLIENT_PATH="$(cd packages/server && node -e "console.log(require.resolve('@prisma/client/../../'))" 2>/dev/null)"
|
||||
PRISMA_ENGINE_PATH="$(cd packages/server && node -e "console.log(require.resolve('@prisma/engines/../../'))" 2>/dev/null)"
|
||||
|
||||
echo_info "文件上传完成"
|
||||
|
||||
# 6. 服务器端安装依赖并重启
|
||||
echo_info "服务器部署操作..."
|
||||
ssh ${SERVER_USER}@${SERVER_HOST} "bash -l" << 'ENDSSH'
|
||||
export PATH="$HOME/.nvm/versions/node/v22.17.1/bin:$PATH"
|
||||
SERVER_PATH="/usr/local/web/mp-pilates-server"
|
||||
PM2_APP_NAME="mp-pilates-server"
|
||||
PORT=3008
|
||||
|
||||
cd ${SERVER_PATH}
|
||||
|
||||
# 检查 .env 是否存在
|
||||
if [ ! -f .env ]; then
|
||||
echo "⚠ 未找到 .env 文件,请先创建 ${SERVER_PATH}/.env"
|
||||
echo " 需要配置: DATABASE_URL, JWT_SECRET, WX_APPID, WX_SECRET 等"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 安装 pnpm(如果未安装)
|
||||
if ! command -v pnpm &> /dev/null; then
|
||||
echo "安装 pnpm..."
|
||||
npm install -g pnpm
|
||||
fi
|
||||
|
||||
# 设置 npm 镜像
|
||||
npm config set registry https://registry.npmmirror.com
|
||||
|
||||
# 修改 package.json,将 workspace:* 替换为实际路径(绕过 workspace 限制)
|
||||
echo "处理依赖..."
|
||||
sed -i 's|"@mp-pilates/shared": "workspace:\*"|"@mp-pilates/shared": "file:../mp-pilates-shared"|g' package.json
|
||||
|
||||
# 安装生产依赖
|
||||
echo "安装依赖..."
|
||||
pnpm install --prod --no-frozen-lockfile
|
||||
|
||||
# 确保 shared 包链接正确
|
||||
echo "链接 shared 包..."
|
||||
mkdir -p node_modules/@mp-pilates
|
||||
rm -rf node_modules/@mp-pilates/shared
|
||||
ln -sf ${SERVER_PATH}/../mp-pilates-shared node_modules/@mp-pilates/shared
|
||||
|
||||
# 使用项目本地的 prisma(非全局 npx,避免版本不一致)
|
||||
echo "生成 Prisma Client..."
|
||||
./node_modules/.bin/prisma generate 2>/dev/null || npx prisma@5 generate
|
||||
|
||||
# 运行数据库迁移(生产环境用 deploy,非交互式)
|
||||
echo "运行数据库迁移..."
|
||||
./node_modules/.bin/prisma migrate deploy 2>/dev/null || npx prisma@5 migrate deploy
|
||||
|
||||
# 检查 PM2 是否安装
|
||||
if ! command -v pm2 &> /dev/null; then
|
||||
echo "安装 PM2..."
|
||||
npm install -g pm2
|
||||
fi
|
||||
|
||||
# 停止旧服务(如果存在)
|
||||
if pm2 describe ${PM2_APP_NAME} &> /dev/null; then
|
||||
echo "停止旧服务..."
|
||||
pm2 stop ${PM2_APP_NAME}
|
||||
pm2 delete ${PM2_APP_NAME}
|
||||
fi
|
||||
|
||||
# 启动新服务
|
||||
echo "启动服务(端口 ${PORT})..."
|
||||
PORT=${PORT} pm2 start dist/main.js \
|
||||
--name ${PM2_APP_NAME} \
|
||||
--max-memory-restart 512M \
|
||||
--log-date-format "YYYY-MM-DD HH:mm:ss"
|
||||
|
||||
# 保存 PM2 配置
|
||||
pm2 save --force
|
||||
|
||||
# 等待服务启动并检查状态
|
||||
sleep 3
|
||||
echo "服务状态:"
|
||||
pm2 status ${PM2_APP_NAME}
|
||||
|
||||
# 检查服务是否在线
|
||||
if pm2 describe ${PM2_APP_NAME} | grep -q "online"; then
|
||||
echo "✓ 服务启动成功!"
|
||||
else
|
||||
echo "✗ 服务启动失败,查看日志:"
|
||||
pm2 logs ${PM2_APP_NAME} --lines 30 --nostream
|
||||
exit 1
|
||||
fi
|
||||
ENDSSH
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo_info "=============================="
|
||||
echo_info "部署成功!"
|
||||
echo_info "应用地址: http://${SERVER_HOST}:${PORT}"
|
||||
echo_info "API 地址: http://${SERVER_HOST}:${PORT}/api"
|
||||
echo_info "=============================="
|
||||
else
|
||||
echo_error "部署失败"
|
||||
exit 1
|
||||
fi
|
||||
@@ -8,7 +8,8 @@
|
||||
"build:server": "pnpm --filter @mp-pilates/server build",
|
||||
"build:app": "pnpm --filter @mp-pilates/app build:mp-weixin",
|
||||
"test": "pnpm -r test",
|
||||
"lint": "pnpm -r lint"
|
||||
"lint": "pnpm -r lint",
|
||||
"deploy:server": "bash deploy-server.sh"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18",
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
import type { ApiResponse, PaginatedData } from '@mp-pilates/shared'
|
||||
|
||||
const BASE_URL = 'http://localhost:3000/api'
|
||||
const BASE_URL = (() => {
|
||||
try {
|
||||
const { miniProgram } = uni.getAccountInfoSync()
|
||||
if (miniProgram.envVersion !== 'develop') {
|
||||
return 'https://focus.richarjiang.com/api'
|
||||
}
|
||||
} catch {
|
||||
// 非小程序环境,使用开发地址
|
||||
}
|
||||
return 'http://localhost:3000/api'
|
||||
})()
|
||||
|
||||
interface RequestOptions {
|
||||
readonly url: string
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
# Database
|
||||
DATABASE_URL=postgresql://user:pass@localhost:5432/mp_pilates
|
||||
|
||||
# JWT
|
||||
JWT_SECRET=change-me-to-a-secure-random-string
|
||||
|
||||
# WeChat Mini Program
|
||||
WX_APPID=your-appid
|
||||
WX_SECRET=your-secret
|
||||
|
||||
# WeChat Pay
|
||||
WX_MCH_ID=your-mch-id
|
||||
WX_MCH_KEY=your-mch-key
|
||||
WX_MCH_SERIAL_NO=your-serial-no
|
||||
WX_MCH_CERT_PATH=./certs/apiclient_cert.pem
|
||||
WX_MCH_KEY_PATH=./certs/apiclient_key.pem
|
||||
|
||||
# Server
|
||||
PORT=3000
|
||||
@@ -3,6 +3,7 @@
|
||||
"collection": "@nestjs/schematics",
|
||||
"sourceRoot": "src",
|
||||
"compilerOptions": {
|
||||
"deleteOutDir": true
|
||||
"deleteOutDir": true,
|
||||
"tsConfigPath": "tsconfig.build.json"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,10 +27,13 @@
|
||||
"@prisma/client": "^5.19.0",
|
||||
"class-transformer": "^0.5.1",
|
||||
"class-validator": "^0.14.1",
|
||||
"nest-winston": "^1.10.2",
|
||||
"passport": "^0.7.0",
|
||||
"passport-jwt": "^4.0.1",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"rxjs": "^7.8.1"
|
||||
"rxjs": "^7.8.1",
|
||||
"winston": "^3.19.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nestjs/cli": "^10.4.0",
|
||||
@@ -48,13 +51,21 @@
|
||||
"typescript": "^5.4.0"
|
||||
},
|
||||
"jest": {
|
||||
"moduleFileExtensions": ["js", "json", "ts"],
|
||||
"moduleFileExtensions": [
|
||||
"js",
|
||||
"json",
|
||||
"ts"
|
||||
],
|
||||
"rootDir": "src",
|
||||
"testRegex": ".*\\.spec\\.ts$",
|
||||
"transform": {
|
||||
"^.+\\.(t|j)s$": "ts-jest"
|
||||
},
|
||||
"collectCoverageFrom": ["**/*.(t|j)s", "!**/*.module.ts", "!main.ts"],
|
||||
"collectCoverageFrom": [
|
||||
"**/*.(t|j)s",
|
||||
"!**/*.module.ts",
|
||||
"!main.ts"
|
||||
],
|
||||
"coverageDirectory": "../coverage",
|
||||
"testEnvironment": "node",
|
||||
"moduleNameMapper": {
|
||||
|
||||
@@ -3,7 +3,7 @@ generator client {
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
provider = "mysql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ export class AuthController {
|
||||
@Body() bindPhoneDto: BindPhoneDto,
|
||||
): Promise<User> {
|
||||
return this.authService.bindPhone(
|
||||
req.user.userId,
|
||||
req.user.sub,
|
||||
bindPhoneDto.encryptedData,
|
||||
bindPhoneDto.iv,
|
||||
)
|
||||
|
||||
@@ -6,7 +6,7 @@ import { UserRole } from '@mp-pilates/shared'
|
||||
import { JwtPayload } from './auth.service'
|
||||
|
||||
export interface AuthenticatedUser {
|
||||
userId: string
|
||||
sub: string
|
||||
role: UserRole
|
||||
}
|
||||
|
||||
@@ -20,9 +20,9 @@ export class JwtStrategy extends PassportStrategy(Strategy) {
|
||||
})
|
||||
}
|
||||
|
||||
validate(payload: JwtPayload): AuthenticatedUser {
|
||||
validate(payload: JwtPayload): { sub: string; role: UserRole } {
|
||||
return {
|
||||
userId: payload.sub,
|
||||
sub: payload.sub,
|
||||
role: payload.role,
|
||||
}
|
||||
}
|
||||
|
||||
68
packages/server/src/common/filters/api-exception.filter.ts
Normal file
68
packages/server/src/common/filters/api-exception.filter.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import {
|
||||
ExceptionFilter,
|
||||
Catch,
|
||||
ArgumentsHost,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
Logger,
|
||||
} from '@nestjs/common'
|
||||
import type { Request, Response } from 'express'
|
||||
import type { ApiResponse } from '@mp-pilates/shared'
|
||||
|
||||
@Catch()
|
||||
export class ApiExceptionFilter implements ExceptionFilter {
|
||||
private readonly logger = new Logger(ApiExceptionFilter.name)
|
||||
|
||||
catch(exception: unknown, host: ArgumentsHost): void {
|
||||
const ctx = host.switchToHttp()
|
||||
const request = ctx.getRequest<Request>()
|
||||
const response = ctx.getResponse<Response>()
|
||||
|
||||
const status =
|
||||
exception instanceof HttpException
|
||||
? exception.getStatus()
|
||||
: HttpStatus.INTERNAL_SERVER_ERROR
|
||||
|
||||
const message =
|
||||
exception instanceof HttpException
|
||||
? this.extractMessage(exception)
|
||||
: '服务器内部错误'
|
||||
|
||||
// Log all server errors (5xx) with full stack; log 4xx at warn level
|
||||
if (status >= 500) {
|
||||
this.logger.error(
|
||||
`${request.method} ${request.originalUrl} → ${String(status)} ${message}`,
|
||||
exception instanceof Error ? exception.stack : undefined,
|
||||
)
|
||||
} else if (status >= 400) {
|
||||
this.logger.warn(
|
||||
`${request.method} ${request.originalUrl} → ${String(status)} ${message}`,
|
||||
)
|
||||
}
|
||||
|
||||
const body: ApiResponse<null> = {
|
||||
success: false,
|
||||
data: null,
|
||||
message,
|
||||
}
|
||||
|
||||
response.status(status).json(body)
|
||||
}
|
||||
|
||||
private extractMessage(exception: HttpException): string {
|
||||
const response = exception.getResponse()
|
||||
if (typeof response === 'string') {
|
||||
return response
|
||||
}
|
||||
if (typeof response === 'object' && response !== null) {
|
||||
const res = response as Record<string, unknown>
|
||||
if (typeof res.message === 'string') {
|
||||
return res.message
|
||||
}
|
||||
if (Array.isArray(res.message)) {
|
||||
return res.message.join('; ')
|
||||
}
|
||||
}
|
||||
return exception.message
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import {
|
||||
Injectable,
|
||||
NestInterceptor,
|
||||
ExecutionContext,
|
||||
CallHandler,
|
||||
} from '@nestjs/common'
|
||||
import { Observable, map } from 'rxjs'
|
||||
import type { ApiResponse } from '@mp-pilates/shared'
|
||||
|
||||
@Injectable()
|
||||
export class ApiResponseInterceptor<T>
|
||||
implements NestInterceptor<T, ApiResponse<T>>
|
||||
{
|
||||
intercept(
|
||||
_context: ExecutionContext,
|
||||
next: CallHandler<T>,
|
||||
): Observable<ApiResponse<T>> {
|
||||
return next.handle().pipe(
|
||||
map((data) => ({
|
||||
success: true,
|
||||
data: data ?? null,
|
||||
message: null,
|
||||
})),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import {
|
||||
Injectable,
|
||||
NestInterceptor,
|
||||
ExecutionContext,
|
||||
CallHandler,
|
||||
Logger,
|
||||
} from '@nestjs/common'
|
||||
import { Observable, tap } from 'rxjs'
|
||||
import type { Request, Response } from 'express'
|
||||
|
||||
/** Fields stripped from logged request bodies to avoid leaking secrets. */
|
||||
const SENSITIVE_FIELDS: ReadonlySet<string> = new Set([
|
||||
'password',
|
||||
'token',
|
||||
'secret',
|
||||
'code',
|
||||
'sessionKey',
|
||||
'encryptedData',
|
||||
'iv',
|
||||
])
|
||||
|
||||
function sanitizeBody(
|
||||
body: Record<string, unknown> | undefined,
|
||||
): Record<string, unknown> | undefined {
|
||||
if (!body || typeof body !== 'object') return undefined
|
||||
return Object.fromEntries(
|
||||
Object.entries(body).map(([key, value]) =>
|
||||
SENSITIVE_FIELDS.has(key) ? [key, '***'] : [key, value],
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class LoggingInterceptor implements NestInterceptor {
|
||||
private readonly logger = new Logger('HTTP')
|
||||
|
||||
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
|
||||
const req = context.switchToHttp().getRequest<Request>()
|
||||
const { method, originalUrl } = req
|
||||
const start = Date.now()
|
||||
|
||||
return next.handle().pipe(
|
||||
tap({
|
||||
next: () => {
|
||||
const res = context.switchToHttp().getResponse<Response>()
|
||||
const duration = Date.now() - start
|
||||
const bodyLog = this.formatBody(method, req.body as Record<string, unknown>)
|
||||
this.logger.log(
|
||||
`${method} ${originalUrl} → ${String(res.statusCode)} (${String(duration)}ms)${bodyLog}`,
|
||||
)
|
||||
},
|
||||
error: (err: unknown) => {
|
||||
const duration = Date.now() - start
|
||||
const status =
|
||||
err instanceof Object && 'getStatus' in err
|
||||
? String((err as { getStatus: () => number }).getStatus())
|
||||
: '500'
|
||||
const bodyLog = this.formatBody(method, req.body as Record<string, unknown>)
|
||||
this.logger.error(
|
||||
`${method} ${originalUrl} → ${status} (${String(duration)}ms)${bodyLog}`,
|
||||
)
|
||||
},
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
private formatBody(
|
||||
method: string,
|
||||
body: Record<string, unknown> | undefined,
|
||||
): string {
|
||||
if (!['POST', 'PUT', 'PATCH'].includes(method)) return ''
|
||||
const sanitized = sanitizeBody(body)
|
||||
if (!sanitized || Object.keys(sanitized).length === 0) return ''
|
||||
return ` body=${JSON.stringify(sanitized)}`
|
||||
}
|
||||
}
|
||||
70
packages/server/src/common/logger/logger.config.ts
Normal file
70
packages/server/src/common/logger/logger.config.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import * as winston from 'winston'
|
||||
import 'winston-daily-rotate-file'
|
||||
import type { WinstonModuleOptions } from 'nest-winston'
|
||||
|
||||
const { combine, timestamp, printf, colorize, errors } = winston.format
|
||||
|
||||
/** Shared log line format: `[timestamp] [LEVEL] [context] message` */
|
||||
const logPrint = printf(({ timestamp, level, context, message, stack }) => {
|
||||
const ctx = context ? `[${context}] ` : ''
|
||||
const msg = stack ?? message
|
||||
return `${timestamp as string} [${level}] ${ctx}${msg as string}`
|
||||
})
|
||||
|
||||
function buildTransports(): winston.transport[] {
|
||||
const transports: winston.transport[] = []
|
||||
|
||||
const isProduction = process.env.NODE_ENV === 'production'
|
||||
|
||||
// Console — always enabled; colorized in dev, plain in prod
|
||||
transports.push(
|
||||
new winston.transports.Console({
|
||||
format: combine(
|
||||
...(isProduction ? [] : [colorize({ all: true })]),
|
||||
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
||||
errors({ stack: true }),
|
||||
logPrint,
|
||||
),
|
||||
}),
|
||||
)
|
||||
|
||||
// File transports — always enabled so logs persist even in dev
|
||||
// App log: all levels, 14-day retention, 20 MB max per file
|
||||
transports.push(
|
||||
new winston.transports.DailyRotateFile({
|
||||
dirname: 'logs',
|
||||
filename: 'app-%DATE%.log',
|
||||
datePattern: 'YYYY-MM-DD',
|
||||
maxSize: '20m',
|
||||
maxFiles: '14d',
|
||||
format: combine(
|
||||
timestamp({ format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' }),
|
||||
errors({ stack: true }),
|
||||
logPrint,
|
||||
),
|
||||
}),
|
||||
)
|
||||
|
||||
// Error log: error-level only, 30-day retention
|
||||
transports.push(
|
||||
new winston.transports.DailyRotateFile({
|
||||
dirname: 'logs',
|
||||
filename: 'error-%DATE%.log',
|
||||
datePattern: 'YYYY-MM-DD',
|
||||
level: 'error',
|
||||
maxSize: '20m',
|
||||
maxFiles: '30d',
|
||||
format: combine(
|
||||
timestamp({ format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' }),
|
||||
errors({ stack: true }),
|
||||
logPrint,
|
||||
),
|
||||
}),
|
||||
)
|
||||
|
||||
return transports
|
||||
}
|
||||
|
||||
export const loggerConfig: WinstonModuleOptions = {
|
||||
transports: buildTransports(),
|
||||
}
|
||||
@@ -1,10 +1,17 @@
|
||||
import { NestFactory } from '@nestjs/core'
|
||||
import { ValidationPipe } from '@nestjs/common'
|
||||
import { Logger, ValidationPipe } from '@nestjs/common'
|
||||
import { ConfigService } from '@nestjs/config'
|
||||
import { WinstonModule } from 'nest-winston'
|
||||
import { AppModule } from './app.module'
|
||||
import { loggerConfig } from './common/logger/logger.config'
|
||||
import { ApiResponseInterceptor } from './common/interceptors/api-response.interceptor'
|
||||
import { LoggingInterceptor } from './common/interceptors/logging.interceptor'
|
||||
import { ApiExceptionFilter } from './common/filters/api-exception.filter'
|
||||
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(AppModule)
|
||||
const logger = WinstonModule.createLogger(loggerConfig)
|
||||
|
||||
const app = await NestFactory.create(AppModule, { logger })
|
||||
const configService = app.get(ConfigService)
|
||||
|
||||
app.setGlobalPrefix('api')
|
||||
@@ -15,10 +22,15 @@ async function bootstrap() {
|
||||
transform: true,
|
||||
}),
|
||||
)
|
||||
app.useGlobalInterceptors(
|
||||
new LoggingInterceptor(),
|
||||
new ApiResponseInterceptor(),
|
||||
)
|
||||
app.useGlobalFilters(new ApiExceptionFilter())
|
||||
app.enableCors()
|
||||
|
||||
const port = configService.get<number>('PORT', 3000)
|
||||
await app.listen(port)
|
||||
console.log(`Server running on http://localhost:${port}`)
|
||||
new Logger('Bootstrap').log(`Server running on http://localhost:${port}`)
|
||||
}
|
||||
bootstrap()
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
"outDir": "dist",
|
||||
"rootDir": "src",
|
||||
"paths": {},
|
||||
"incremental": false
|
||||
},
|
||||
"exclude": ["node_modules", "dist", "test", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
1
packages/server/tsconfig.build.tsbuildinfo
Normal file
1
packages/server/tsconfig.build.tsbuildinfo
Normal file
File diff suppressed because one or more lines are too long
20
packages/shared/src/constants.js
Normal file
20
packages/shared/src/constants.js
Normal file
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WEEKDAY_LABELS = exports.DATE_SELECTOR_DAYS = exports.TIME_PERIODS = exports.SLOT_GENERATION_DAYS = exports.DEFAULT_SLOT_CAPACITY = exports.DEFAULT_CANCEL_HOURS_LIMIT = void 0;
|
||||
/** 默认免费取消截止小时数 */
|
||||
exports.DEFAULT_CANCEL_HOURS_LIMIT = 2;
|
||||
/** 默认时段容量(私教 = 1) */
|
||||
exports.DEFAULT_SLOT_CAPACITY = 1;
|
||||
/** 自动生成时段的天数范围 */
|
||||
exports.SLOT_GENERATION_DAYS = 14;
|
||||
/** 时段筛选区间 */
|
||||
exports.TIME_PERIODS = {
|
||||
MORNING: { label: '上午', start: '06:00', end: '12:00' },
|
||||
AFTERNOON: { label: '下午', start: '12:00', end: '18:00' },
|
||||
EVENING: { label: '晚上', start: '18:00', end: '22:00' },
|
||||
};
|
||||
/** 日期选择器展示天数 */
|
||||
exports.DATE_SELECTOR_DAYS = 7;
|
||||
/** 星期映射 */
|
||||
exports.WEEKDAY_LABELS = ['', '周一', '周二', '周三', '周四', '周五', '周六', '周日'];
|
||||
//# sourceMappingURL=constants.js.map
|
||||
1
packages/shared/src/constants.js.map
Normal file
1
packages/shared/src/constants.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"constants.js","sourceRoot":"","sources":["constants.ts"],"names":[],"mappings":";;;AAAA,kBAAkB;AACL,QAAA,0BAA0B,GAAG,CAAC,CAAA;AAE3C,qBAAqB;AACR,QAAA,qBAAqB,GAAG,CAAC,CAAA;AAEtC,kBAAkB;AACL,QAAA,oBAAoB,GAAG,EAAE,CAAA;AAEtC,aAAa;AACA,QAAA,YAAY,GAAG;IAC1B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IACtD,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IACxD,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;CAC9C,CAAA;AAEV,gBAAgB;AACH,QAAA,kBAAkB,GAAG,CAAC,CAAA;AAEnC,WAAW;AACE,QAAA,cAAc,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA"}
|
||||
51
packages/shared/src/enums.js
Normal file
51
packages/shared/src/enums.js
Normal file
@@ -0,0 +1,51 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OrderStatus = exports.BookingStatus = exports.TimeSlotSource = exports.TimeSlotStatus = exports.MembershipStatus = exports.CardTypeCategory = exports.UserRole = void 0;
|
||||
// ===== User =====
|
||||
var UserRole;
|
||||
(function (UserRole) {
|
||||
UserRole["MEMBER"] = "MEMBER";
|
||||
UserRole["ADMIN"] = "ADMIN";
|
||||
})(UserRole || (exports.UserRole = UserRole = {}));
|
||||
// ===== CardType =====
|
||||
var CardTypeCategory;
|
||||
(function (CardTypeCategory) {
|
||||
CardTypeCategory["TIMES"] = "TIMES";
|
||||
CardTypeCategory["DURATION"] = "DURATION";
|
||||
CardTypeCategory["TRIAL"] = "TRIAL";
|
||||
})(CardTypeCategory || (exports.CardTypeCategory = CardTypeCategory = {}));
|
||||
// ===== Membership =====
|
||||
var MembershipStatus;
|
||||
(function (MembershipStatus) {
|
||||
MembershipStatus["ACTIVE"] = "ACTIVE";
|
||||
MembershipStatus["EXPIRED"] = "EXPIRED";
|
||||
MembershipStatus["USED_UP"] = "USED_UP";
|
||||
})(MembershipStatus || (exports.MembershipStatus = MembershipStatus = {}));
|
||||
// ===== TimeSlot =====
|
||||
var TimeSlotStatus;
|
||||
(function (TimeSlotStatus) {
|
||||
TimeSlotStatus["OPEN"] = "OPEN";
|
||||
TimeSlotStatus["FULL"] = "FULL";
|
||||
TimeSlotStatus["CLOSED"] = "CLOSED";
|
||||
})(TimeSlotStatus || (exports.TimeSlotStatus = TimeSlotStatus = {}));
|
||||
var TimeSlotSource;
|
||||
(function (TimeSlotSource) {
|
||||
TimeSlotSource["TEMPLATE"] = "TEMPLATE";
|
||||
TimeSlotSource["MANUAL"] = "MANUAL";
|
||||
})(TimeSlotSource || (exports.TimeSlotSource = TimeSlotSource = {}));
|
||||
// ===== Booking =====
|
||||
var BookingStatus;
|
||||
(function (BookingStatus) {
|
||||
BookingStatus["CONFIRMED"] = "CONFIRMED";
|
||||
BookingStatus["CANCELLED"] = "CANCELLED";
|
||||
BookingStatus["COMPLETED"] = "COMPLETED";
|
||||
BookingStatus["NO_SHOW"] = "NO_SHOW";
|
||||
})(BookingStatus || (exports.BookingStatus = BookingStatus = {}));
|
||||
// ===== Order =====
|
||||
var OrderStatus;
|
||||
(function (OrderStatus) {
|
||||
OrderStatus["PENDING"] = "PENDING";
|
||||
OrderStatus["PAID"] = "PAID";
|
||||
OrderStatus["REFUNDED"] = "REFUNDED";
|
||||
})(OrderStatus || (exports.OrderStatus = OrderStatus = {}));
|
||||
//# sourceMappingURL=enums.js.map
|
||||
1
packages/shared/src/enums.js.map
Normal file
1
packages/shared/src/enums.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"enums.js","sourceRoot":"","sources":["enums.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,2BAAe,CAAA;AACjB,CAAC,EAHW,QAAQ,wBAAR,QAAQ,QAGnB;AAED,uBAAuB;AACvB,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,mCAAe,CAAA;IACf,yCAAqB,CAAA;IACrB,mCAAe,CAAA;AACjB,CAAC,EAJW,gBAAgB,gCAAhB,gBAAgB,QAI3B;AAED,yBAAyB;AACzB,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,uCAAmB,CAAA;IACnB,uCAAmB,CAAA;AACrB,CAAC,EAJW,gBAAgB,gCAAhB,gBAAgB,QAI3B;AAED,uBAAuB;AACvB,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,+BAAa,CAAA;IACb,mCAAiB,CAAA;AACnB,CAAC,EAJW,cAAc,8BAAd,cAAc,QAIzB;AAED,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,uCAAqB,CAAA;IACrB,mCAAiB,CAAA;AACnB,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAED,sBAAsB;AACtB,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,wCAAuB,CAAA;IACvB,wCAAuB,CAAA;IACvB,oCAAmB,CAAA;AACrB,CAAC,EALW,aAAa,6BAAb,aAAa,QAKxB;AAED,oBAAoB;AACpB,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB"}
|
||||
21
packages/shared/src/index.js
Normal file
21
packages/shared/src/index.js
Normal file
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WEEKDAY_LABELS = exports.DATE_SELECTOR_DAYS = exports.TIME_PERIODS = exports.SLOT_GENERATION_DAYS = exports.DEFAULT_SLOT_CAPACITY = exports.DEFAULT_CANCEL_HOURS_LIMIT = exports.OrderStatus = exports.BookingStatus = exports.TimeSlotSource = exports.TimeSlotStatus = exports.MembershipStatus = exports.CardTypeCategory = exports.UserRole = void 0;
|
||||
// Enums
|
||||
var enums_1 = require("./enums");
|
||||
Object.defineProperty(exports, "UserRole", { enumerable: true, get: function () { return enums_1.UserRole; } });
|
||||
Object.defineProperty(exports, "CardTypeCategory", { enumerable: true, get: function () { return enums_1.CardTypeCategory; } });
|
||||
Object.defineProperty(exports, "MembershipStatus", { enumerable: true, get: function () { return enums_1.MembershipStatus; } });
|
||||
Object.defineProperty(exports, "TimeSlotStatus", { enumerable: true, get: function () { return enums_1.TimeSlotStatus; } });
|
||||
Object.defineProperty(exports, "TimeSlotSource", { enumerable: true, get: function () { return enums_1.TimeSlotSource; } });
|
||||
Object.defineProperty(exports, "BookingStatus", { enumerable: true, get: function () { return enums_1.BookingStatus; } });
|
||||
Object.defineProperty(exports, "OrderStatus", { enumerable: true, get: function () { return enums_1.OrderStatus; } });
|
||||
// Constants
|
||||
var constants_1 = require("./constants");
|
||||
Object.defineProperty(exports, "DEFAULT_CANCEL_HOURS_LIMIT", { enumerable: true, get: function () { return constants_1.DEFAULT_CANCEL_HOURS_LIMIT; } });
|
||||
Object.defineProperty(exports, "DEFAULT_SLOT_CAPACITY", { enumerable: true, get: function () { return constants_1.DEFAULT_SLOT_CAPACITY; } });
|
||||
Object.defineProperty(exports, "SLOT_GENERATION_DAYS", { enumerable: true, get: function () { return constants_1.SLOT_GENERATION_DAYS; } });
|
||||
Object.defineProperty(exports, "TIME_PERIODS", { enumerable: true, get: function () { return constants_1.TIME_PERIODS; } });
|
||||
Object.defineProperty(exports, "DATE_SELECTOR_DAYS", { enumerable: true, get: function () { return constants_1.DATE_SELECTOR_DAYS; } });
|
||||
Object.defineProperty(exports, "WEEKDAY_LABELS", { enumerable: true, get: function () { return constants_1.WEEKDAY_LABELS; } });
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
packages/shared/src/index.js.map
Normal file
1
packages/shared/src/index.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,iCAQgB;AAPd,iGAAA,QAAQ,OAAA;AACR,yGAAA,gBAAgB,OAAA;AAChB,yGAAA,gBAAgB,OAAA;AAChB,uGAAA,cAAc,OAAA;AACd,uGAAA,cAAc,OAAA;AACd,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA;AAGb,YAAY;AACZ,yCAOoB;AANlB,uHAAA,0BAA0B,OAAA;AAC1B,kHAAA,qBAAqB,OAAA;AACrB,iHAAA,oBAAoB,OAAA;AACpB,yGAAA,YAAY,OAAA;AACZ,+GAAA,kBAAkB,OAAA;AAClB,2GAAA,cAAc,OAAA"}
|
||||
3
packages/shared/src/types/api.js
Normal file
3
packages/shared/src/types/api.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=api.js.map
|
||||
1
packages/shared/src/types/api.js.map
Normal file
1
packages/shared/src/types/api.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"api.js","sourceRoot":"","sources":["api.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/booking.js
Normal file
3
packages/shared/src/types/booking.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=booking.js.map
|
||||
1
packages/shared/src/types/booking.js.map
Normal file
1
packages/shared/src/types/booking.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"booking.js","sourceRoot":"","sources":["booking.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/card-type.js
Normal file
3
packages/shared/src/types/card-type.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=card-type.js.map
|
||||
1
packages/shared/src/types/card-type.js.map
Normal file
1
packages/shared/src/types/card-type.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"card-type.js","sourceRoot":"","sources":["card-type.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/index.js
Normal file
3
packages/shared/src/types/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
packages/shared/src/types/index.js.map
Normal file
1
packages/shared/src/types/index.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/membership.js
Normal file
3
packages/shared/src/types/membership.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=membership.js.map
|
||||
1
packages/shared/src/types/membership.js.map
Normal file
1
packages/shared/src/types/membership.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"membership.js","sourceRoot":"","sources":["membership.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/order.js
Normal file
3
packages/shared/src/types/order.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=order.js.map
|
||||
1
packages/shared/src/types/order.js.map
Normal file
1
packages/shared/src/types/order.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"order.js","sourceRoot":"","sources":["order.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/studio.js
Normal file
3
packages/shared/src/types/studio.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=studio.js.map
|
||||
1
packages/shared/src/types/studio.js.map
Normal file
1
packages/shared/src/types/studio.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"studio.js","sourceRoot":"","sources":["studio.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/time-slot.js
Normal file
3
packages/shared/src/types/time-slot.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=time-slot.js.map
|
||||
1
packages/shared/src/types/time-slot.js.map
Normal file
1
packages/shared/src/types/time-slot.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"time-slot.js","sourceRoot":"","sources":["time-slot.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/user.js
Normal file
3
packages/shared/src/types/user.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=user.js.map
|
||||
1
packages/shared/src/types/user.js.map
Normal file
1
packages/shared/src/types/user.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"user.js","sourceRoot":"","sources":["user.ts"],"names":[],"mappings":""}
|
||||
3
packages/shared/src/types/week-template.js
Normal file
3
packages/shared/src/types/week-template.js
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=week-template.js.map
|
||||
1
packages/shared/src/types/week-template.js.map
Normal file
1
packages/shared/src/types/week-template.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"week-template.js","sourceRoot":"","sources":["week-template.ts"],"names":[],"mappings":""}
|
||||
@@ -3,6 +3,8 @@
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"rootDir": "src",
|
||||
"module": "CommonJS",
|
||||
"moduleResolution": "node",
|
||||
"declaration": true,
|
||||
"declarationMap": true
|
||||
},
|
||||
|
||||
208
pnpm-lock.yaml
generated
208
pnpm-lock.yaml
generated
@@ -101,6 +101,9 @@ importers:
|
||||
class-validator:
|
||||
specifier: ^0.14.1
|
||||
version: 0.14.4
|
||||
nest-winston:
|
||||
specifier: ^1.10.2
|
||||
version: 1.10.2(@nestjs/common@10.4.22(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(winston@3.19.0)
|
||||
passport:
|
||||
specifier: ^0.7.0
|
||||
version: 0.7.0
|
||||
@@ -113,6 +116,12 @@ importers:
|
||||
rxjs:
|
||||
specifier: ^7.8.1
|
||||
version: 7.8.2
|
||||
winston:
|
||||
specifier: ^3.19.0
|
||||
version: 3.19.0
|
||||
winston-daily-rotate-file:
|
||||
specifier: ^5.0.0
|
||||
version: 5.0.0(winston@3.19.0)
|
||||
devDependencies:
|
||||
'@nestjs/cli':
|
||||
specifier: ^10.4.0
|
||||
@@ -780,10 +789,17 @@ packages:
|
||||
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
|
||||
engines: {node: '>=0.1.90'}
|
||||
|
||||
'@colors/colors@1.6.0':
|
||||
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
|
||||
engines: {node: '>=0.1.90'}
|
||||
|
||||
'@cspotcode/source-map-support@0.8.1':
|
||||
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@dabh/diagnostics@2.0.8':
|
||||
resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
|
||||
|
||||
'@dcloudio/types@3.4.30':
|
||||
resolution: {integrity: sha512-qUSRM4x8ekdtZHpYaz0gUd2+wDBeCo3jWmhc+hqX8hUx0KoModW8dI7FJQYMfMGRF2F/gbvy9LWUyV50M7VF6g==}
|
||||
|
||||
@@ -1813,6 +1829,9 @@ packages:
|
||||
'@sinonjs/fake-timers@10.3.0':
|
||||
resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
|
||||
|
||||
'@so-ric/colorspace@1.1.6':
|
||||
resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
|
||||
|
||||
'@tokenizer/inflate@0.2.7':
|
||||
resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -1931,6 +1950,9 @@ packages:
|
||||
'@types/stack-utils@2.0.3':
|
||||
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
|
||||
|
||||
'@types/triple-beam@1.3.5':
|
||||
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
|
||||
|
||||
'@types/validator@13.15.10':
|
||||
resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
|
||||
|
||||
@@ -2211,6 +2233,9 @@ packages:
|
||||
asap@2.0.6:
|
||||
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
|
||||
|
||||
async@3.2.6:
|
||||
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
|
||||
|
||||
asynckit@0.4.0:
|
||||
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||
|
||||
@@ -2453,9 +2478,25 @@ packages:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
|
||||
color-convert@3.1.3:
|
||||
resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
|
||||
engines: {node: '>=14.6'}
|
||||
|
||||
color-name@1.1.4:
|
||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||
|
||||
color-name@2.1.0:
|
||||
resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
|
||||
engines: {node: '>=12.20'}
|
||||
|
||||
color-string@2.1.4:
|
||||
resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
color@5.0.3:
|
||||
resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
combined-stream@1.0.8:
|
||||
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
@@ -2697,6 +2738,9 @@ packages:
|
||||
emoji-regex@9.2.2:
|
||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||
|
||||
enabled@2.0.0:
|
||||
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
|
||||
|
||||
encodeurl@2.0.0:
|
||||
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
@@ -2851,6 +2895,9 @@ packages:
|
||||
fb-watchman@2.0.2:
|
||||
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
|
||||
|
||||
fecha@4.2.3:
|
||||
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
|
||||
|
||||
fflate@0.8.2:
|
||||
resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
|
||||
|
||||
@@ -2858,6 +2905,9 @@ packages:
|
||||
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
file-stream-rotator@0.6.1:
|
||||
resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==}
|
||||
|
||||
file-type@20.4.1:
|
||||
resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -2878,6 +2928,9 @@ packages:
|
||||
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
fn.name@1.1.0:
|
||||
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
|
||||
|
||||
follow-redirects@1.15.11:
|
||||
resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
|
||||
engines: {node: '>=4.0'}
|
||||
@@ -2971,6 +3024,7 @@ packages:
|
||||
|
||||
glob@10.4.5:
|
||||
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
|
||||
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
|
||||
hasBin: true
|
||||
|
||||
glob@7.2.3:
|
||||
@@ -3377,6 +3431,9 @@ packages:
|
||||
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
kuler@2.0.0:
|
||||
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
|
||||
|
||||
lcid@3.1.1:
|
||||
resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -3465,6 +3522,10 @@ packages:
|
||||
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
logform@2.7.0:
|
||||
resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
@@ -3583,6 +3644,9 @@ packages:
|
||||
module-alias@2.3.4:
|
||||
resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==}
|
||||
|
||||
moment@2.30.1:
|
||||
resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
|
||||
|
||||
ms@2.0.0:
|
||||
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
||||
|
||||
@@ -3618,6 +3682,12 @@ packages:
|
||||
neo-async@2.6.2:
|
||||
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
|
||||
|
||||
nest-winston@1.10.2:
|
||||
resolution: {integrity: sha512-Z9IzL/nekBOF/TEwBHUJDiDPMaXUcFquUQOFavIRet6xF0EbuWnOzslyN/ksgzG+fITNgXhMdrL/POp9SdaFxA==}
|
||||
peerDependencies:
|
||||
'@nestjs/common': ^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
|
||||
winston: ^3.0.0
|
||||
|
||||
node-abort-controller@3.1.1:
|
||||
resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
|
||||
|
||||
@@ -3654,6 +3724,10 @@ packages:
|
||||
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
object-hash@3.0.0:
|
||||
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
object-inspect@1.13.4:
|
||||
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@@ -3668,6 +3742,9 @@ packages:
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
|
||||
one-time@1.0.0:
|
||||
resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
|
||||
|
||||
onetime@5.1.2:
|
||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -4078,6 +4155,10 @@ packages:
|
||||
safe-buffer@5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
|
||||
safe-stable-stringify@2.5.0:
|
||||
resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
safer-buffer@2.1.2:
|
||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||
|
||||
@@ -4184,6 +4265,9 @@ packages:
|
||||
sprintf-js@1.0.3:
|
||||
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
||||
|
||||
stack-trace@0.0.10:
|
||||
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
|
||||
|
||||
stack-utils@2.0.6:
|
||||
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -4301,6 +4385,9 @@ packages:
|
||||
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
text-hex@1.0.0:
|
||||
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
|
||||
|
||||
through@2.3.8:
|
||||
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
||||
|
||||
@@ -4336,6 +4423,10 @@ packages:
|
||||
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
|
||||
hasBin: true
|
||||
|
||||
triple-beam@1.4.1:
|
||||
resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
|
||||
engines: {node: '>= 14.0.0'}
|
||||
|
||||
ts-jest@29.4.9:
|
||||
resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==}
|
||||
engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
|
||||
@@ -4631,6 +4722,20 @@ packages:
|
||||
engines: {node: '>= 8'}
|
||||
hasBin: true
|
||||
|
||||
winston-daily-rotate-file@5.0.0:
|
||||
resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==}
|
||||
engines: {node: '>=8'}
|
||||
peerDependencies:
|
||||
winston: ^3
|
||||
|
||||
winston-transport@4.9.0:
|
||||
resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
winston@3.19.0:
|
||||
resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
wordwrap@1.0.0:
|
||||
resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
|
||||
|
||||
@@ -5508,10 +5613,18 @@ snapshots:
|
||||
'@colors/colors@1.5.0':
|
||||
optional: true
|
||||
|
||||
'@colors/colors@1.6.0': {}
|
||||
|
||||
'@cspotcode/source-map-support@0.8.1':
|
||||
dependencies:
|
||||
'@jridgewell/trace-mapping': 0.3.9
|
||||
|
||||
'@dabh/diagnostics@2.0.8':
|
||||
dependencies:
|
||||
'@so-ric/colorspace': 1.1.6
|
||||
enabled: 2.0.0
|
||||
kuler: 2.0.0
|
||||
|
||||
'@dcloudio/types@3.4.30': {}
|
||||
|
||||
'@dcloudio/uni-app-plus@3.0.0-4060620250520001(postcss@8.5.8)(rollup@4.60.1)(ts-node@10.9.2(@types/node@20.19.37)(typescript@5.9.3))(vite@5.4.21(@types/node@20.19.37)(sass@1.98.0)(terser@5.46.1))(vue@3.5.31(typescript@5.9.3))':
|
||||
@@ -6938,6 +7051,11 @@ snapshots:
|
||||
dependencies:
|
||||
'@sinonjs/commons': 3.0.1
|
||||
|
||||
'@so-ric/colorspace@1.1.6':
|
||||
dependencies:
|
||||
color: 5.0.3
|
||||
text-hex: 1.0.0
|
||||
|
||||
'@tokenizer/inflate@0.2.7':
|
||||
dependencies:
|
||||
debug: 4.4.3
|
||||
@@ -7089,6 +7207,8 @@ snapshots:
|
||||
|
||||
'@types/stack-utils@2.0.3': {}
|
||||
|
||||
'@types/triple-beam@1.3.5': {}
|
||||
|
||||
'@types/validator@13.15.10': {}
|
||||
|
||||
'@types/yargs-parser@21.0.3': {}
|
||||
@@ -7458,6 +7578,8 @@ snapshots:
|
||||
|
||||
asap@2.0.6: {}
|
||||
|
||||
async@3.2.6: {}
|
||||
|
||||
asynckit@0.4.0: {}
|
||||
|
||||
autoprefixer@10.4.27(postcss@8.5.8):
|
||||
@@ -7740,8 +7862,23 @@ snapshots:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
|
||||
color-convert@3.1.3:
|
||||
dependencies:
|
||||
color-name: 2.1.0
|
||||
|
||||
color-name@1.1.4: {}
|
||||
|
||||
color-name@2.1.0: {}
|
||||
|
||||
color-string@2.1.4:
|
||||
dependencies:
|
||||
color-name: 2.1.0
|
||||
|
||||
color@5.0.3:
|
||||
dependencies:
|
||||
color-convert: 3.1.3
|
||||
color-string: 2.1.4
|
||||
|
||||
combined-stream@1.0.8:
|
||||
dependencies:
|
||||
delayed-stream: 1.0.0
|
||||
@@ -7939,6 +8076,8 @@ snapshots:
|
||||
|
||||
emoji-regex@9.2.2: {}
|
||||
|
||||
enabled@2.0.0: {}
|
||||
|
||||
encodeurl@2.0.0: {}
|
||||
|
||||
enhanced-resolve@5.20.1:
|
||||
@@ -8152,12 +8291,18 @@ snapshots:
|
||||
dependencies:
|
||||
bser: 2.1.1
|
||||
|
||||
fecha@4.2.3: {}
|
||||
|
||||
fflate@0.8.2: {}
|
||||
|
||||
figures@3.2.0:
|
||||
dependencies:
|
||||
escape-string-regexp: 1.0.5
|
||||
|
||||
file-stream-rotator@0.6.1:
|
||||
dependencies:
|
||||
moment: 2.30.1
|
||||
|
||||
file-type@20.4.1:
|
||||
dependencies:
|
||||
'@tokenizer/inflate': 0.2.7
|
||||
@@ -8190,6 +8335,8 @@ snapshots:
|
||||
locate-path: 5.0.0
|
||||
path-exists: 4.0.0
|
||||
|
||||
fn.name@1.1.0: {}
|
||||
|
||||
follow-redirects@1.15.11: {}
|
||||
|
||||
foreground-child@3.3.1:
|
||||
@@ -8922,6 +9069,8 @@ snapshots:
|
||||
|
||||
kleur@3.0.3: {}
|
||||
|
||||
kuler@2.0.0: {}
|
||||
|
||||
lcid@3.1.1:
|
||||
dependencies:
|
||||
invert-kv: 3.0.1
|
||||
@@ -8996,6 +9145,15 @@ snapshots:
|
||||
chalk: 4.1.2
|
||||
is-unicode-supported: 0.1.0
|
||||
|
||||
logform@2.7.0:
|
||||
dependencies:
|
||||
'@colors/colors': 1.6.0
|
||||
'@types/triple-beam': 1.3.5
|
||||
fecha: 4.2.3
|
||||
ms: 2.1.3
|
||||
safe-stable-stringify: 2.5.0
|
||||
triple-beam: 1.4.1
|
||||
|
||||
lru-cache@10.4.3: {}
|
||||
|
||||
lru-cache@5.1.1:
|
||||
@@ -9090,6 +9248,8 @@ snapshots:
|
||||
|
||||
module-alias@2.3.4: {}
|
||||
|
||||
moment@2.30.1: {}
|
||||
|
||||
ms@2.0.0: {}
|
||||
|
||||
ms@2.1.3: {}
|
||||
@@ -9118,6 +9278,12 @@ snapshots:
|
||||
|
||||
neo-async@2.6.2: {}
|
||||
|
||||
nest-winston@1.10.2(@nestjs/common@10.4.22(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(winston@3.19.0):
|
||||
dependencies:
|
||||
'@nestjs/common': 10.4.22(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)
|
||||
fast-safe-stringify: 2.1.1
|
||||
winston: 3.19.0
|
||||
|
||||
node-abort-controller@3.1.1: {}
|
||||
|
||||
node-addon-api@7.1.1:
|
||||
@@ -9143,6 +9309,8 @@ snapshots:
|
||||
|
||||
object-assign@4.1.1: {}
|
||||
|
||||
object-hash@3.0.0: {}
|
||||
|
||||
object-inspect@1.13.4: {}
|
||||
|
||||
omggif@1.0.10: {}
|
||||
@@ -9155,6 +9323,10 @@ snapshots:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
|
||||
one-time@1.0.0:
|
||||
dependencies:
|
||||
fn.name: 1.1.0
|
||||
|
||||
onetime@5.1.2:
|
||||
dependencies:
|
||||
mimic-fn: 2.1.0
|
||||
@@ -9565,6 +9737,8 @@ snapshots:
|
||||
|
||||
safe-buffer@5.2.1: {}
|
||||
|
||||
safe-stable-stringify@2.5.0: {}
|
||||
|
||||
safer-buffer@2.1.2: {}
|
||||
|
||||
sass@1.98.0:
|
||||
@@ -9694,6 +9868,8 @@ snapshots:
|
||||
|
||||
sprintf-js@1.0.3: {}
|
||||
|
||||
stack-trace@0.0.10: {}
|
||||
|
||||
stack-utils@2.0.6:
|
||||
dependencies:
|
||||
escape-string-regexp: 2.0.0
|
||||
@@ -9808,6 +9984,8 @@ snapshots:
|
||||
glob: 7.2.3
|
||||
minimatch: 3.1.5
|
||||
|
||||
text-hex@1.0.0: {}
|
||||
|
||||
through@2.3.8: {}
|
||||
|
||||
timm@1.7.1: {}
|
||||
@@ -9836,6 +10014,8 @@ snapshots:
|
||||
|
||||
tree-kill@1.2.2: {}
|
||||
|
||||
triple-beam@1.4.1: {}
|
||||
|
||||
ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.37)(ts-node@10.9.2(@types/node@20.19.37)(typescript@5.9.3)))(typescript@5.9.3):
|
||||
dependencies:
|
||||
bs-logger: 0.2.6
|
||||
@@ -10104,6 +10284,34 @@ snapshots:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
winston-daily-rotate-file@5.0.0(winston@3.19.0):
|
||||
dependencies:
|
||||
file-stream-rotator: 0.6.1
|
||||
object-hash: 3.0.0
|
||||
triple-beam: 1.4.1
|
||||
winston: 3.19.0
|
||||
winston-transport: 4.9.0
|
||||
|
||||
winston-transport@4.9.0:
|
||||
dependencies:
|
||||
logform: 2.7.0
|
||||
readable-stream: 3.6.2
|
||||
triple-beam: 1.4.1
|
||||
|
||||
winston@3.19.0:
|
||||
dependencies:
|
||||
'@colors/colors': 1.6.0
|
||||
'@dabh/diagnostics': 2.0.8
|
||||
async: 3.2.6
|
||||
is-stream: 2.0.1
|
||||
logform: 2.7.0
|
||||
one-time: 1.0.0
|
||||
readable-stream: 3.6.2
|
||||
safe-stable-stringify: 2.5.0
|
||||
stack-trace: 0.0.10
|
||||
triple-beam: 1.4.1
|
||||
winston-transport: 4.9.0
|
||||
|
||||
wordwrap@1.0.0: {}
|
||||
|
||||
wrap-ansi@6.2.0:
|
||||
|
||||
Reference in New Issue
Block a user