- 로그인 이후 access/refresh token 생성 및 반환 로직 구현
This commit is contained in:
@@ -1,6 +1,3 @@
|
|||||||
# Nestjs 서버 포트
|
|
||||||
PORT=3000
|
|
||||||
|
|
||||||
# Gmail SMTP 설정
|
# Gmail SMTP 설정
|
||||||
GMAIL_USER=bkd.scheduler@gmail.com
|
GMAIL_USER=bkd.scheduler@gmail.com
|
||||||
GMAIL_PASS= # 앱 비밀번호 또는 OAuth2 토큰
|
GMAIL_PASS= # 앱 비밀번호 또는 OAuth2 토큰
|
||||||
@@ -13,3 +10,5 @@ SMTP_AUTH=true
|
|||||||
SMTP_STARTTLS_ENABLE=true
|
SMTP_STARTTLS_ENABLE=true
|
||||||
SMTP_STARTTLS_REQUIRED=true
|
SMTP_STARTTLS_REQUIRED=true
|
||||||
SMTP_AUTH_MECHANISMS=XOAUTH2
|
SMTP_AUTH_MECHANISMS=XOAUTH2
|
||||||
|
|
||||||
|
JWT_SECRET=96612b08364bbd9f275f29f86d39c18225e3cb3f31551434d5a84a88f5b01e627b5aafac902e0769bda4f1574b2f84ffb26e659b1a672182015a180c086cb911
|
||||||
|
|||||||
2
.env.dev
2
.env.dev
@@ -1,3 +1,5 @@
|
|||||||
|
PORT=8088
|
||||||
|
|
||||||
# PostgreSQL 설정
|
# PostgreSQL 설정
|
||||||
PGHOST=bkdhome.p-e.kr
|
PGHOST=bkdhome.p-e.kr
|
||||||
PGPORT=15454
|
PGPORT=15454
|
||||||
|
|||||||
11
.env.local
11
.env.local
@@ -1,12 +1,11 @@
|
|||||||
|
PORT=3000
|
||||||
|
|
||||||
# PostgreSQL 설정
|
# PostgreSQL 설정
|
||||||
PGHOST=bkdhome.p-e.kr
|
|
||||||
PGPORT=15454
|
|
||||||
PGDATABASE=scheduler
|
|
||||||
PGUSER=baekyangdan
|
PGUSER=baekyangdan
|
||||||
PGPASSWORD=qwas745478!
|
PGPASSWORD=qwas745478!
|
||||||
PG_DATABASE_URL=postgres://192.168.219.107:5454/scheduler
|
PG_DATABASE_URL=postgres://192.168.219.103:5454/scheduler
|
||||||
|
|
||||||
# Redis 설정
|
# Redis 설정
|
||||||
RD_HOST=bkdhome.p-e.kr
|
RD_HOST=192.168.219.103
|
||||||
RD_PORT=6779
|
RD_PORT=6779
|
||||||
RD_URL=redis://192.168.219.107:6779
|
RD_URL=redis://192.168.219.103:6779
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
PORT=3000
|
||||||
|
|
||||||
# PostgreSQL 설정
|
# PostgreSQL 설정
|
||||||
PGHOST=db
|
PGHOST=db
|
||||||
PGPORT=5454
|
PGPORT=5454
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://json.schemastore.org/nest-cli",
|
"$schema": "https://json.schemastore.org/nest-cli",
|
||||||
"collection": "@nestjs/schematics",
|
"collection": "@nestjs/schematics",
|
||||||
"sourceRoot": "src",
|
"sourceRoot": "src"
|
||||||
"compilerOptions": {
|
|
||||||
"deleteOutDir": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
17
package.json
17
package.json
@@ -6,13 +6,15 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "NODE_ENV=prod nest build",
|
"build": "cross-env NODE_ENV=prod nest build",
|
||||||
|
"build:local": "cross-env NODE_ENV=local nest build",
|
||||||
|
"build:dev": "cross-env NODE_ENV=dev nest build",
|
||||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||||
"start": "nest start",
|
"start": "nest start",
|
||||||
"start:local": "NODE_ENV=local nest start --watch",
|
"start:local": "cross-env NODE_ENV=local nest start --watch",
|
||||||
"start:dev": "NODE_ENV=dev nest start --watch",
|
"start:dev": "cross-env NODE_ENV=dev nest start --watch",
|
||||||
"start:debug": "nest start --debug --watch",
|
"start:debug": "nest start --debug --watch",
|
||||||
"start:prod": "NODE_ENV=prod node dist/main",
|
"start:prod": "cross-env NODE_ENV=prod node dist/main",
|
||||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --watch",
|
||||||
@@ -26,6 +28,8 @@
|
|||||||
"@nestjs/common": "^11.0.1",
|
"@nestjs/common": "^11.0.1",
|
||||||
"@nestjs/config": "^4.0.2",
|
"@nestjs/config": "^4.0.2",
|
||||||
"@nestjs/core": "^11.0.1",
|
"@nestjs/core": "^11.0.1",
|
||||||
|
"@nestjs/jwt": "^11.0.1",
|
||||||
|
"@nestjs/passport": "^11.0.5",
|
||||||
"@nestjs/platform-express": "^11.0.1",
|
"@nestjs/platform-express": "^11.0.1",
|
||||||
"bcrypt": "^6.0.0",
|
"bcrypt": "^6.0.0",
|
||||||
"dotenv": "^17.2.3",
|
"dotenv": "^17.2.3",
|
||||||
@@ -34,6 +38,8 @@
|
|||||||
"googleapis": "^166.0.0",
|
"googleapis": "^166.0.0",
|
||||||
"ioredis": "^5.8.2",
|
"ioredis": "^5.8.2",
|
||||||
"nodemailer": "^7.0.10",
|
"nodemailer": "^7.0.10",
|
||||||
|
"passport": "^0.7.0",
|
||||||
|
"passport-jwt": "^4.0.1",
|
||||||
"pg": "^8.16.3",
|
"pg": "^8.16.3",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rxjs": "^7.8.1"
|
"rxjs": "^7.8.1"
|
||||||
@@ -50,8 +56,11 @@
|
|||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/node": "^22.10.7",
|
"@types/node": "^22.10.7",
|
||||||
"@types/nodemailer": "^7.0.4",
|
"@types/nodemailer": "^7.0.4",
|
||||||
|
"@types/passport": "^0",
|
||||||
|
"@types/passport-jwt": "^4.0.1",
|
||||||
"@types/pg": "^8.15.6",
|
"@types/pg": "^8.15.6",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
|
"cross-env": "^10.1.0",
|
||||||
"eslint": "^9.18.0",
|
"eslint": "^9.18.0",
|
||||||
"eslint-config-prettier": "^10.0.1",
|
"eslint-config-prettier": "^10.0.1",
|
||||||
"eslint-plugin-prettier": "^5.2.2",
|
"eslint-plugin-prettier": "^5.2.2",
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import { Module } from "@nestjs/common";
|
import { Module } from "@nestjs/common";
|
||||||
import { ConfigModule } from '@nestjs/config';
|
import { ConfigModule } from '@nestjs/config';
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
ConfigModule.forRoot({
|
ConfigModule.forRoot({
|
||||||
isGlobal: true,
|
isGlobal: true,
|
||||||
envFilePath: [
|
envFilePath: [
|
||||||
'.env.common',
|
`.env.${process.env.NODE_ENV}`,
|
||||||
`.env.${process.env.NODE_ENV}`
|
'.env.common'
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
import { NestFactory } from '@nestjs/core';
|
import { NestFactory } from '@nestjs/core';
|
||||||
import { AppModule } from './app.module';
|
import { AppModule } from './app.module';
|
||||||
import dotenv from 'dotenv';
|
|
||||||
|
|
||||||
dotenv.config();
|
|
||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create(AppModule);
|
const app = await NestFactory.create(AppModule);
|
||||||
@@ -25,7 +22,7 @@ async function bootstrap() {
|
|||||||
|
|
||||||
app.enableShutdownHooks();
|
app.enableShutdownHooks();
|
||||||
|
|
||||||
await app.listen(process.env.PORT ?? 3000);
|
await app.listen(process.env.PORT ?? 3000, () => { process.env.NODE_ENV !== 'prod' && console.log(`servier is running on ${process.env.PORT}`) });
|
||||||
|
|
||||||
}
|
}
|
||||||
bootstrap();
|
bootstrap();
|
||||||
|
|||||||
24
src/middleware/auth/auth.module.ts
Normal file
24
src/middleware/auth/auth.module.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { forwardRef, Module } from '@nestjs/common';
|
||||||
|
import { AuthService } from './auth.service';
|
||||||
|
import { JwtStrategy } from './jwt.strategy';
|
||||||
|
import { JwtModule } from '@nestjs/jwt';
|
||||||
|
import { ConfigModule, ConfigService } from '@nestjs/config';
|
||||||
|
import { AccountModule } from 'src/modules/account/account.module';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [
|
||||||
|
ConfigModule,
|
||||||
|
JwtModule.registerAsync({
|
||||||
|
imports: [ConfigModule],
|
||||||
|
inject: [ConfigService],
|
||||||
|
useFactory: (config: ConfigService) => ({
|
||||||
|
secret: config.get<string>('JWT_SECRET')!,
|
||||||
|
signOptions: { expiresIn: '1h' }
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
forwardRef(() => AccountModule)
|
||||||
|
],
|
||||||
|
providers: [AuthService, JwtStrategy],
|
||||||
|
exports: [AuthService]
|
||||||
|
})
|
||||||
|
export class AuthModule{}
|
||||||
23
src/middleware/auth/auth.service.ts
Normal file
23
src/middleware/auth/auth.service.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { Injectable, UnauthorizedException } from '@nestjs/common';
|
||||||
|
import { JwtService } from '@nestjs/jwt';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class AuthService {
|
||||||
|
constructor(private readonly jwtService: JwtService) {}
|
||||||
|
|
||||||
|
generateTokens(payload: any) {
|
||||||
|
const accessToken = this.jwtService.sign(payload, { expiresIn: '1h' });
|
||||||
|
const refreshToken = this.jwtService.sign(payload, { expiresIn: '7d' });
|
||||||
|
|
||||||
|
return { accessToken, refreshToken };
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshTokens(refreshToken: string) {
|
||||||
|
try {
|
||||||
|
const payload = this.jwtService.verify(refreshToken);
|
||||||
|
return this.generateTokens(payload);
|
||||||
|
} catch (e) {
|
||||||
|
throw new UnauthorizedException('Invalid Refresh Token');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/middleware/auth/jwt.guard.ts
Normal file
5
src/middleware/auth/jwt.guard.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { AuthGuard } from '@nestjs/passport';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class JwtGuard extends AuthGuard('jwt') {}
|
||||||
27
src/middleware/auth/jwt.strategy.ts
Normal file
27
src/middleware/auth/jwt.strategy.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { Injectable, UnauthorizedException } from '@nestjs/common';
|
||||||
|
import { ConfigService } from '@nestjs/config';
|
||||||
|
import { JwtService } from '@nestjs/jwt';
|
||||||
|
import { PassportStrategy } from '@nestjs/passport';
|
||||||
|
import { ExtractJwt, Strategy } from 'passport-jwt';
|
||||||
|
import { AccountRepo } from 'src/modules/account/account.repo';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class JwtStrategy extends PassportStrategy(Strategy) {
|
||||||
|
constructor(
|
||||||
|
private readonly accountRepo: AccountRepo
|
||||||
|
, private readonly configService: ConfigService
|
||||||
|
, private readonly jwtService: JwtService
|
||||||
|
) {
|
||||||
|
super({
|
||||||
|
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
||||||
|
ignoreExpiration: false,
|
||||||
|
secretOrKey: configService.get<string>('JWT_SECRET')!
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async validate(payload: any) {
|
||||||
|
const account = await this.accountRepo.findById(payload.id);
|
||||||
|
if (!account || account.length < 1) throw new UnauthorizedException();
|
||||||
|
return account[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,8 +36,14 @@ export class AccountController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Post('signup')
|
@Post('signup')
|
||||||
async signup(@Body() body: SignupRequest): Promise<LoginResponse> {
|
async signup(@Body() body: SignupRequest): Promise<SignupResponse> {
|
||||||
const result = await this.accountService.signup(body);
|
const result = await this.accountService.signup(body);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Post('login')
|
||||||
|
async login(@Body() body: LoginRequest): Promise<LoginResponse> {
|
||||||
|
const result = await this.accountService.login(body);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Module } from "@nestjs/common";
|
import { forwardRef, Module } from "@nestjs/common";
|
||||||
import { AccountController } from "./account.controller";
|
import { AccountController } from "./account.controller";
|
||||||
import { AccountRepo } from "./account.repo";
|
import { AccountRepo } from "./account.repo";
|
||||||
import { AccountService } from "./account.service";
|
import { AccountService } from "./account.service";
|
||||||
|
import { AuthModule } from 'src/middleware/auth/auth.module';
|
||||||
@Module({
|
@Module({
|
||||||
|
imports: [forwardRef(() => AuthModule)],
|
||||||
controllers: [AccountController],
|
controllers: [AccountController],
|
||||||
providers: [AccountService, AccountRepo],
|
providers: [AccountService, AccountRepo],
|
||||||
exports: [AccountService, AccountRepo]
|
exports: [AccountService, AccountRepo]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Inject, Injectable } from "@nestjs/common";
|
import { Inject, Injectable } from "@nestjs/common";
|
||||||
import * as schema from "drizzle/schema";
|
import * as schema from "drizzle/schema";
|
||||||
import { countDistinct, and, eq } from 'drizzle-orm';
|
import { countDistinct, and, eq, not } from 'drizzle-orm';
|
||||||
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@@ -38,5 +38,36 @@ export class AccountRepo {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async
|
async login(
|
||||||
|
type: 'email' | 'accountId'
|
||||||
|
, id: string
|
||||||
|
) {
|
||||||
|
const condition = type === 'email'
|
||||||
|
? eq(schema.account.email, id)
|
||||||
|
: eq(schema.account.accountId, id);
|
||||||
|
return this
|
||||||
|
.db
|
||||||
|
.select()
|
||||||
|
.from(schema.account)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
condition,
|
||||||
|
eq(schema.account.isDeleted, false),
|
||||||
|
eq(schema.account.status, 'active')
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async findById(id: string) {
|
||||||
|
return await this
|
||||||
|
.db
|
||||||
|
.select()
|
||||||
|
.from(schema.account)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
eq(schema.account.id, id),
|
||||||
|
eq(schema.account.isDeleted, false)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -5,12 +5,14 @@ import { MailerService } from "src/util/mailer/mailer.service";
|
|||||||
import { Generator } from "src/util/generator";
|
import { Generator } from "src/util/generator";
|
||||||
import Redis from "ioredis";
|
import Redis from "ioredis";
|
||||||
import { Converter } from "src/util/converter";
|
import { Converter } from "src/util/converter";
|
||||||
|
import { AuthService } from "src/middleware/auth/auth.service";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AccountService {
|
export class AccountService {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly accountRepo: AccountRepo
|
private readonly accountRepo: AccountRepo
|
||||||
, private readonly mailerService: MailerService
|
, private readonly mailerService: MailerService
|
||||||
|
, private readonly authService: AuthService
|
||||||
, @Inject("REDIS") private readonly redis: Redis
|
, @Inject("REDIS") private readonly redis: Redis
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@@ -70,4 +72,41 @@ export class AccountService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async login(data: DTO.LoginRequest): Promise<DTO.LoginResponse> {
|
||||||
|
const { type, id, password } = data;
|
||||||
|
const queryResult = await this.accountRepo.login(type, id);
|
||||||
|
const typeValue = type === 'email' ? '이메일' : '아이디';
|
||||||
|
console.log(queryResult);
|
||||||
|
if (!queryResult || (queryResult.length < 1)) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message: `존재하지 않는 ${typeValue} 입니다.`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const hashedPassword = queryResult[0].password;
|
||||||
|
const isPasswordMatch = Converter.comparePassword(password, hashedPassword);
|
||||||
|
if (!isPasswordMatch) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message: `비밀번호가 맞지 않습니다.`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const { id, accountId, name, nickname, email, status, isDeleted, birthday } = queryResult[0];
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
id, accountId, name, nickname, email, status, isDeleted, birthday
|
||||||
|
};
|
||||||
|
|
||||||
|
const { accessToken, refreshToken } = this.authService.generateTokens(payload);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
accessToken: accessToken,
|
||||||
|
refreshToken: refreshToken
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
export class LoginResponseDto {
|
export class LoginResponseDto {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
|
accessToken?: string;
|
||||||
|
refreshToken?: string;
|
||||||
message?: string;
|
message?: string;
|
||||||
error?: string;
|
error?: string;
|
||||||
}
|
}
|
||||||
@@ -2,8 +2,10 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"noEmitOnError": true,
|
"noEmitOnError": true,
|
||||||
"sourceMap": false,
|
"sourceMap": false,
|
||||||
"incremental": true,
|
"incremental": false,
|
||||||
"tsBuildInfoFile": ".tsbuildinfo"
|
"noEmit": false,
|
||||||
|
"tsBuildInfoFile": ".tsbuildinfo",
|
||||||
|
"outDir": "./dist"
|
||||||
},
|
},
|
||||||
"extends": "./tsconfig.json",
|
"extends": "./tsconfig.json",
|
||||||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
||||||
|
|||||||
@@ -14,12 +14,13 @@
|
|||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"baseUrl": "./",
|
"baseUrl": "./",
|
||||||
"incremental": true,
|
"incremental": false,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"strictNullChecks": true,
|
"strictNullChecks": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"noImplicitAny": false,
|
"noImplicitAny": false,
|
||||||
"strictBindCallApply": false,
|
"strictBindCallApply": false,
|
||||||
"noFallthroughCasesInSwitch": false
|
"noFallthroughCasesInSwitch": false,
|
||||||
|
"noEmit": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
238
yarn.lock
238
yarn.lock
@@ -1064,6 +1064,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@epic-web/invariant@npm:^1.0.0":
|
||||||
|
version: 1.0.0
|
||||||
|
resolution: "@epic-web/invariant@npm:1.0.0"
|
||||||
|
checksum: 10c0/72dbeb026e4e4eb3bc9c65739b91408ca77ab7d603a2494fa2eff3790ec22892c4caba751cffdf30f5ccf0e7ba79c1e9c96cf0a357404b9432bf1365baac23ca
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild-kit/core-utils@npm:^3.3.2":
|
"@esbuild-kit/core-utils@npm:^3.3.2":
|
||||||
version: 3.3.2
|
version: 3.3.2
|
||||||
resolution: "@esbuild-kit/core-utils@npm:3.3.2"
|
resolution: "@esbuild-kit/core-utils@npm:3.3.2"
|
||||||
@@ -2341,6 +2348,28 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@nestjs/jwt@npm:^11.0.1":
|
||||||
|
version: 11.0.1
|
||||||
|
resolution: "@nestjs/jwt@npm:11.0.1"
|
||||||
|
dependencies:
|
||||||
|
"@types/jsonwebtoken": "npm:9.0.10"
|
||||||
|
jsonwebtoken: "npm:9.0.2"
|
||||||
|
peerDependencies:
|
||||||
|
"@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
|
||||||
|
checksum: 10c0/9514327aefb9570e2526bb68e84180330e751a66646f73f430e89f4980ab4d2c3dcfd6162fc7b2bbc60259a0bc1cba03a00e771799abc2796a8324f233f47b82
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@nestjs/passport@npm:^11.0.5":
|
||||||
|
version: 11.0.5
|
||||||
|
resolution: "@nestjs/passport@npm:11.0.5"
|
||||||
|
peerDependencies:
|
||||||
|
"@nestjs/common": ^10.0.0 || ^11.0.0
|
||||||
|
passport: ^0.5.0 || ^0.6.0 || ^0.7.0
|
||||||
|
checksum: 10c0/24175f6791abf02b70c3c0705ce56fefd3981fdece0da7e58325f790ce71aa6932b31a87a2ceaa52b6d9d8edab3a7c049f6081e4b4d59bcdfcaa00383b64ae02
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@nestjs/platform-express@npm:^11.0.1":
|
"@nestjs/platform-express@npm:^11.0.1":
|
||||||
version: 11.1.9
|
version: 11.1.9
|
||||||
resolution: "@nestjs/platform-express@npm:11.1.9"
|
resolution: "@nestjs/platform-express@npm:11.1.9"
|
||||||
@@ -3165,7 +3194,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/express@npm:^5.0.0":
|
"@types/express@npm:*, @types/express@npm:^5.0.0":
|
||||||
version: 5.0.5
|
version: 5.0.5
|
||||||
resolution: "@types/express@npm:5.0.5"
|
resolution: "@types/express@npm:5.0.5"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3234,6 +3263,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/jsonwebtoken@npm:*, @types/jsonwebtoken@npm:9.0.10":
|
||||||
|
version: 9.0.10
|
||||||
|
resolution: "@types/jsonwebtoken@npm:9.0.10"
|
||||||
|
dependencies:
|
||||||
|
"@types/ms": "npm:*"
|
||||||
|
"@types/node": "npm:*"
|
||||||
|
checksum: 10c0/0688ac8fb75f809201cb7e18a12b9d80ce539cb9dd27e1b01e11807cb1a337059e899b8ee3abc3f2c9417f02e363a3069d9eab9ef9724b1da1f0e10713514f94
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@types/methods@npm:^1.1.4":
|
"@types/methods@npm:^1.1.4":
|
||||||
version: 1.1.4
|
version: 1.1.4
|
||||||
resolution: "@types/methods@npm:1.1.4"
|
resolution: "@types/methods@npm:1.1.4"
|
||||||
@@ -3248,6 +3287,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/ms@npm:*":
|
||||||
|
version: 2.1.0
|
||||||
|
resolution: "@types/ms@npm:2.1.0"
|
||||||
|
checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@types/node@npm:*":
|
"@types/node@npm:*":
|
||||||
version: 24.10.1
|
version: 24.10.1
|
||||||
resolution: "@types/node@npm:24.10.1"
|
resolution: "@types/node@npm:24.10.1"
|
||||||
@@ -3276,6 +3322,44 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/passport-jwt@npm:^4.0.1":
|
||||||
|
version: 4.0.1
|
||||||
|
resolution: "@types/passport-jwt@npm:4.0.1"
|
||||||
|
dependencies:
|
||||||
|
"@types/jsonwebtoken": "npm:*"
|
||||||
|
"@types/passport-strategy": "npm:*"
|
||||||
|
checksum: 10c0/0ced0eaa7bb379d674821108d9bc6758223f1a5f2b9790ec78d3eaaccce6a58a424cf8ed22b53d813740ec53d929e21d92cf794ef0fb30c732866750763c0d7a
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/passport-strategy@npm:*":
|
||||||
|
version: 0.2.38
|
||||||
|
resolution: "@types/passport-strategy@npm:0.2.38"
|
||||||
|
dependencies:
|
||||||
|
"@types/express": "npm:*"
|
||||||
|
"@types/passport": "npm:*"
|
||||||
|
checksum: 10c0/d7d2b1782a0845bd8914250aa9213a23c8d9c2225db46d854b77f2bf0129a789f46d4a5e9ad336eca277fc7e0a051c0a2942da5c864e7c6710763f102d9d4295
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/passport@npm:*":
|
||||||
|
version: 1.0.17
|
||||||
|
resolution: "@types/passport@npm:1.0.17"
|
||||||
|
dependencies:
|
||||||
|
"@types/express": "npm:*"
|
||||||
|
checksum: 10c0/09039429a9178117a80880c4e7d437abc83216eac5e0c97bc6f14a03a59193386cff484931dc880693f8b13a512c366ef7a51ecd8cc1a63f17366be68161f633
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/passport@npm:^0":
|
||||||
|
version: 0.4.7
|
||||||
|
resolution: "@types/passport@npm:0.4.7"
|
||||||
|
dependencies:
|
||||||
|
"@types/express": "npm:*"
|
||||||
|
checksum: 10c0/58ca21800b7910385961b7a3dc9071fc9db6223242b96ff88d16c9d004ce7173524e7c17c63363595565af3f85ad932ee301efc8cc3e378bea172eebc9e07703
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@types/pg@npm:^8.15.6":
|
"@types/pg@npm:^8.15.6":
|
||||||
version: 8.15.6
|
version: 8.15.6
|
||||||
resolution: "@types/pg@npm:8.15.6"
|
resolution: "@types/pg@npm:8.15.6"
|
||||||
@@ -4175,6 +4259,8 @@ __metadata:
|
|||||||
"@nestjs/common": "npm:^11.0.1"
|
"@nestjs/common": "npm:^11.0.1"
|
||||||
"@nestjs/config": "npm:^4.0.2"
|
"@nestjs/config": "npm:^4.0.2"
|
||||||
"@nestjs/core": "npm:^11.0.1"
|
"@nestjs/core": "npm:^11.0.1"
|
||||||
|
"@nestjs/jwt": "npm:^11.0.1"
|
||||||
|
"@nestjs/passport": "npm:^11.0.5"
|
||||||
"@nestjs/platform-express": "npm:^11.0.1"
|
"@nestjs/platform-express": "npm:^11.0.1"
|
||||||
"@nestjs/schematics": "npm:^11.0.0"
|
"@nestjs/schematics": "npm:^11.0.0"
|
||||||
"@nestjs/testing": "npm:^11.0.1"
|
"@nestjs/testing": "npm:^11.0.1"
|
||||||
@@ -4184,9 +4270,12 @@ __metadata:
|
|||||||
"@types/jest": "npm:^30.0.0"
|
"@types/jest": "npm:^30.0.0"
|
||||||
"@types/node": "npm:^22.10.7"
|
"@types/node": "npm:^22.10.7"
|
||||||
"@types/nodemailer": "npm:^7.0.4"
|
"@types/nodemailer": "npm:^7.0.4"
|
||||||
|
"@types/passport": "npm:^0"
|
||||||
|
"@types/passport-jwt": "npm:^4.0.1"
|
||||||
"@types/pg": "npm:^8.15.6"
|
"@types/pg": "npm:^8.15.6"
|
||||||
"@types/supertest": "npm:^6.0.2"
|
"@types/supertest": "npm:^6.0.2"
|
||||||
bcrypt: "npm:^6.0.0"
|
bcrypt: "npm:^6.0.0"
|
||||||
|
cross-env: "npm:^10.1.0"
|
||||||
dotenv: "npm:^17.2.3"
|
dotenv: "npm:^17.2.3"
|
||||||
drizzle-kit: "npm:^0.31.7"
|
drizzle-kit: "npm:^0.31.7"
|
||||||
drizzle-orm: "npm:^0.44.7"
|
drizzle-orm: "npm:^0.44.7"
|
||||||
@@ -4198,6 +4287,8 @@ __metadata:
|
|||||||
ioredis: "npm:^5.8.2"
|
ioredis: "npm:^5.8.2"
|
||||||
jest: "npm:^30.0.0"
|
jest: "npm:^30.0.0"
|
||||||
nodemailer: "npm:^7.0.10"
|
nodemailer: "npm:^7.0.10"
|
||||||
|
passport: "npm:^0.7.0"
|
||||||
|
passport-jwt: "npm:^4.0.1"
|
||||||
pg: "npm:^8.16.3"
|
pg: "npm:^8.16.3"
|
||||||
prettier: "npm:^3.4.2"
|
prettier: "npm:^3.4.2"
|
||||||
reflect-metadata: "npm:^0.2.2"
|
reflect-metadata: "npm:^0.2.2"
|
||||||
@@ -4759,6 +4850,19 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"cross-env@npm:^10.1.0":
|
||||||
|
version: 10.1.0
|
||||||
|
resolution: "cross-env@npm:10.1.0"
|
||||||
|
dependencies:
|
||||||
|
"@epic-web/invariant": "npm:^1.0.0"
|
||||||
|
cross-spawn: "npm:^7.0.6"
|
||||||
|
bin:
|
||||||
|
cross-env: dist/bin/cross-env.js
|
||||||
|
cross-env-shell: dist/bin/cross-env-shell.js
|
||||||
|
checksum: 10c0/834a862db456ba1fedf6c6da43436b123ae38f514fa286d6f0937c14fa83f13469f77f70f2812db041ae2d84f82bac627040b8686030aca27fbdf113dfa38b63
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6":
|
"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6":
|
||||||
version: 7.0.6
|
version: 7.0.6
|
||||||
resolution: "cross-spawn@npm:7.0.6"
|
resolution: "cross-spawn@npm:7.0.6"
|
||||||
@@ -7211,6 +7315,35 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"jsonwebtoken@npm:9.0.2, jsonwebtoken@npm:^9.0.0":
|
||||||
|
version: 9.0.2
|
||||||
|
resolution: "jsonwebtoken@npm:9.0.2"
|
||||||
|
dependencies:
|
||||||
|
jws: "npm:^3.2.2"
|
||||||
|
lodash.includes: "npm:^4.3.0"
|
||||||
|
lodash.isboolean: "npm:^3.0.3"
|
||||||
|
lodash.isinteger: "npm:^4.0.4"
|
||||||
|
lodash.isnumber: "npm:^3.0.3"
|
||||||
|
lodash.isplainobject: "npm:^4.0.6"
|
||||||
|
lodash.isstring: "npm:^4.0.1"
|
||||||
|
lodash.once: "npm:^4.0.0"
|
||||||
|
ms: "npm:^2.1.1"
|
||||||
|
semver: "npm:^7.5.4"
|
||||||
|
checksum: 10c0/d287a29814895e866db2e5a0209ce730cbc158441a0e5a70d5e940eb0d28ab7498c6bf45029cc8b479639bca94056e9a7f254e2cdb92a2f5750c7f358657a131
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"jwa@npm:^1.4.1":
|
||||||
|
version: 1.4.2
|
||||||
|
resolution: "jwa@npm:1.4.2"
|
||||||
|
dependencies:
|
||||||
|
buffer-equal-constant-time: "npm:^1.0.1"
|
||||||
|
ecdsa-sig-formatter: "npm:1.0.11"
|
||||||
|
safe-buffer: "npm:^5.0.1"
|
||||||
|
checksum: 10c0/210a544a42ca22203e8fc538835205155ba3af6a027753109f9258bdead33086bac3c25295af48ac1981f87f9c5f941bc8f70303670f54ea7dcaafb53993d92c
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"jwa@npm:^2.0.0":
|
"jwa@npm:^2.0.0":
|
||||||
version: 2.0.1
|
version: 2.0.1
|
||||||
resolution: "jwa@npm:2.0.1"
|
resolution: "jwa@npm:2.0.1"
|
||||||
@@ -7222,6 +7355,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"jws@npm:^3.2.2":
|
||||||
|
version: 3.2.2
|
||||||
|
resolution: "jws@npm:3.2.2"
|
||||||
|
dependencies:
|
||||||
|
jwa: "npm:^1.4.1"
|
||||||
|
safe-buffer: "npm:^5.0.1"
|
||||||
|
checksum: 10c0/e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"jws@npm:^4.0.0":
|
"jws@npm:^4.0.0":
|
||||||
version: 4.0.0
|
version: 4.0.0
|
||||||
resolution: "jws@npm:4.0.0"
|
resolution: "jws@npm:4.0.0"
|
||||||
@@ -7311,6 +7454,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.includes@npm:^4.3.0":
|
||||||
|
version: 4.3.0
|
||||||
|
resolution: "lodash.includes@npm:4.3.0"
|
||||||
|
checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"lodash.isarguments@npm:^3.1.0":
|
"lodash.isarguments@npm:^3.1.0":
|
||||||
version: 3.1.0
|
version: 3.1.0
|
||||||
resolution: "lodash.isarguments@npm:3.1.0"
|
resolution: "lodash.isarguments@npm:3.1.0"
|
||||||
@@ -7318,6 +7468,41 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.isboolean@npm:^3.0.3":
|
||||||
|
version: 3.0.3
|
||||||
|
resolution: "lodash.isboolean@npm:3.0.3"
|
||||||
|
checksum: 10c0/0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.isinteger@npm:^4.0.4":
|
||||||
|
version: 4.0.4
|
||||||
|
resolution: "lodash.isinteger@npm:4.0.4"
|
||||||
|
checksum: 10c0/4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.isnumber@npm:^3.0.3":
|
||||||
|
version: 3.0.3
|
||||||
|
resolution: "lodash.isnumber@npm:3.0.3"
|
||||||
|
checksum: 10c0/2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.isplainobject@npm:^4.0.6":
|
||||||
|
version: 4.0.6
|
||||||
|
resolution: "lodash.isplainobject@npm:4.0.6"
|
||||||
|
checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.isstring@npm:^4.0.1":
|
||||||
|
version: 4.0.1
|
||||||
|
resolution: "lodash.isstring@npm:4.0.1"
|
||||||
|
checksum: 10c0/09eaf980a283f9eef58ef95b30ec7fee61df4d6bf4aba3b5f096869cc58f24c9da17900febc8ffd67819b4e29de29793190e88dc96983db92d84c95fa85d1c92
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"lodash.memoize@npm:^4.1.2":
|
"lodash.memoize@npm:^4.1.2":
|
||||||
version: 4.1.2
|
version: 4.1.2
|
||||||
resolution: "lodash.memoize@npm:4.1.2"
|
resolution: "lodash.memoize@npm:4.1.2"
|
||||||
@@ -7332,6 +7517,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"lodash.once@npm:^4.0.0":
|
||||||
|
version: 4.1.1
|
||||||
|
resolution: "lodash.once@npm:4.1.1"
|
||||||
|
checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"lodash@npm:4.17.21, lodash@npm:^4.17.21":
|
"lodash@npm:4.17.21, lodash@npm:^4.17.21":
|
||||||
version: 4.17.21
|
version: 4.17.21
|
||||||
resolution: "lodash@npm:4.17.21"
|
resolution: "lodash@npm:4.17.21"
|
||||||
@@ -7662,7 +7854,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ms@npm:^2.1.3":
|
"ms@npm:^2.1.1, ms@npm:^2.1.3":
|
||||||
version: 2.1.3
|
version: 2.1.3
|
||||||
resolution: "ms@npm:2.1.3"
|
resolution: "ms@npm:2.1.3"
|
||||||
checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
|
checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
|
||||||
@@ -8000,6 +8192,34 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"passport-jwt@npm:^4.0.1":
|
||||||
|
version: 4.0.1
|
||||||
|
resolution: "passport-jwt@npm:4.0.1"
|
||||||
|
dependencies:
|
||||||
|
jsonwebtoken: "npm:^9.0.0"
|
||||||
|
passport-strategy: "npm:^1.0.0"
|
||||||
|
checksum: 10c0/d7e2b472d399f596a1db31310f8e63d10777ab7468b9a378c964156e5f0a772598b007417356ead578cfdaf60dc2bba39a55f0033ca865186fdb2a2b198e2e7e
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"passport-strategy@npm:1.x.x, passport-strategy@npm:^1.0.0":
|
||||||
|
version: 1.0.0
|
||||||
|
resolution: "passport-strategy@npm:1.0.0"
|
||||||
|
checksum: 10c0/cf4cd32e1bf2538a239651581292fbb91ccc83973cde47089f00d2014c24bed63d3e65af21da8ddef649a8896e089eb9c3ac9ca639f36c797654ae9ee4ed65e1
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"passport@npm:^0.7.0":
|
||||||
|
version: 0.7.0
|
||||||
|
resolution: "passport@npm:0.7.0"
|
||||||
|
dependencies:
|
||||||
|
passport-strategy: "npm:1.x.x"
|
||||||
|
pause: "npm:0.0.1"
|
||||||
|
utils-merge: "npm:^1.0.1"
|
||||||
|
checksum: 10c0/08c940b86e4adbfe43e753f8097300a5a9d1ce9a3aa002d7b12d27770943a1a87202c54597c0f04dbfd4117d67de76303433577512fc19c7e364fec37b0d3fc5
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"path-exists@npm:^4.0.0":
|
"path-exists@npm:^4.0.0":
|
||||||
version: 4.0.0
|
version: 4.0.0
|
||||||
resolution: "path-exists@npm:4.0.0"
|
resolution: "path-exists@npm:4.0.0"
|
||||||
@@ -8055,6 +8275,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"pause@npm:0.0.1":
|
||||||
|
version: 0.0.1
|
||||||
|
resolution: "pause@npm:0.0.1"
|
||||||
|
checksum: 10c0/f362655dfa7f44b946302c5a033148852ed5d05f744bd848b1c7eae6a543f743e79c7751ee896ba519fd802affdf239a358bb2ea5ca1b1c1e4e916279f83ab75
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"pg-cloudflare@npm:^1.2.7":
|
"pg-cloudflare@npm:^1.2.7":
|
||||||
version: 1.2.7
|
version: 1.2.7
|
||||||
resolution: "pg-cloudflare@npm:1.2.7"
|
resolution: "pg-cloudflare@npm:1.2.7"
|
||||||
@@ -9497,6 +9724,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"utils-merge@npm:^1.0.1":
|
||||||
|
version: 1.0.1
|
||||||
|
resolution: "utils-merge@npm:1.0.1"
|
||||||
|
checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"v8-compile-cache-lib@npm:^3.0.1":
|
"v8-compile-cache-lib@npm:^3.0.1":
|
||||||
version: 3.0.1
|
version: 3.0.1
|
||||||
resolution: "v8-compile-cache-lib@npm:3.0.1"
|
resolution: "v8-compile-cache-lib@npm:3.0.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user