From 4dc5fc6cca017d372a1754ab8e14a5d66525ac83 Mon Sep 17 00:00:00 2001 From: janing Date: Sun, 14 Dec 2025 22:36:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=96=E7=95=8C=E3=80=81=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E3=80=81=E5=8A=A0=E5=85=A5=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.github/instructions/development-tasks.md | 98 ++ .../instructions/workspace.instructions.md | 4 + server/.gitignore | 3 + server/.mocharc.js | 11 + server/.vscode/launch.json | 30 + server/.vscode/settings.json | 3 + server/Dockerfile | 30 + server/README.md | 31 + server/package.json | 27 + server/src/api/ApiLogin.ts | 74 + server/src/api/ApiMove.ts | 86 ++ server/src/api/ApiSend.ts | 26 + server/src/config/world.config.ts | 23 + server/src/index.ts | 28 + server/src/managers/PlayerManager.ts | 149 ++ server/src/managers/WorldManager.ts | 79 + server/src/models/Player.ts | 71 + server/src/models/Position.ts | 37 + server/src/models/World.ts | 37 + server/src/shared/protocols/MsgChat.ts | 7 + server/src/shared/protocols/MsgPlayerJoin.ts | 22 + server/src/shared/protocols/MsgPlayerMove.ts | 19 + server/src/shared/protocols/PtlLogin.ts | 61 + server/src/shared/protocols/PtlMove.ts | 26 + server/src/shared/protocols/PtlSend.ts | 10 + server/src/shared/protocols/base.ts | 23 + server/src/shared/protocols/serviceProto.ts | 378 +++++ server/src/utils/broadcast.ts | 67 + server/src/utils/math.ts | 54 + server/test/api/ApiSend.test.ts | 40 + server/test/tsconfig.json | 19 + server/tsconfig.json | 18 + server/tsrpc.config.ts | 38 + server/yarn.lock | 1336 +++++++++++++++++ 34 files changed, 2965 insertions(+) create mode 100644 server/.github/instructions/development-tasks.md create mode 100644 server/.github/instructions/workspace.instructions.md create mode 100644 server/.gitignore create mode 100644 server/.mocharc.js create mode 100644 server/.vscode/launch.json create mode 100644 server/.vscode/settings.json create mode 100644 server/Dockerfile create mode 100644 server/README.md create mode 100644 server/package.json create mode 100644 server/src/api/ApiLogin.ts create mode 100644 server/src/api/ApiMove.ts create mode 100644 server/src/api/ApiSend.ts create mode 100644 server/src/config/world.config.ts create mode 100644 server/src/index.ts create mode 100644 server/src/managers/PlayerManager.ts create mode 100644 server/src/managers/WorldManager.ts create mode 100644 server/src/models/Player.ts create mode 100644 server/src/models/Position.ts create mode 100644 server/src/models/World.ts create mode 100644 server/src/shared/protocols/MsgChat.ts create mode 100644 server/src/shared/protocols/MsgPlayerJoin.ts create mode 100644 server/src/shared/protocols/MsgPlayerMove.ts create mode 100644 server/src/shared/protocols/PtlLogin.ts create mode 100644 server/src/shared/protocols/PtlMove.ts create mode 100644 server/src/shared/protocols/PtlSend.ts create mode 100644 server/src/shared/protocols/base.ts create mode 100644 server/src/shared/protocols/serviceProto.ts create mode 100644 server/src/utils/broadcast.ts create mode 100644 server/src/utils/math.ts create mode 100644 server/test/api/ApiSend.test.ts create mode 100644 server/test/tsconfig.json create mode 100644 server/tsconfig.json create mode 100644 server/tsrpc.config.ts create mode 100644 server/yarn.lock diff --git a/server/.github/instructions/development-tasks.md b/server/.github/instructions/development-tasks.md new file mode 100644 index 0000000..f6373ae --- /dev/null +++ b/server/.github/instructions/development-tasks.md @@ -0,0 +1,98 @@ +# 开发任务清单 + +## 项目概述 +Roguelike 游戏服务端开发任务追踪 + +## 当前项目规划 + +### 1. 世界系统初始化 ✅ +- [x] 服务器启动时初始化游戏世界 +- [x] 世界配置参数 + - 世界尺寸: 800x800 + - 出生区域: 距离中心点 200 范围内 +- [x] 世界数据结构设计 + - 地图管理 + - 坐标系统 + +### 2. 玩家系统 ✅ +- [x] 玩家登录流程(统一接口) + - [x] 查找已有角色 + - [x] 若无角色,服务端自动注册 + - [x] 服务端自动创建角色 + - [x] 服务端自动分配随机出生点(出生区域内) + - [x] 返回角色信息给客户端 +- [x] 玩家数据结构 + - [x] 角色ID + - [x] 位置坐标 + - [x] 生命值(初始10点) + - [x] 出生点记录 + +### 3. 游戏机制 +- [x] 移动系统 ✅ + - [x] 移动指令协议 + - [x] 位置验证 + - [x] 位置同步广播 +- [ ] 战斗系统 + - [ ] 攻击指令协议 + - [ ] 伤害计算 + - [ ] 生命值管理 + - [ ] 死亡判定 +- [ ] 复活系统 + - [ ] 死亡处理 + - [ ] 出生点复活 + - [ ] 生命值重置 + +### 4. 协议定义 +- [x] PtlLogin - 登录协议(服务端自动处理注册和创角) ✅ +- [x] PtlMove - 移动协议 ✅ +- [x] MsgPlayerJoin - 玩家加入广播 ✅ +- [x] MsgPlayerMove - 玩家移动广播 ✅ +- [ ] PtlAttack - 攻击协议 +- [ ] MsgPlayerDeath - 玩家死亡广播 +- [ ] MsgPlayerRespawn - 玩家复活广播 +- [ ] MsgPlayerAttack - 玩家攻击广播 + +## 开发进度 + +### 已完成 +- [x] 项目初始化 +- [x] 基础消息发送 (ApiSend.ts) +- [x] **世界系统初始化** (2025-12-14) + - [x] 世界配置文件 (world.config.ts) + - [x] 位置坐标模型 (Position.ts) + - [x] 世界数据模型 (World.ts) + - [x] 数学工具函数 (math.ts) + - [x] 世界管理器 (WorldManager.ts) + - [x] 服务器启动时初始化世界 +- [x] **玩家系统** (2025-12-14) + - [x] 玩家数据模型 (Player.ts) + - [x] 玩家管理器 (PlayerManager.ts) + - [x] 登录协议定义 (PtlLogin.ts) + - [x] 登录API实现 (ApiLogin.ts) + - [x] 自动注册和创角流程 + - [x] 出生点分配逻辑 + - [x] 在线玩家管理 +- [x] **移动系统** (2025-12-14) + - [x] 移动协议定义 (PtlMove.ts) + - [x] 移动广播协议 (MsgPlayerMove.ts) + - [x] 玩家加入广播协议 (MsgPlayerJoin.ts) + - [x] 广播工具函数 (broadcast.ts) + - [x] 移动API实现 (ApiMove.ts) + - [x] 位置验证和边界检查 + - [x] 登录时广播玩家加入 + +### 进行中 +- 等待下一阶段开发... + +### 待办事项 +- 按照上述规划顺序实施开发 + +## 技术栈 +- TSRPC 框架 +- TypeScript +- Node.js + +## 备注 +- 本文档由 AI 助手维护 +- 更新日期: 2025-12-14 +- 开发过程中会根据实际情况调整任务优先级和细节 diff --git a/server/.github/instructions/workspace.instructions.md b/server/.github/instructions/workspace.instructions.md new file mode 100644 index 0000000..449c2ae --- /dev/null +++ b/server/.github/instructions/workspace.instructions.md @@ -0,0 +1,4 @@ +--- +applyTo: '**' +--- +这是TSRPC的服务端项目,请使用中文回答 \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..d84f0da --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +.DS_STORE \ No newline at end of file diff --git a/server/.mocharc.js b/server/.mocharc.js new file mode 100644 index 0000000..108856a --- /dev/null +++ b/server/.mocharc.js @@ -0,0 +1,11 @@ +module.exports = { + require: [ + 'ts-node/register', + ], + timeout: 999999, + exit: true, + spec: [ + './test/**/*.test.ts' + ], + 'preserve-symlinks': true +} \ No newline at end of file diff --git a/server/.vscode/launch.json b/server/.vscode/launch.json new file mode 100644 index 0000000..9ba4218 --- /dev/null +++ b/server/.vscode/launch.json @@ -0,0 +1,30 @@ +{ + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "mocha current file", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "args": [ + "${file}" + ], + "internalConsoleOptions": "openOnSessionStart", + "cwd": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "ts-node current file", + "protocol": "inspector", + "args": [ + "${relativeFile}" + ], + "cwd": "${workspaceRoot}", + "runtimeArgs": [ + "-r", + "ts-node/register" + ], + "internalConsoleOptions": "openOnSessionStart" + } + ] +} \ No newline at end of file diff --git a/server/.vscode/settings.json b/server/.vscode/settings.json new file mode 100644 index 0000000..00ad71f --- /dev/null +++ b/server/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..1a3c7b5 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,30 @@ +FROM node + +# 使用淘宝 NPM 镜像(国内机器构建推荐启用) +# RUN npm config set registry https://registry.npm.taobao.org/ + +# npm install +ADD package*.json /src/ +WORKDIR /src +RUN npm i + +# build +ADD . /src +RUN npm run build + +# clean +RUN npm prune --production + +# move +RUN rm -rf /app \ + && mv dist /app \ + && mv node_modules /app/ \ + && rm -rf /src + +# ENV +ENV NODE_ENV production + +EXPOSE 3000 + +WORKDIR /app +CMD node index.js \ No newline at end of file diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..dbc7d25 --- /dev/null +++ b/server/README.md @@ -0,0 +1,31 @@ +# TSRPC Server + +## Usage +### Local dev server + +Dev server would restart automatically when code changed. + +``` +npm run dev +``` + +### Build +``` +npm run build +``` + +### Generate API document + +Generate API document in swagger/openapi and markdown format. + +```shell +npm run doc +``` + +### Run unit Test +Execute `npm run dev` first, then execute: +``` +npm run test +``` + +--- \ No newline at end of file diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..7687658 --- /dev/null +++ b/server/package.json @@ -0,0 +1,27 @@ +{ + "name": "rougelike-demo-.", + "version": "0.1.0", + "main": "index.js", + "private": true, + "scripts": { + "dev": "tsrpc-cli dev", + "build": "tsrpc-cli build", + "doc": "tsrpc-cli doc", + "test": "mocha test/**/*.test.ts", + "proto": "tsrpc-cli proto", + "sync": "tsrpc-cli sync", + "api": "tsrpc-cli api" + }, + "devDependencies": { + "@types/mocha": "^8.2.3", + "@types/node": "^15.14.9", + "mocha": "^9.2.2", + "onchange": "^7.1.0", + "ts-node": "^10.9.2", + "tsrpc-cli": "^2.4.5", + "typescript": "^4.9.5" + }, + "dependencies": { + "tsrpc": "^3.4.21" + } +} \ No newline at end of file diff --git a/server/src/api/ApiLogin.ts b/server/src/api/ApiLogin.ts new file mode 100644 index 0000000..689131a --- /dev/null +++ b/server/src/api/ApiLogin.ts @@ -0,0 +1,74 @@ +import { ApiCall } from "tsrpc"; +import { ReqLogin, ResLogin, PlayerInfo } from "../shared/protocols/PtlLogin"; +import { playerManager } from "../managers/PlayerManager"; + +/** + * 登录API + * 处理玩家登录流程: + * 1. 查找已有角色 + * 2. 若无角色,自动注册并创建角色 + * 3. 分配出生点 + * 4. 返回角色信息 + */ +export default async function (call: ApiCall) { + const { playerId, playerName } = call.req; + + // 验证玩家ID + if (!playerId || playerId.trim().length === 0) { + call.error('玩家ID不能为空'); + return; + } + + try { + // 检查玩家是否已存在 + const isNewPlayer = !playerManager.hasPlayer(playerId); + + // 获取或创建玩家(自动处理注册和创角) + const player = playerManager.getOrCreatePlayer(playerId, playerName); + + // 设置玩家在线状态 + playerManager.setPlayerOnline(playerId, call.conn.id); + + // 保存玩家ID到连接对象,供其他API使用 + (call.conn as any).playerId = playerId; + + // 转换为协议格式 + const playerInfo: PlayerInfo = { + id: player.id, + name: player.name, + position: { ...player.position }, + spawnPoint: { ...player.spawnPoint }, + hp: player.hp, + maxHp: player.maxHp, + isAlive: player.isAlive, + createdAt: player.createdAt, + lastLoginAt: player.lastLoginAt + }; + + // 广播玩家加入消息给其他在线玩家 + const { broadcastToAll } = await import('../utils/broadcast'); + + broadcastToAll('PlayerJoin', { + playerId: player.id, + playerName: player.name, + position: { ...player.position }, + isNewPlayer, + timestamp: Date.now() + }, call.conn.id); + + // 返回成功结果 + call.succ({ + success: true, + message: isNewPlayer ? '创建角色成功,欢迎来到游戏世界!' : '登录成功,欢迎回来!', + player: playerInfo, + isNewPlayer + }); + + console.log(`玩家 ${player.name} (${playerId}) ${isNewPlayer ? '首次登录' : '登录成功'}`); + console.log(` 在线玩家数: ${playerManager.getOnlinePlayerCount()}`); + + } catch (error) { + console.error('登录失败:', error); + call.error(`登录失败: ${error instanceof Error ? error.message : '未知错误'}`); + } +} diff --git a/server/src/api/ApiMove.ts b/server/src/api/ApiMove.ts new file mode 100644 index 0000000..1485f59 --- /dev/null +++ b/server/src/api/ApiMove.ts @@ -0,0 +1,86 @@ +import { ApiCall } from "tsrpc"; +import { ReqMove, ResMove } from "../shared/protocols/PtlMove"; +import { playerManager } from "../managers/PlayerManager"; +import { broadcastToAll } from "../utils/broadcast"; +import { MsgPlayerMove } from "../shared/protocols/MsgPlayerMove"; + +/** + * 移动API + * 处理玩家移动请求,验证位置合法性,更新玩家位置并广播给其他玩家 + */ +export default async function (call: ApiCall) { + const { x, y } = call.req; + + // 从连接中获取玩家ID(需要在登录时保存) + const playerId = (call.conn as any).playerId; + + if (!playerId) { + call.error('未登录,请先登录'); + return; + } + + // 获取玩家信息 + const player = playerManager.getPlayer(playerId); + + if (!player) { + call.error('玩家不存在'); + return; + } + + // 检查玩家是否存活 + if (!player.isAlive) { + call.error('玩家已死亡,无法移动'); + return; + } + + // 验证坐标是否为数字 + if (typeof x !== 'number' || typeof y !== 'number') { + call.error('坐标格式错误'); + return; + } + + // 验证坐标是否为整数 + if (!Number.isInteger(x) || !Number.isInteger(y)) { + call.error('坐标必须为整数'); + return; + } + + try { + // 尝试更新玩家位置 + const success = playerManager.updatePlayerPosition(playerId, x, y); + + if (!success) { + call.succ({ + success: false, + message: '移动失败,位置无效或超出世界边界' + }); + return; + } + + // 获取更新后的位置 + const newPosition = { x, y }; + + // 广播移动消息给所有其他玩家 + const moveMsg: MsgPlayerMove = { + playerId: player.id, + playerName: player.name, + position: newPosition, + timestamp: Date.now() + }; + + broadcastToAll('MsgPlayerMove', moveMsg, call.conn.id); + + // 返回成功结果 + call.succ({ + success: true, + message: '移动成功', + position: newPosition + }); + + console.log(`玩家 ${player.name} 移动到 (${x}, ${y})`); + + } catch (error) { + console.error('移动失败:', error); + call.error(`移动失败: ${error instanceof Error ? error.message : '未知错误'}`); + } +} diff --git a/server/src/api/ApiSend.ts b/server/src/api/ApiSend.ts new file mode 100644 index 0000000..9d7daef --- /dev/null +++ b/server/src/api/ApiSend.ts @@ -0,0 +1,26 @@ +import { ApiCall } from "tsrpc"; +import { server } from ".."; +import { ReqSend, ResSend } from "../shared/protocols/PtlSend"; + +// This is a demo code file +// Feel free to delete it + +export default async function (call: ApiCall) { + // Error + if (call.req.content.length === 0) { + call.error('Content is empty') + return; + } + + // Success + let time = new Date(); + call.succ({ + time: time + }); + + // Broadcast + server.broadcastMsg('Chat', { + content: call.req.content, + time: time + }) +} \ No newline at end of file diff --git a/server/src/config/world.config.ts b/server/src/config/world.config.ts new file mode 100644 index 0000000..839f015 --- /dev/null +++ b/server/src/config/world.config.ts @@ -0,0 +1,23 @@ +/** + * 世界配置参数 + */ +export const WorldConfig = { + /** 世界宽度 */ + WORLD_WIDTH: 800, + + /** 世界高度 */ + WORLD_HEIGHT: 800, + + /** 出生区域半径(距离中心点) */ + SPAWN_RADIUS: 200, + + /** 世界中心点 X 坐标 */ + get CENTER_X() { + return this.WORLD_WIDTH / 2; + }, + + /** 世界中心点 Y 坐标 */ + get CENTER_Y() { + return this.WORLD_HEIGHT / 2; + } +} as const; diff --git a/server/src/index.ts b/server/src/index.ts new file mode 100644 index 0000000..fb2ffad --- /dev/null +++ b/server/src/index.ts @@ -0,0 +1,28 @@ +import * as path from "path"; +import { WsServer } from "tsrpc"; +import { serviceProto } from './shared/protocols/serviceProto'; +import { worldManager } from './managers/WorldManager'; + +// Create the Server +export const server = new WsServer(serviceProto, { + port: 3000, + // Remove this to use binary mode (remove from the client too) + json: true +}); + +// Initialize before server start +async function init() { + await server.autoImplementApi(path.resolve(__dirname, 'api')); + + // 初始化游戏世界 + console.log('正在初始化游戏世界...'); + worldManager.initialize(); + console.log('游戏世界初始化完成'); +}; + +// Entry function +async function main() { + await init(); + await server.start(); +} +main(); \ No newline at end of file diff --git a/server/src/managers/PlayerManager.ts b/server/src/managers/PlayerManager.ts new file mode 100644 index 0000000..b9fa414 --- /dev/null +++ b/server/src/managers/PlayerManager.ts @@ -0,0 +1,149 @@ +import { Player, createPlayer } from '../models/Player'; +import { worldManager } from './WorldManager'; + +/** + * 玩家管理器 + * 负责玩家数据的存储、查询和管理 + */ +class PlayerManager { + /** 玩家数据存储 (key: playerId) */ + private players: Map = new Map(); + + /** 在线玩家连接 (key: playerId, value: connectionId) */ + private onlinePlayers: Map = new Map(); + + /** + * 根据玩家ID查找玩家 + */ + getPlayer(playerId: string): Player | undefined { + return this.players.get(playerId); + } + + /** + * 检查玩家是否存在 + */ + hasPlayer(playerId: string): boolean { + return this.players.has(playerId); + } + + /** + * 创建新玩家 + */ + createPlayer(playerId: string, playerName?: string): Player { + if (this.players.has(playerId)) { + throw new Error(`玩家 ${playerId} 已存在`); + } + + // 生成出生点 + const spawnPoint = worldManager.generateSpawnPosition(); + + // 创建玩家 + const name = playerName || `玩家${playerId.substring(0, 6)}`; + const player = createPlayer(playerId, name, spawnPoint); + + // 保存玩家数据 + this.players.set(playerId, player); + + console.log(`创建新玩家: ${player.name} (${playerId})`); + console.log(` 出生点: (${spawnPoint.x}, ${spawnPoint.y})`); + + return player; + } + + /** + * 获取或创建玩家(登录流程) + */ + getOrCreatePlayer(playerId: string, playerName?: string): Player { + let player = this.players.get(playerId); + + if (player) { + // 玩家已存在,更新最后登录时间 + player.lastLoginAt = Date.now(); + console.log(`玩家登录: ${player.name} (${playerId})`); + } else { + // 新玩家,创建角色 + player = this.createPlayer(playerId, playerName); + } + + return player; + } + + /** + * 设置玩家在线状态 + */ + setPlayerOnline(playerId: string, connectionId: string): void { + this.onlinePlayers.set(playerId, connectionId); + } + + /** + * 设置玩家离线 + */ + setPlayerOffline(playerId: string): void { + this.onlinePlayers.delete(playerId); + console.log(`玩家离线: ${playerId}`); + } + + /** + * 检查玩家是否在线 + */ + isPlayerOnline(playerId: string): boolean { + return this.onlinePlayers.has(playerId); + } + + /** + * 获取玩家连接ID + */ + getPlayerConnectionId(playerId: string): string | undefined { + return this.onlinePlayers.get(playerId); + } + + /** + * 更新玩家位置 + */ + updatePlayerPosition(playerId: string, x: number, y: number): boolean { + const player = this.players.get(playerId); + if (!player || !player.isAlive) { + return false; + } + + // 验证位置是否合法 + if (!worldManager.isValidPosition({ x, y })) { + return false; + } + + player.position.x = x; + player.position.y = y; + return true; + } + + /** + * 获取所有在线玩家 + */ + getOnlinePlayers(): Player[] { + const players: Player[] = []; + for (const playerId of this.onlinePlayers.keys()) { + const player = this.players.get(playerId); + if (player) { + players.push(player); + } + } + return players; + } + + /** + * 获取玩家总数 + */ + getTotalPlayers(): number { + return this.players.size; + } + + /** + * 获取在线玩家数 + */ + getOnlinePlayerCount(): number { + return this.onlinePlayers.size; + } +} + +// 导出单例 +export const playerManager = new PlayerManager(); diff --git a/server/src/managers/WorldManager.ts b/server/src/managers/WorldManager.ts new file mode 100644 index 0000000..08255b8 --- /dev/null +++ b/server/src/managers/WorldManager.ts @@ -0,0 +1,79 @@ +import { World, createWorld } from '../models/World'; +import { Position } from '../models/Position'; +import { WorldConfig } from '../config/world.config'; +import { randomPositionInCircle } from '../utils/math'; + +/** + * 世界管理器 + * 负责世界初始化和地图管理 + */ +class WorldManager { + private world: World | null = null; + + /** + * 初始化世界 + */ + initialize(): void { + if (this.world) { + console.log('世界已经初始化,跳过重复初始化'); + return; + } + + this.world = createWorld( + WorldConfig.WORLD_WIDTH, + WorldConfig.WORLD_HEIGHT, + WorldConfig.SPAWN_RADIUS + ); + + console.log(`世界初始化完成:`); + console.log(` 尺寸: ${this.world.width}x${this.world.height}`); + console.log(` 中心点: (${this.world.center.x}, ${this.world.center.y})`); + console.log(` 出生区域半径: ${this.world.spawnRadius}`); + } + + /** + * 获取世界实例 + */ + getWorld(): World { + if (!this.world) { + throw new Error('世界尚未初始化'); + } + return this.world; + } + + /** + * 生成出生点位置 + */ + generateSpawnPosition(): Position { + if (!this.world) { + throw new Error('世界尚未初始化'); + } + + return randomPositionInCircle(this.world.center, this.world.spawnRadius); + } + + /** + * 检查位置是否在世界范围内 + */ + isValidPosition(pos: Position): boolean { + if (!this.world) { + return false; + } + + return pos.x >= 0 && pos.x < this.world.width && + pos.y >= 0 && pos.y < this.world.height; + } + + /** + * 获取世界中心点 + */ + getCenter(): Position { + if (!this.world) { + throw new Error('世界尚未初始化'); + } + return this.world.center; + } +} + +// 导出单例 +export const worldManager = new WorldManager(); diff --git a/server/src/models/Player.ts b/server/src/models/Player.ts new file mode 100644 index 0000000..deb04af --- /dev/null +++ b/server/src/models/Player.ts @@ -0,0 +1,71 @@ +import { Position } from './Position'; + +/** + * 玩家角色数据 + */ +export interface Player { + /** 玩家唯一ID */ + id: string; + + /** 玩家昵称 */ + name: string; + + /** 当前位置 */ + position: Position; + + /** 出生点位置 */ + spawnPoint: Position; + + /** 当前生命值 */ + hp: number; + + /** 最大生命值 */ + maxHp: number; + + /** 是否存活 */ + isAlive: boolean; + + /** 创建时间 */ + createdAt: number; + + /** 最后登录时间 */ + lastLoginAt: number; +} + +/** + * 创建新玩家 + */ +export function createPlayer(id: string, name: string, spawnPoint: Position): Player { + const maxHp = 10; // 初始最大生命值10点 + + return { + id, + name, + position: { ...spawnPoint }, // 初始位置在出生点 + spawnPoint: { ...spawnPoint }, + hp: maxHp, + maxHp, + isAlive: true, + createdAt: Date.now(), + lastLoginAt: Date.now() + }; +} + +/** + * 玩家复活 + */ +export function respawnPlayer(player: Player): void { + player.position = { ...player.spawnPoint }; + player.hp = player.maxHp; + player.isAlive = true; +} + +/** + * 玩家受伤 + */ +export function damagePlayer(player: Player, damage: number): void { + player.hp = Math.max(0, player.hp - damage); + if (player.hp <= 0) { + player.isAlive = false; + } +} diff --git a/server/src/models/Position.ts b/server/src/models/Position.ts new file mode 100644 index 0000000..e943a9a --- /dev/null +++ b/server/src/models/Position.ts @@ -0,0 +1,37 @@ +/** + * 位置坐标接口 + */ +export interface Position { + x: number; + y: number; +} + +/** + * 创建位置对象 + */ +export function createPosition(x: number, y: number): Position { + return { x, y }; +} + +/** + * 计算两点之间的距离 + */ +export function getDistance(pos1: Position, pos2: Position): number { + const dx = pos1.x - pos2.x; + const dy = pos1.y - pos2.y; + return Math.sqrt(dx * dx + dy * dy); +} + +/** + * 检查位置是否在范围内 + */ +export function isInBounds(pos: Position, width: number, height: number): boolean { + return pos.x >= 0 && pos.x < width && pos.y >= 0 && pos.y < height; +} + +/** + * 检查位置是否在圆形区域内 + */ +export function isInCircle(pos: Position, center: Position, radius: number): boolean { + return getDistance(pos, center) <= radius; +} diff --git a/server/src/models/World.ts b/server/src/models/World.ts new file mode 100644 index 0000000..6ae7056 --- /dev/null +++ b/server/src/models/World.ts @@ -0,0 +1,37 @@ +import { Position } from './Position'; + +/** + * 世界数据结构 + */ +export interface World { + /** 世界宽度 */ + width: number; + + /** 世界高度 */ + height: number; + + /** 出生区域半径 */ + spawnRadius: number; + + /** 世界中心点 */ + center: Position; + + /** 世界创建时间 */ + createdAt: number; +} + +/** + * 创建世界实例 + */ +export function createWorld(width: number, height: number, spawnRadius: number): World { + return { + width, + height, + spawnRadius, + center: { + x: width / 2, + y: height / 2 + }, + createdAt: Date.now() + }; +} diff --git a/server/src/shared/protocols/MsgChat.ts b/server/src/shared/protocols/MsgChat.ts new file mode 100644 index 0000000..b18ed7b --- /dev/null +++ b/server/src/shared/protocols/MsgChat.ts @@ -0,0 +1,7 @@ +// This is a demo code file +// Feel free to delete it + +export interface MsgChat { + content: string, + time: Date +} \ No newline at end of file diff --git a/server/src/shared/protocols/MsgPlayerJoin.ts b/server/src/shared/protocols/MsgPlayerJoin.ts new file mode 100644 index 0000000..28c3d40 --- /dev/null +++ b/server/src/shared/protocols/MsgPlayerJoin.ts @@ -0,0 +1,22 @@ +import { Position } from './base'; + +/** + * 玩家加入游戏广播消息 + * 当有新玩家登录或加入游戏时,广播给所有在线玩家 + */ +export interface MsgPlayerJoin { + /** 加入的玩家ID */ + playerId: string; + + /** 玩家昵称 */ + playerName: string; + + /** 玩家位置 */ + position: Position; + + /** 是否新玩家 */ + isNewPlayer: boolean; + + /** 加入时间戳 */ + timestamp: number; +} diff --git a/server/src/shared/protocols/MsgPlayerMove.ts b/server/src/shared/protocols/MsgPlayerMove.ts new file mode 100644 index 0000000..0ea3694 --- /dev/null +++ b/server/src/shared/protocols/MsgPlayerMove.ts @@ -0,0 +1,19 @@ +import { Position } from './base'; + +/** + * 玩家移动广播消息 + * 当有玩家移动时,广播给所有在线玩家 + */ +export interface MsgPlayerMove { + /** 移动的玩家ID */ + playerId: string; + + /** 玩家昵称 */ + playerName: string; + + /** 移动后的位置 */ + position: Position; + + /** 移动时间戳 */ + timestamp: number; +} diff --git a/server/src/shared/protocols/PtlLogin.ts b/server/src/shared/protocols/PtlLogin.ts new file mode 100644 index 0000000..f8a3ab2 --- /dev/null +++ b/server/src/shared/protocols/PtlLogin.ts @@ -0,0 +1,61 @@ +import { Position } from './base'; + +/** + * 登录请求 + */ +export interface ReqLogin { + /** 玩家ID(用于识别玩家) */ + playerId: string; + + /** 玩家昵称(可选,新玩家时使用) */ + playerName?: string; +} + +/** + * 玩家角色信息 + */ +export interface PlayerInfo { + /** 玩家ID */ + id: string; + + /** 玩家昵称 */ + name: string; + + /** 当前位置 */ + position: Position; + + /** 出生点 */ + spawnPoint: Position; + + /** 当前生命值 */ + hp: number; + + /** 最大生命值 */ + maxHp: number; + + /** 是否存活 */ + isAlive: boolean; + + /** 创建时间 */ + createdAt: number; + + /** 最后登录时间 */ + lastLoginAt: number; +} + +/** + * 登录响应 + */ +export interface ResLogin { + /** 是否成功 */ + success: boolean; + + /** 消息 */ + message: string; + + /** 玩家信息 */ + player?: PlayerInfo; + + /** 是否新玩家 */ + isNewPlayer?: boolean; +} diff --git a/server/src/shared/protocols/PtlMove.ts b/server/src/shared/protocols/PtlMove.ts new file mode 100644 index 0000000..7fe831c --- /dev/null +++ b/server/src/shared/protocols/PtlMove.ts @@ -0,0 +1,26 @@ +import { Position } from './base'; + +/** + * 移动请求 + */ +export interface ReqMove { + /** 目标位置 X 坐标 */ + x: number; + + /** 目标位置 Y 坐标 */ + y: number; +} + +/** + * 移动响应 + */ +export interface ResMove { + /** 是否成功 */ + success: boolean; + + /** 消息 */ + message?: string; + + /** 实际移动后的位置 */ + position?: Position; +} diff --git a/server/src/shared/protocols/PtlSend.ts b/server/src/shared/protocols/PtlSend.ts new file mode 100644 index 0000000..a732699 --- /dev/null +++ b/server/src/shared/protocols/PtlSend.ts @@ -0,0 +1,10 @@ +// This is a demo code file +// Feel free to delete it + +export interface ReqSend { + content: string +} + +export interface ResSend { + time: Date +} \ No newline at end of file diff --git a/server/src/shared/protocols/base.ts b/server/src/shared/protocols/base.ts new file mode 100644 index 0000000..cdf5c5d --- /dev/null +++ b/server/src/shared/protocols/base.ts @@ -0,0 +1,23 @@ +export interface BaseRequest { + +} + +export interface BaseResponse { + +} + +export interface BaseConf { + +} + +export interface BaseMessage { + +} + +/** + * 位置坐标 + */ +export interface Position { + x: number; + y: number; +} \ No newline at end of file diff --git a/server/src/shared/protocols/serviceProto.ts b/server/src/shared/protocols/serviceProto.ts new file mode 100644 index 0000000..53be2c6 --- /dev/null +++ b/server/src/shared/protocols/serviceProto.ts @@ -0,0 +1,378 @@ +import { ServiceProto } from 'tsrpc-proto'; +import { MsgChat } from './MsgChat'; +import { MsgPlayerJoin } from './MsgPlayerJoin'; +import { MsgPlayerMove } from './MsgPlayerMove'; +import { ReqLogin, ResLogin } from './PtlLogin'; +import { ReqMove, ResMove } from './PtlMove'; +import { ReqSend, ResSend } from './PtlSend'; + +export interface ServiceType { + api: { + "Login": { + req: ReqLogin, + res: ResLogin + }, + "Move": { + req: ReqMove, + res: ResMove + }, + "Send": { + req: ReqSend, + res: ResSend + } + }, + msg: { + "Chat": MsgChat, + "PlayerJoin": MsgPlayerJoin, + "PlayerMove": MsgPlayerMove + } +} + +export const serviceProto: ServiceProto = { + "version": 3, + "services": [ + { + "id": 0, + "name": "Chat", + "type": "msg" + }, + { + "id": 3, + "name": "PlayerJoin", + "type": "msg" + }, + { + "id": 4, + "name": "PlayerMove", + "type": "msg" + }, + { + "id": 2, + "name": "Login", + "type": "api" + }, + { + "id": 5, + "name": "Move", + "type": "api" + }, + { + "id": 1, + "name": "Send", + "type": "api" + } + ], + "types": { + "MsgChat/MsgChat": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "content", + "type": { + "type": "String" + } + }, + { + "id": 1, + "name": "time", + "type": { + "type": "Date" + } + } + ] + }, + "MsgPlayerJoin/MsgPlayerJoin": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "playerId", + "type": { + "type": "String" + } + }, + { + "id": 1, + "name": "playerName", + "type": { + "type": "String" + } + }, + { + "id": 2, + "name": "position", + "type": { + "type": "Reference", + "target": "base/Position" + } + }, + { + "id": 3, + "name": "isNewPlayer", + "type": { + "type": "Boolean" + } + }, + { + "id": 4, + "name": "timestamp", + "type": { + "type": "Number" + } + } + ] + }, + "base/Position": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "x", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "y", + "type": { + "type": "Number" + } + } + ] + }, + "MsgPlayerMove/MsgPlayerMove": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "playerId", + "type": { + "type": "String" + } + }, + { + "id": 1, + "name": "playerName", + "type": { + "type": "String" + } + }, + { + "id": 2, + "name": "position", + "type": { + "type": "Reference", + "target": "base/Position" + } + }, + { + "id": 3, + "name": "timestamp", + "type": { + "type": "Number" + } + } + ] + }, + "PtlLogin/ReqLogin": { + "type": "Interface", + "properties": [ + { + "id": 1, + "name": "playerId", + "type": { + "type": "String" + } + }, + { + "id": 2, + "name": "playerName", + "type": { + "type": "String" + }, + "optional": true + } + ] + }, + "PtlLogin/ResLogin": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "success", + "type": { + "type": "Boolean" + } + }, + { + "id": 1, + "name": "message", + "type": { + "type": "String" + } + }, + { + "id": 4, + "name": "player", + "type": { + "type": "Reference", + "target": "PtlLogin/PlayerInfo" + }, + "optional": true + }, + { + "id": 5, + "name": "isNewPlayer", + "type": { + "type": "Boolean" + }, + "optional": true + } + ] + }, + "PtlLogin/PlayerInfo": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "id", + "type": { + "type": "String" + } + }, + { + "id": 1, + "name": "name", + "type": { + "type": "String" + } + }, + { + "id": 2, + "name": "position", + "type": { + "type": "Reference", + "target": "base/Position" + } + }, + { + "id": 3, + "name": "spawnPoint", + "type": { + "type": "Reference", + "target": "base/Position" + } + }, + { + "id": 4, + "name": "hp", + "type": { + "type": "Number" + } + }, + { + "id": 5, + "name": "maxHp", + "type": { + "type": "Number" + } + }, + { + "id": 6, + "name": "isAlive", + "type": { + "type": "Boolean" + } + }, + { + "id": 7, + "name": "createdAt", + "type": { + "type": "Number" + } + }, + { + "id": 8, + "name": "lastLoginAt", + "type": { + "type": "Number" + } + } + ] + }, + "PtlMove/ReqMove": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "x", + "type": { + "type": "Number" + } + }, + { + "id": 1, + "name": "y", + "type": { + "type": "Number" + } + } + ] + }, + "PtlMove/ResMove": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "success", + "type": { + "type": "Boolean" + } + }, + { + "id": 1, + "name": "message", + "type": { + "type": "String" + }, + "optional": true + }, + { + "id": 2, + "name": "position", + "type": { + "type": "Reference", + "target": "base/Position" + }, + "optional": true + } + ] + }, + "PtlSend/ReqSend": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "content", + "type": { + "type": "String" + } + } + ] + }, + "PtlSend/ResSend": { + "type": "Interface", + "properties": [ + { + "id": 0, + "name": "time", + "type": { + "type": "Date" + } + } + ] + } + } +}; \ No newline at end of file diff --git a/server/src/utils/broadcast.ts b/server/src/utils/broadcast.ts new file mode 100644 index 0000000..767ac5f --- /dev/null +++ b/server/src/utils/broadcast.ts @@ -0,0 +1,67 @@ +import { server } from '../index'; +import { playerManager } from '../managers/PlayerManager'; + +/** + * 广播消息给所有在线玩家 + * @param msgName 消息名称 + * @param msg 消息内容 + * @param excludeConnectionId 排除的连接ID(可选,用于排除发送者自己) + */ +export function broadcastToAll(msgName: string, msg: T, excludeConnectionId?: string): void { + const onlinePlayers = playerManager.getOnlinePlayers(); + const targetConns = []; + + for (const player of onlinePlayers) { + const connectionId = playerManager.getPlayerConnectionId(player.id); + + if (!connectionId) { + continue; + } + + // 如果指定了排除的连接ID,跳过该连接 + if (excludeConnectionId && connectionId === excludeConnectionId) { + continue; + } + + const conn = server.connections.find(c => c.id === connectionId); + if (conn) { + targetConns.push(conn); + } + } + + // 使用 broadcastMsg 批量发送,只执行一次序列化 + if (targetConns.length > 0) { + (server as any).broadcastMsg(msgName, msg, targetConns); + } +} + +/** + * 广播消息给指定玩家 + * @param playerId 玩家ID + * @param msgName 消息名称 + * @param msg 消息内容 + */ +export function broadcastToPlayer(playerId: string, msgName: string, msg: T): void { + const connectionId = playerManager.getPlayerConnectionId(playerId); + + if (!connectionId) { + return; + } + + const conn = server.connections.find(c => c.id === connectionId); + if (conn) { + (conn as any).sendMsg(msgName, msg); + } +} + +/** + * 广播消息给多个玩家 + * @param playerIds 玩家ID列表 + * @param msgName 消息名称 + * @param msg 消息内容 + */ +export function broadcastToPlayers(playerIds: string[], msgName: string, msg: T): void { + for (const playerId of playerIds) { + broadcastToPlayer(playerId, msgName, msg); + } +} diff --git a/server/src/utils/math.ts b/server/src/utils/math.ts new file mode 100644 index 0000000..64f5088 --- /dev/null +++ b/server/src/utils/math.ts @@ -0,0 +1,54 @@ +import { Position } from '../models/Position'; + +/** + * 生成指定范围内的随机整数 + */ +export function randomInt(min: number, max: number): number { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** + * 生成随机浮点数 + */ +export function randomFloat(min: number, max: number): number { + return Math.random() * (max - min) + min; +} + +/** + * 在圆形区域内生成随机位置 + * @param center 圆心 + * @param radius 半径 + */ +export function randomPositionInCircle(center: Position, radius: number): Position { + // 使用极坐标转换,确保均匀分布 + const angle = Math.random() * 2 * Math.PI; + const r = Math.sqrt(Math.random()) * radius; + + return { + x: Math.round(center.x + r * Math.cos(angle)), + y: Math.round(center.y + r * Math.sin(angle)) + }; +} + +/** + * 计算两点之间的欧几里得距离 + */ +export function distance(pos1: Position, pos2: Position): number { + const dx = pos1.x - pos2.x; + const dy = pos1.y - pos2.y; + return Math.sqrt(dx * dx + dy * dy); +} + +/** + * 计算两点之间的曼哈顿距离 + */ +export function manhattanDistance(pos1: Position, pos2: Position): number { + return Math.abs(pos1.x - pos2.x) + Math.abs(pos1.y - pos2.y); +} + +/** + * 限制数值在指定范围内 + */ +export function clamp(value: number, min: number, max: number): number { + return Math.max(min, Math.min(max, value)); +} diff --git a/server/test/api/ApiSend.test.ts b/server/test/api/ApiSend.test.ts new file mode 100644 index 0000000..7102bf8 --- /dev/null +++ b/server/test/api/ApiSend.test.ts @@ -0,0 +1,40 @@ +import assert from 'assert'; +import { TsrpcError, WsClient } from 'tsrpc'; +import { serviceProto } from '../../src/shared/protocols/serviceProto'; + +// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER +// 2. EXECUTE `npm test` TO START UNIT TEST + +describe('ApiSend', function () { + let client = new WsClient(serviceProto, { + server: 'ws://127.0.0.1:3000', + json: true, + logger: console + }); + + before(async function () { + let res = await client.connect(); + assert.strictEqual(res.isSucc, true, 'Failed to connect to server, have you executed `npm run dev` already?'); + }) + + it('Success', async function () { + let ret = await client.callApi('Send', { + content: 'Test' + }); + assert.ok(ret.isSucc) + }); + + it('Check content is empty', async function () { + let ret = await client.callApi('Send', { + content: '' + }); + assert.deepStrictEqual(ret, { + isSucc: false, + err: new TsrpcError('Content is empty') + }); + }) + + after(async function () { + await client.disconnect(); + }) +}) \ No newline at end of file diff --git a/server/test/tsconfig.json b/server/test/tsconfig.json new file mode 100644 index 0000000..a0ffeed --- /dev/null +++ b/server/test/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "lib": [ + "es2018" + ], + "module": "commonjs", + "target": "es2018", + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + }, + "include": [ + ".", + "../src" + ] +} \ No newline at end of file diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..d18498f --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "es2018" + ], + "module": "commonjs", + "target": "es2018", + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + }, + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/server/tsrpc.config.ts b/server/tsrpc.config.ts new file mode 100644 index 0000000..bbf2a07 --- /dev/null +++ b/server/tsrpc.config.ts @@ -0,0 +1,38 @@ +import type { TsrpcConfig } from 'tsrpc-cli'; + +export default { + // Generate ServiceProto + proto: [ + { + ptlDir: 'src/shared/protocols', // Protocol dir + output: 'src/shared/protocols/serviceProto.ts', // Path for generated ServiceProto + apiDir: 'src/api', // API dir + docDir: 'docs', // API documents dir + ptlTemplate: { baseFile: 'src/shared/protocols/base.ts' }, + // msgTemplate: { baseFile: 'src/shared/protocols/base.ts' }, + } + ], + // Sync shared code + sync: [ + // { + // from: 'src/shared', + // to: '../frontend/src/shared', + // type: 'symlink' // Change this to 'copy' if your environment not support symlink + // } + ], + // Dev server + dev: { + autoProto: true, // Auto regenerate proto + autoSync: true, // Auto sync when file changed + autoApi: true, // Auto create API when ServiceProto updated + watch: 'src', // Restart dev server when these files changed + entry: 'src/index.ts', // Dev server command: node -r ts-node/register {entry} + }, + // Build config + build: { + autoProto: true, // Auto generate proto before build + autoSync: true, // Auto sync before build + autoApi: true, // Auto generate API before build + outDir: 'dist', // Clean this dir before build + } +} \ No newline at end of file diff --git a/server/yarn.lock b/server/yarn.lock new file mode 100644 index 0000000..e0d6727 --- /dev/null +++ b/server/yarn.lock @@ -0,0 +1,1336 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@blakeembrey/deque@^1.0.5": + version "1.0.5" + resolved "https://registry.npmmirror.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" + integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== + +"@blakeembrey/template@^1.0.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@blakeembrey/template/-/template-1.2.0.tgz#acd948eb29334e882019e8876b42ff6da1dcf528" + integrity sha512-w/63nURdkRPpg3AXbNr7lPv6HgOuVDyefTumiXsbXxtIwcuk5EXayWR5OpSwDjsQPgaYsfUSedMduaNOjAYY8A== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@inquirer/external-editor@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" + integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.5" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/mocha@^8.2.3": + version "8.2.3" + resolved "https://registry.npmmirror.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + +"@types/node@*": + version "25.0.2" + resolved "https://registry.npmmirror.com/@types/node/-/node-25.0.2.tgz#411f9dd6cb2bf5ee46aed7199a9f85ca6b068b4e" + integrity sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA== + dependencies: + undici-types "~7.16.0" + +"@types/node@^15.14.9": + version "15.14.9" + resolved "https://registry.npmmirror.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== + +"@types/ws@^7.4.7": + version "7.4.7" + resolved "https://registry.npmmirror.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.npmmirror.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.15.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0, arg@^4.1.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" + integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.3.1, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commandpost@^1.0.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/commandpost/-/commandpost-1.4.0.tgz#89218012089dfc9b67a337ba162f15c88e0f1048" + integrity sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.1: + version "7.0.6" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +editorconfig@^0.15.0: + version "0.15.3" + resolved "https://registry.npmmirror.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.2.3: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmmirror.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@^0.7.0: + version "0.7.1" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.1.tgz#d4af1d2092f2bb05aab6296e5e7cd286d2f15432" + integrity sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.3.2" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.4: + version "8.2.7" + resolved "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.7.tgz#62f6b931a9b7f8735dc42db927316d8fb6f71de8" + integrity sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA== + dependencies: + "@inquirer/external-editor" "^1.0.0" + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +invert-kv@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" + integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +k8w-crypto@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/k8w-crypto/-/k8w-crypto-0.2.0.tgz#00e6f3027832eeade06fd79c9c3a1ebfb76c964f" + integrity sha512-M6u4eQ6CQaU5xO3s4zaUUp9G79xNDhXtTU0X7N80tDcBhQC5ggowlyOzj95v7WiCuk7xkV0aFsTmCpuf0m0djw== + +k8w-extend-native@^1.4.6: + version "1.4.6" + resolved "https://registry.npmmirror.com/k8w-extend-native/-/k8w-extend-native-1.4.6.tgz#d3008c60f3f85e5b2f2bd8617ff4a5bc9cf743a6" + integrity sha512-AHTCyFshldMme0s9FKD+QKG+QZdBkHXzl+8kYfNhsSDhcdQ5TYWQwphjecSJjxNdGd78TIbO0fHiOvM+Ei22YA== + dependencies: + k8w-linq-array "*" + k8w-super-date "*" + k8w-super-object "*" + +k8w-linq-array@*: + version "0.2.8" + resolved "https://registry.npmmirror.com/k8w-linq-array/-/k8w-linq-array-0.2.8.tgz#1ef4d4a2943552cbd5f633a5d9b8e831dc8abd6e" + integrity sha512-4IAkQN8UJdk804tQi++wuwSZvFWk/Wcl1uG5PR/0c0YvB5hUd2f8tJm3OgOMOxjV9UVByNLvnPYGIwrFQPpjlA== + +k8w-super-date@*: + version "0.1.3" + resolved "https://registry.npmmirror.com/k8w-super-date/-/k8w-super-date-0.1.3.tgz#4f53a39f2b74e21b11268926b710e5a7c27f8848" + integrity sha512-IBqKOAMAXR/bgzu+rYI30tEMP/Y6Q8HQuqJiTkE2mLJg11yok9guoi8uZTynTahviVBndcfBpOgi1H/zhihv7w== + +k8w-super-object@*: + version "0.3.0" + resolved "https://registry.npmmirror.com/k8w-super-object/-/k8w-super-object-0.3.0.tgz#6430d14956aaf3a936fda7776b0897a04db331dd" + integrity sha512-u2jfh4goYXKZmSucaLaOTaNbLRatjv0CSRpzE0KU0732+9XtYZFd5vrdw/mzJfK5fPHb/zyikOSHDX5mJrav+g== + +lcid@^3.0.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" + integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== + dependencies: + invert-kv "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +mem@^5.0.0: + version "5.1.1" + resolved "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.1.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mocha@^9.2.2: + version "9.2.2" + resolved "https://registry.npmmirror.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onchange@^7.1.0: + version "7.1.0" + resolved "https://registry.npmmirror.com/onchange/-/onchange-7.1.0.tgz#a6f0f7733e4d47014b4cd70aa1ad36c2b4cf3804" + integrity sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg== + dependencies: + "@blakeembrey/deque" "^1.0.5" + "@blakeembrey/template" "^1.0.0" + arg "^4.1.3" + chokidar "^3.3.1" + cross-spawn "^7.0.1" + ignore "^5.1.4" + tree-kill "^1.2.2" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-locale@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" + integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA== + dependencies: + execa "^4.0.0" + lcid "^3.0.0" + mem "^5.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^7.5.5: + version "7.8.2" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node@^10.8.2, ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsbuffer-proto-generator@^1.7.2: + version "1.7.2" + resolved "https://registry.npmmirror.com/tsbuffer-proto-generator/-/tsbuffer-proto-generator-1.7.2.tgz#fcc375ad7938683352568299d60511ed759700e2" + integrity sha512-Rjq/mNXb6Z3ORi5M0BH3O+L0hpr+RcLzJ1edXO4bOZkojdtxDmwoKGBKoh+/xba+bhOiSiwHfVZLiQ06A6vEmw== + dependencies: + k8w-crypto "^0.2.0" + k8w-extend-native "^1.4.6" + tsbuffer-schema "^2.2.0" + tslib "*" + typescript "^4" + +tsbuffer-schema@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/tsbuffer-schema/-/tsbuffer-schema-2.2.0.tgz#0318c222d7c0e23f4e16ad67d04c36844a05e226" + integrity sha512-I4+5Xfk7G+D++kXdNnYTeY26WQTaf14C84XQwPKteNmrwxRY3CQCkMqASRiCUqtpOuDn43qmoxuXpT+Vo8Wltg== + +tsbuffer-validator@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/tsbuffer-validator/-/tsbuffer-validator-2.1.3.tgz#3365d08288d64d8968673f8f6a14aac8f9d94265" + integrity sha512-7OfwABXxNGbd1UJk9RBi29SFByimSjCOMc6gJ+htwsiJmSTxwn6VZeQqcm8+lpFfUtJJV+Ry8dKSGpI+BuXaDQ== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer-schema "^2.2.0" + tslib "*" + +tsbuffer@^2.2.11, tsbuffer@^2.2.22, tsbuffer@^2.2.3: + version "2.2.23" + resolved "https://registry.npmmirror.com/tsbuffer/-/tsbuffer-2.2.23.tgz#85d32ec535b7a9b0dca027626011c201756c6d7c" + integrity sha512-B5SENaf8X849oOtmC0Hgev2M3vC8BNyAIIwQD4NJmHPNjktCyplXpVIcjns3I8EnM2GNQwVaBvtnsUgkUj8Q9Q== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer-validator "^2.1.3" + tslib "*" + +tslib@*, tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsrpc-base-client@^2.1.17: + version "2.1.17" + resolved "https://registry.npmmirror.com/tsrpc-base-client/-/tsrpc-base-client-2.1.17.tgz#4387a31aedd7fd162253d0fc41a78e9b9b0526f7" + integrity sha512-z3Ei2jgJUWt4Mmf9AWXk0BctXE2FzfVRLitbDgZ9byixjuIQ2rDyDxjR8ae7kiR17Dx4YVIEJ8FW/2180lA5iw== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer "^2.2.22" + tslib "*" + tsrpc-proto "^1.4.3" + +tsrpc-cli@^2.4.5: + version "2.4.5" + resolved "https://registry.npmmirror.com/tsrpc-cli/-/tsrpc-cli-2.4.5.tgz#26d2e3c0e0f4ef3e3cb03eb98b911ce50b19993f" + integrity sha512-/3MMyGAAuSnZLQVfoRZXI5sfyGakRTk2AfrllvVSUSfGPTr06iU1YAgOATNYEHl+uAj1+QFz3dKT8g3J+wCIcw== + dependencies: + chalk "^4.1.2" + chokidar "^3.5.3" + fs-extra "^10.1.0" + glob "^7.2.3" + inquirer "^8.2.4" + k8w-extend-native "^1.4.6" + minimist "^1.2.6" + ora "^5.4.1" + os-locale "^5.0.0" + ts-node "^10.8.2" + tsbuffer "^2.2.3" + tsbuffer-proto-generator "^1.7.2" + tsbuffer-schema "^2.2.0" + tsrpc-proto "^1.4.2" + typescript "^4.7.4" + typescript-formatter "^7.2.2" + +tsrpc-proto@^1.4.2, tsrpc-proto@^1.4.3: + version "1.4.3" + resolved "https://registry.npmmirror.com/tsrpc-proto/-/tsrpc-proto-1.4.3.tgz#8db8fa43f0f6e97308bbc580be1c1de50acd8532" + integrity sha512-qtkk5i34m9/K1258EdyXAEikU/ADPELHCCXN/oFJ4XwH+kN3kXnKYmwCDblUuMA73V2+A/EwkgUGyAgPa335Hw== + dependencies: + tsbuffer-schema "^2.2.0" + tslib "*" + +tsrpc@^3.4.21: + version "3.4.21" + resolved "https://registry.npmmirror.com/tsrpc/-/tsrpc-3.4.21.tgz#1679968c649e00bea79cb808abb50c67cd262a26" + integrity sha512-8NdFmEkB5t1raKPuWzwl/qwivbacxsuFzpTDv2nlHPVNBP7fwmIOY6uZT8g/SSaAEUMAKt8fCeOYYtwsvjwjqw== + dependencies: + "@types/ws" "^7.4.7" + chalk "^4.1.2" + tsbuffer "^2.2.11" + tsrpc-base-client "^2.1.17" + tsrpc-proto "^1.4.3" + uuid "^8.3.2" + ws "^7.5.9" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript-formatter@^7.2.2: + version "7.2.2" + resolved "https://registry.npmmirror.com/typescript-formatter/-/typescript-formatter-7.2.2.tgz#a147181839b7bb09c2377b072f20f6336547c00a" + integrity sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ== + dependencies: + commandpost "^1.0.0" + editorconfig "^0.15.0" + +typescript@^4, typescript@^4.7.4, typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.5.9: + version "7.5.10" + resolved "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==