feat: 支持一键发布服务端

This commit is contained in:
richarjiang
2026-04-04 15:39:26 +08:00
parent 2b3b636c54
commit 982e569fa3
45 changed files with 852 additions and 34 deletions

1
.gitignore vendored
View File

@@ -21,6 +21,7 @@ dist-ssr/
Thumbs.db Thumbs.db
# Logs # Logs
logs/
*.log *.log
npm-debug.log* npm-debug.log*
pnpm-debug.log* pnpm-debug.log*

212
deploy-server.sh Executable file
View 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

View File

@@ -8,7 +8,8 @@
"build:server": "pnpm --filter @mp-pilates/server build", "build:server": "pnpm --filter @mp-pilates/server build",
"build:app": "pnpm --filter @mp-pilates/app build:mp-weixin", "build:app": "pnpm --filter @mp-pilates/app build:mp-weixin",
"test": "pnpm -r test", "test": "pnpm -r test",
"lint": "pnpm -r lint" "lint": "pnpm -r lint",
"deploy:server": "bash deploy-server.sh"
}, },
"engines": { "engines": {
"node": ">=18", "node": ">=18",

View File

@@ -1,6 +1,16 @@
import type { ApiResponse, PaginatedData } from '@mp-pilates/shared' 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 { interface RequestOptions {
readonly url: string readonly url: string

View File

@@ -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

View File

@@ -3,6 +3,7 @@
"collection": "@nestjs/schematics", "collection": "@nestjs/schematics",
"sourceRoot": "src", "sourceRoot": "src",
"compilerOptions": { "compilerOptions": {
"deleteOutDir": true "deleteOutDir": true,
"tsConfigPath": "tsconfig.build.json"
} }
} }

View File

@@ -27,10 +27,13 @@
"@prisma/client": "^5.19.0", "@prisma/client": "^5.19.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.1", "class-validator": "^0.14.1",
"nest-winston": "^1.10.2",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
"reflect-metadata": "^0.2.2", "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": { "devDependencies": {
"@nestjs/cli": "^10.4.0", "@nestjs/cli": "^10.4.0",
@@ -48,13 +51,21 @@
"typescript": "^5.4.0" "typescript": "^5.4.0"
}, },
"jest": { "jest": {
"moduleFileExtensions": ["js", "json", "ts"], "moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src", "rootDir": "src",
"testRegex": ".*\\.spec\\.ts$", "testRegex": ".*\\.spec\\.ts$",
"transform": { "transform": {
"^.+\\.(t|j)s$": "ts-jest" "^.+\\.(t|j)s$": "ts-jest"
}, },
"collectCoverageFrom": ["**/*.(t|j)s", "!**/*.module.ts", "!main.ts"], "collectCoverageFrom": [
"**/*.(t|j)s",
"!**/*.module.ts",
"!main.ts"
],
"coverageDirectory": "../coverage", "coverageDirectory": "../coverage",
"testEnvironment": "node", "testEnvironment": "node",
"moduleNameMapper": { "moduleNameMapper": {

View File

@@ -3,7 +3,7 @@ generator client {
} }
datasource db { datasource db {
provider = "postgresql" provider = "mysql"
url = env("DATABASE_URL") url = env("DATABASE_URL")
} }

View File

@@ -36,7 +36,7 @@ export class AuthController {
@Body() bindPhoneDto: BindPhoneDto, @Body() bindPhoneDto: BindPhoneDto,
): Promise<User> { ): Promise<User> {
return this.authService.bindPhone( return this.authService.bindPhone(
req.user.userId, req.user.sub,
bindPhoneDto.encryptedData, bindPhoneDto.encryptedData,
bindPhoneDto.iv, bindPhoneDto.iv,
) )

View File

@@ -6,7 +6,7 @@ import { UserRole } from '@mp-pilates/shared'
import { JwtPayload } from './auth.service' import { JwtPayload } from './auth.service'
export interface AuthenticatedUser { export interface AuthenticatedUser {
userId: string sub: string
role: UserRole role: UserRole
} }
@@ -20,9 +20,9 @@ export class JwtStrategy extends PassportStrategy(Strategy) {
}) })
} }
validate(payload: JwtPayload): AuthenticatedUser { validate(payload: JwtPayload): { sub: string; role: UserRole } {
return { return {
userId: payload.sub, sub: payload.sub,
role: payload.role, role: payload.role,
} }
} }

View 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
}
}

View File

@@ -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,
})),
)
}
}

View File

@@ -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)}`
}
}

View 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(),
}

View File

@@ -1,10 +1,17 @@
import { NestFactory } from '@nestjs/core' import { NestFactory } from '@nestjs/core'
import { ValidationPipe } from '@nestjs/common' import { Logger, ValidationPipe } from '@nestjs/common'
import { ConfigService } from '@nestjs/config' import { ConfigService } from '@nestjs/config'
import { WinstonModule } from 'nest-winston'
import { AppModule } from './app.module' 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() { 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) const configService = app.get(ConfigService)
app.setGlobalPrefix('api') app.setGlobalPrefix('api')
@@ -15,10 +22,15 @@ async function bootstrap() {
transform: true, transform: true,
}), }),
) )
app.useGlobalInterceptors(
new LoggingInterceptor(),
new ApiResponseInterceptor(),
)
app.useGlobalFilters(new ApiExceptionFilter())
app.enableCors() app.enableCors()
const port = configService.get<number>('PORT', 3000) const port = configService.get<number>('PORT', 3000)
await app.listen(port) await app.listen(port)
console.log(`Server running on http://localhost:${port}`) new Logger('Bootstrap').log(`Server running on http://localhost:${port}`)
} }
bootstrap() bootstrap()

View File

@@ -1,7 +1,10 @@
{ {
"extends": "./tsconfig.json", "extends": "./tsconfig.json",
"compilerOptions": { "compilerOptions": {
"outDir": "dist" "outDir": "dist",
"rootDir": "src",
"paths": {},
"incremental": false
}, },
"exclude": ["node_modules", "dist", "test", "**/*.spec.ts"] "exclude": ["node_modules", "dist", "test", "**/*.spec.ts"]
} }

File diff suppressed because one or more lines are too long

View 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

View 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"}

View 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

View 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"}

View 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

View 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"}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=api.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"api.js","sourceRoot":"","sources":["api.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=booking.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"booking.js","sourceRoot":"","sources":["booking.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=card-type.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"card-type.js","sourceRoot":"","sources":["card-type.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=membership.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"membership.js","sourceRoot":"","sources":["membership.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=order.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"order.js","sourceRoot":"","sources":["order.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=studio.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"studio.js","sourceRoot":"","sources":["studio.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=time-slot.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"time-slot.js","sourceRoot":"","sources":["time-slot.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=user.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"user.js","sourceRoot":"","sources":["user.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=week-template.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"week-template.js","sourceRoot":"","sources":["week-template.ts"],"names":[],"mappings":""}

View File

@@ -3,6 +3,8 @@
"compilerOptions": { "compilerOptions": {
"outDir": "dist", "outDir": "dist",
"rootDir": "src", "rootDir": "src",
"module": "CommonJS",
"moduleResolution": "node",
"declaration": true, "declaration": true,
"declarationMap": true "declarationMap": true
}, },

208
pnpm-lock.yaml generated
View File

@@ -101,6 +101,9 @@ importers:
class-validator: class-validator:
specifier: ^0.14.1 specifier: ^0.14.1
version: 0.14.4 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: passport:
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.0 version: 0.7.0
@@ -113,6 +116,12 @@ importers:
rxjs: rxjs:
specifier: ^7.8.1 specifier: ^7.8.1
version: 7.8.2 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: devDependencies:
'@nestjs/cli': '@nestjs/cli':
specifier: ^10.4.0 specifier: ^10.4.0
@@ -780,10 +789,17 @@ packages:
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'} 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': '@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'} engines: {node: '>=12'}
'@dabh/diagnostics@2.0.8':
resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
'@dcloudio/types@3.4.30': '@dcloudio/types@3.4.30':
resolution: {integrity: sha512-qUSRM4x8ekdtZHpYaz0gUd2+wDBeCo3jWmhc+hqX8hUx0KoModW8dI7FJQYMfMGRF2F/gbvy9LWUyV50M7VF6g==} resolution: {integrity: sha512-qUSRM4x8ekdtZHpYaz0gUd2+wDBeCo3jWmhc+hqX8hUx0KoModW8dI7FJQYMfMGRF2F/gbvy9LWUyV50M7VF6g==}
@@ -1813,6 +1829,9 @@ packages:
'@sinonjs/fake-timers@10.3.0': '@sinonjs/fake-timers@10.3.0':
resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 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': '@tokenizer/inflate@0.2.7':
resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -1931,6 +1950,9 @@ packages:
'@types/stack-utils@2.0.3': '@types/stack-utils@2.0.3':
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
'@types/triple-beam@1.3.5':
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
'@types/validator@13.15.10': '@types/validator@13.15.10':
resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
@@ -2211,6 +2233,9 @@ packages:
asap@2.0.6: asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
asynckit@0.4.0: asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
@@ -2453,9 +2478,25 @@ packages:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'} 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: color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 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: combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -2697,6 +2738,9 @@ packages:
emoji-regex@9.2.2: emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
enabled@2.0.0:
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
encodeurl@2.0.0: encodeurl@2.0.0:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -2851,6 +2895,9 @@ packages:
fb-watchman@2.0.2: fb-watchman@2.0.2:
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
fflate@0.8.2: fflate@0.8.2:
resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
@@ -2858,6 +2905,9 @@ packages:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'} engines: {node: '>=8'}
file-stream-rotator@0.6.1:
resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==}
file-type@20.4.1: file-type@20.4.1:
resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -2878,6 +2928,9 @@ packages:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'} engines: {node: '>=8'}
fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
follow-redirects@1.15.11: follow-redirects@1.15.11:
resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
@@ -2971,6 +3024,7 @@ packages:
glob@10.4.5: glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 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 hasBin: true
glob@7.2.3: glob@7.2.3:
@@ -3377,6 +3431,9 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'} engines: {node: '>=6'}
kuler@2.0.0:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
lcid@3.1.1: lcid@3.1.1:
resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -3465,6 +3522,10 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'} 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: lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@@ -3583,6 +3644,9 @@ packages:
module-alias@2.3.4: module-alias@2.3.4:
resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==} resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==}
moment@2.30.1:
resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
ms@2.0.0: ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -3618,6 +3682,12 @@ packages:
neo-async@2.6.2: neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 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: node-abort-controller@3.1.1:
resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
@@ -3654,6 +3724,10 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
object-inspect@1.13.4: object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -3668,6 +3742,9 @@ packages:
once@1.4.0: once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
one-time@1.0.0:
resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
onetime@5.1.2: onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -4078,6 +4155,10 @@ packages:
safe-buffer@5.2.1: safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 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: safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -4184,6 +4265,9 @@ packages:
sprintf-js@1.0.3: sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
stack-utils@2.0.6: stack-utils@2.0.6:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -4301,6 +4385,9 @@ packages:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'} engines: {node: '>=8'}
text-hex@1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
through@2.3.8: through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
@@ -4336,6 +4423,10 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true 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: ts-jest@29.4.9:
resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==}
engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
@@ -4631,6 +4722,20 @@ packages:
engines: {node: '>= 8'} engines: {node: '>= 8'}
hasBin: true 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: wordwrap@1.0.0:
resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
@@ -5508,10 +5613,18 @@ snapshots:
'@colors/colors@1.5.0': '@colors/colors@1.5.0':
optional: true optional: true
'@colors/colors@1.6.0': {}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.9 '@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/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))': '@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: dependencies:
'@sinonjs/commons': 3.0.1 '@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': '@tokenizer/inflate@0.2.7':
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
@@ -7089,6 +7207,8 @@ snapshots:
'@types/stack-utils@2.0.3': {} '@types/stack-utils@2.0.3': {}
'@types/triple-beam@1.3.5': {}
'@types/validator@13.15.10': {} '@types/validator@13.15.10': {}
'@types/yargs-parser@21.0.3': {} '@types/yargs-parser@21.0.3': {}
@@ -7458,6 +7578,8 @@ snapshots:
asap@2.0.6: {} asap@2.0.6: {}
async@3.2.6: {}
asynckit@0.4.0: {} asynckit@0.4.0: {}
autoprefixer@10.4.27(postcss@8.5.8): autoprefixer@10.4.27(postcss@8.5.8):
@@ -7740,8 +7862,23 @@ snapshots:
dependencies: dependencies:
color-name: 1.1.4 color-name: 1.1.4
color-convert@3.1.3:
dependencies:
color-name: 2.1.0
color-name@1.1.4: {} 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: combined-stream@1.0.8:
dependencies: dependencies:
delayed-stream: 1.0.0 delayed-stream: 1.0.0
@@ -7939,6 +8076,8 @@ snapshots:
emoji-regex@9.2.2: {} emoji-regex@9.2.2: {}
enabled@2.0.0: {}
encodeurl@2.0.0: {} encodeurl@2.0.0: {}
enhanced-resolve@5.20.1: enhanced-resolve@5.20.1:
@@ -8152,12 +8291,18 @@ snapshots:
dependencies: dependencies:
bser: 2.1.1 bser: 2.1.1
fecha@4.2.3: {}
fflate@0.8.2: {} fflate@0.8.2: {}
figures@3.2.0: figures@3.2.0:
dependencies: dependencies:
escape-string-regexp: 1.0.5 escape-string-regexp: 1.0.5
file-stream-rotator@0.6.1:
dependencies:
moment: 2.30.1
file-type@20.4.1: file-type@20.4.1:
dependencies: dependencies:
'@tokenizer/inflate': 0.2.7 '@tokenizer/inflate': 0.2.7
@@ -8190,6 +8335,8 @@ snapshots:
locate-path: 5.0.0 locate-path: 5.0.0
path-exists: 4.0.0 path-exists: 4.0.0
fn.name@1.1.0: {}
follow-redirects@1.15.11: {} follow-redirects@1.15.11: {}
foreground-child@3.3.1: foreground-child@3.3.1:
@@ -8922,6 +9069,8 @@ snapshots:
kleur@3.0.3: {} kleur@3.0.3: {}
kuler@2.0.0: {}
lcid@3.1.1: lcid@3.1.1:
dependencies: dependencies:
invert-kv: 3.0.1 invert-kv: 3.0.1
@@ -8996,6 +9145,15 @@ snapshots:
chalk: 4.1.2 chalk: 4.1.2
is-unicode-supported: 0.1.0 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@10.4.3: {}
lru-cache@5.1.1: lru-cache@5.1.1:
@@ -9090,6 +9248,8 @@ snapshots:
module-alias@2.3.4: {} module-alias@2.3.4: {}
moment@2.30.1: {}
ms@2.0.0: {} ms@2.0.0: {}
ms@2.1.3: {} ms@2.1.3: {}
@@ -9118,6 +9278,12 @@ snapshots:
neo-async@2.6.2: {} 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-abort-controller@3.1.1: {}
node-addon-api@7.1.1: node-addon-api@7.1.1:
@@ -9143,6 +9309,8 @@ snapshots:
object-assign@4.1.1: {} object-assign@4.1.1: {}
object-hash@3.0.0: {}
object-inspect@1.13.4: {} object-inspect@1.13.4: {}
omggif@1.0.10: {} omggif@1.0.10: {}
@@ -9155,6 +9323,10 @@ snapshots:
dependencies: dependencies:
wrappy: 1.0.2 wrappy: 1.0.2
one-time@1.0.0:
dependencies:
fn.name: 1.1.0
onetime@5.1.2: onetime@5.1.2:
dependencies: dependencies:
mimic-fn: 2.1.0 mimic-fn: 2.1.0
@@ -9565,6 +9737,8 @@ snapshots:
safe-buffer@5.2.1: {} safe-buffer@5.2.1: {}
safe-stable-stringify@2.5.0: {}
safer-buffer@2.1.2: {} safer-buffer@2.1.2: {}
sass@1.98.0: sass@1.98.0:
@@ -9694,6 +9868,8 @@ snapshots:
sprintf-js@1.0.3: {} sprintf-js@1.0.3: {}
stack-trace@0.0.10: {}
stack-utils@2.0.6: stack-utils@2.0.6:
dependencies: dependencies:
escape-string-regexp: 2.0.0 escape-string-regexp: 2.0.0
@@ -9808,6 +9984,8 @@ snapshots:
glob: 7.2.3 glob: 7.2.3
minimatch: 3.1.5 minimatch: 3.1.5
text-hex@1.0.0: {}
through@2.3.8: {} through@2.3.8: {}
timm@1.7.1: {} timm@1.7.1: {}
@@ -9836,6 +10014,8 @@ snapshots:
tree-kill@1.2.2: {} 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): 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: dependencies:
bs-logger: 0.2.6 bs-logger: 0.2.6
@@ -10104,6 +10284,34 @@ snapshots:
dependencies: dependencies:
isexe: 2.0.0 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: {} wordwrap@1.0.0: {}
wrap-ansi@6.2.0: wrap-ansi@6.2.0: