diff --git a/skyrim-platform/.clang-format b/.clang-format similarity index 100% rename from skyrim-platform/.clang-format rename to .clang-format diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c795b054e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 23811359d6..9cd8832ee2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,5 +2,5 @@ path = skyrim-platform/submodules/CommonLibSSE url = https://github.com/Ryan-rsm-McKenzie/CommonLibSSE.git [submodule "vcpkg"] - path = skyrim-platform/vcpkg + path = vcpkg url = https://github.com/skyrim-multiplayer/vcpkg.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..d0fc03a02d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +if(WIN32) + set(VCPKG_TARGET_TRIPLET "x64-windows-sp") +else() + set(VCPKG_TARGET_TRIPLET "x64-linux") +endif() + +set(VCPKG_OVERLAY_TRIPLETS "${CMAKE_CURRENT_LIST_DIR}/overlay_triplets") +set(VCPKG_OVERLAY_PORTS "${CMAKE_CURRENT_LIST_DIR}/overlay_ports") +set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake") + +cmake_minimum_required(VERSION 3.19.1) +project(skymp) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) + +add_subdirectory(chakra-wrapper) +add_subdirectory(skyrim-platform) +add_subdirectory(skymp5-client) \ No newline at end of file diff --git a/chakra-wrapper/CMakeLists.txt b/chakra-wrapper/CMakeLists.txt new file mode 100644 index 0000000000..dd4d6f6dea --- /dev/null +++ b/chakra-wrapper/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.19.1) +project(chakra-wrapper) + +add_library(chakra-wrapper INTERFACE) +target_include_directories(chakra-wrapper INTERFACE ${CMAKE_CURRENT_LIST_DIR}) \ No newline at end of file diff --git a/JsEngine/JsEngine.h b/chakra-wrapper/JsEngine.h similarity index 100% rename from JsEngine/JsEngine.h rename to chakra-wrapper/JsEngine.h diff --git a/JsEngine/TaskQueue.h b/chakra-wrapper/TaskQueue.h similarity index 100% rename from JsEngine/TaskQueue.h rename to chakra-wrapper/TaskQueue.h diff --git a/skyrim-platform/src/cmake/CMakeRC.cmake b/cmake/CMakeRC.cmake similarity index 100% rename from skyrim-platform/src/cmake/CMakeRC.cmake rename to cmake/CMakeRC.cmake diff --git a/skyrim-platform/src/cmake/apply_default_settings.cmake b/cmake/apply_default_settings.cmake similarity index 100% rename from skyrim-platform/src/cmake/apply_default_settings.cmake rename to cmake/apply_default_settings.cmake diff --git a/skyrim-platform/src/cmake/modules/FindChakraCore.cmake b/cmake/modules/FindChakraCore.cmake similarity index 100% rename from skyrim-platform/src/cmake/modules/FindChakraCore.cmake rename to cmake/modules/FindChakraCore.cmake diff --git a/skyrim-platform/src/cmake/npm.cmake b/cmake/npm.cmake similarity index 93% rename from skyrim-platform/src/cmake/npm.cmake rename to cmake/npm.cmake index 2b2cecc35a..233135cf79 100644 --- a/skyrim-platform/src/cmake/npm.cmake +++ b/cmake/npm.cmake @@ -1,12 +1,12 @@ function(npm_execute_command) cmake_parse_arguments(A "" "WORKING_DIRECTORY;OUTPUT_VARIABLE;RESULT_VARIABLE" "COMMAND" ${ARGN}) foreach(arg WORKING_DIRECTORY COMMAND) - if ("${A_${arg}}" STREQUAL "") + if("${A_${arg}}" STREQUAL "") message(FATAL_ERROR "Missing ${arg} argument") endif() endforeach() - if (WIN32) + if(WIN32) set(temp_bat "${CMAKE_CURRENT_BINARY_DIR}/temp.bat") set(npm_cmd ${temp_bat}) set(npm_arg "") @@ -27,8 +27,8 @@ function(npm_execute_command) # TODO: ERROR_VARIABLE ) - if ("${A_RESULT_VARIABLE}" STREQUAL "") - if (NOT "${npm_result}" STREQUAL "0") + if("${A_RESULT_VARIABLE}" STREQUAL "") + if(NOT "${npm_result}" STREQUAL "0") message(FATAL_ERROR "npm ${A_COMMAND} exited with ${npm_result}:\n${npm_output}") endif() else() diff --git a/overlay_ports/dummy b/overlay_ports/dummy new file mode 100644 index 0000000000..e69de29bb2 diff --git a/skyrim-platform/overlay_triplets/x64-windows-sp.cmake b/overlay_triplets/x64-windows-sp.cmake similarity index 100% rename from skyrim-platform/overlay_triplets/x64-windows-sp.cmake rename to overlay_triplets/x64-windows-sp.cmake diff --git a/skymp5-client0/.gitignore b/skymp5-client/.gitignore similarity index 97% rename from skymp5-client0/.gitignore rename to skymp5-client/.gitignore index f00c50592b..d5a06f7a01 100644 --- a/skymp5-client0/.gitignore +++ b/skymp5-client/.gitignore @@ -113,7 +113,4 @@ dist .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz -.pnp.* - -# skymp5-client.js build -dist_front \ No newline at end of file +.pnp.* \ No newline at end of file diff --git a/skymp5-client/CMakeLists.txt b/skymp5-client/CMakeLists.txt new file mode 100644 index 0000000000..1df4e6d1d2 --- /dev/null +++ b/skymp5-client/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.19.1) +project(skymp5-client) + +include(${CMAKE_SOURCE_DIR}/cmake/npm.cmake) + +npm_execute_command( + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMAND install +) + +file(GLOB_RECURSE sources ${CMAKE_CURRENT_LIST_DIR}/src/*.ts) + +add_custom_target(skymp5-client ALL + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + SOURCES ${sources} + COMMAND npm run build +) +add_dependencies(skymp5-client skyrim-platform) \ No newline at end of file diff --git a/skymp5-client/package-lock.json b/skymp5-client/package-lock.json new file mode 100644 index 0000000000..33e7b25ca2 --- /dev/null +++ b/skymp5-client/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "skymp5-client", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "typescript": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "dev": true + } + } +} diff --git a/skymp5-client/package.json b/skymp5-client/package.json new file mode 100644 index 0000000000..3dcec6d616 --- /dev/null +++ b/skymp5-client/package.json @@ -0,0 +1,14 @@ +{ + "name": "skymp5-client", + "version": "1.0.0", + "description": "", + "scripts": { + "watch": "tsc -w", + "build": "tsc" + }, + "keywords": [], + "author": "Leonid Pospelov (https://skymp.io)", + "devDependencies": { + "typescript": "^4.1.3" + } +} diff --git a/skymp5-client0/src/front/browser.ts b/skymp5-client/src/front/browser.ts similarity index 96% rename from skymp5-client0/src/front/browser.ts rename to skymp5-client/src/front/browser.ts index 68d3ed25c4..47774fd249 100644 --- a/skymp5-client0/src/front/browser.ts +++ b/skymp5-client/src/front/browser.ts @@ -85,7 +85,7 @@ export const main = (): void => { printConsole({ cfg }); - const uiPort = cfg.port === 7777 ? 3000 : cfg.port + 1; + const uiPort = cfg.port === 7777 ? 3000 : cfg.port as number + 1; const url = `http://${cfg.ip}:${uiPort}/ui/index.html`; printConsole(`loading url ${url}`); diff --git a/skymp5-client0/src/front/components/animation.ts b/skymp5-client/src/front/components/animation.ts similarity index 100% rename from skymp5-client0/src/front/components/animation.ts rename to skymp5-client/src/front/components/animation.ts diff --git a/skymp5-client0/src/front/components/equipment.ts b/skymp5-client/src/front/components/equipment.ts similarity index 100% rename from skymp5-client0/src/front/components/equipment.ts rename to skymp5-client/src/front/components/equipment.ts diff --git a/skymp5-client0/src/front/components/inventory.ts b/skymp5-client/src/front/components/inventory.ts similarity index 97% rename from skymp5-client0/src/front/components/inventory.ts rename to skymp5-client/src/front/components/inventory.ts index 661bf7e3c7..31cd11d151 100644 --- a/skymp5-client0/src/front/components/inventory.ts +++ b/skymp5-client/src/front/components/inventory.ts @@ -18,6 +18,7 @@ import { Actor, Ammo, printConsole, + ActorBase, } from "skyrimPlatform"; import * as structures from "../../lib/structures/inventory"; @@ -27,7 +28,7 @@ export type BasicEntry = structures.BasicEntry; // 'loxsword (Legendary)' => 'loxsword' const getRealName = (s?: string): string => { - if (!s) return s; + if (!s) return s as string; const arr = s.split(" "); if (arr.length && arr[arr.length - 1].match(/^\(.*\)$/)) arr.pop(); @@ -36,7 +37,7 @@ const getRealName = (s?: string): string => { // 'aaaaaaaaaaaaaaaa' => 'aaa...' const cropName = (s?: string): string => { - if (!s) return s; + if (!s) return s as string; const max = 128; return s.length >= max @@ -200,7 +201,7 @@ const getExtraContainerChangesAsInventory = ( }; const getBaseContainerAsInventory = (refr: ObjectReference): Inventory => { - return { entries: getContainer(refr.getBaseObject().getFormID()) }; + return { entries: getContainer((refr.getBaseObject() as ActorBase).getFormID()) }; }; const sumInventories = (lhs: Inventory, rhs: Inventory): Inventory => { @@ -263,7 +264,7 @@ const basesReset = (): Set => { storage["basesResetExists"] = true; storage["basesReset"] = new Set(); } - return storage["basesReset"]; + return storage["basesReset"] as Set; }; const resetBase = (refr: ObjectReference): void => { diff --git a/skymp5-client0/src/front/components/look.ts b/skymp5-client/src/front/components/look.ts similarity index 84% rename from skymp5-client0/src/front/components/look.ts rename to skymp5-client/src/front/components/look.ts index 16d39be261..696942a41b 100644 --- a/skymp5-client0/src/front/components/look.ts +++ b/skymp5-client/src/front/components/look.ts @@ -15,25 +15,25 @@ export type Look = structures.Look; export type Tint = structures.Tint; export const getLook = (actor: Actor): Look => { - const base = ActorBase.from(actor.getBaseObject()); + const base = ActorBase.from(actor.getBaseObject()) as ActorBase; const hairColor = base.getHairColor(); const skinColor = TESModPlatform.getSkinColor(base); const newLook: Look = { isFemale: base.getSex() === 1, - raceId: base.getRace() ? base.getRace().getFormID() : 0, + raceId: base.getRace() ? (base.getRace() as Race).getFormID() : 0, weight: base.getWeight(), hairColor: hairColor ? hairColor.getColor() : 0, headpartIds: [], headTextureSetId: base.getFaceTextureSet() - ? base.getFaceTextureSet().getFormID() + ? (base.getFaceTextureSet() as TextureSet).getFormID() : 0, options: new Array(19), presets: new Array(4), tints: [], skinColor: skinColor ? skinColor.getColor() : 0, - name: actor.getBaseObject().getName(), + name: (actor.getBaseObject() as ActorBase).getName(), }; const numHeadparts = base.getNumHeadParts(); @@ -51,7 +51,7 @@ export const getLook = (actor: Actor): Look => { } const numTints = - Game.getPlayer().getFormID() === actor.getFormID() + (Game.getPlayer() as Actor).getFormID() === actor.getFormID() ? Game.getNumTintMasks() : 0; for (let i = 0; i < numTints; ++i) { @@ -68,7 +68,7 @@ export const getLook = (actor: Actor): Look => { const isVisible = (argb: number) => argb > 0x00ffffff || argb < 0; -export const applyTints = (actor: Actor, look: Look): void => { +export const applyTints = (actor: Actor | null, look: Look): void => { if (!look) throw new Error("null look has been passed to applyTints"); const tints = look.tints.filter((t) => isVisible(t.argb)); @@ -93,7 +93,7 @@ export const applyTints = (actor: Actor, look: Look): void => { TESModPlatform.pushTintMask(actor, tint.type, tint.argb, tint.texturePath); }); - const playerBaseId = Game.getPlayer().getBaseObject().getFormID(); + const playerBaseId = ((Game.getPlayer() as Actor).getBaseObject() as ActorBase).getFormID(); if (actor) TESModPlatform.setFormIdUnsafe(actor.getBaseObject(), playerBaseId); @@ -127,14 +127,17 @@ const applyLookCommon = (look: Look, npc: ActorBase): void => { }; export const applyLook = (look: Look): ActorBase => { - const npc: ActorBase = TESModPlatform.createNpc(); + const npc: ActorBase = TESModPlatform.createNpc() as ActorBase; if (!npc) throw new Error("createNpc returned null"); applyLookCommon(look, npc); return npc; }; export const applyLookToPlayer = (look: Look): void => { - applyLookCommon(look, ActorBase.from(Game.getPlayer().getBaseObject())); + applyLookCommon( + look, + ActorBase.from((Game.getPlayer() as Actor).getBaseObject()) as ActorBase + ); applyTints(null, look); - Game.getPlayer().queueNiNodeUpdate(); + (Game.getPlayer() as Actor).queueNiNodeUpdate(); }; diff --git a/skymp5-client0/src/front/components/movement.ts b/skymp5-client/src/front/components/movement.ts similarity index 100% rename from skymp5-client0/src/front/components/movement.ts rename to skymp5-client/src/front/components/movement.ts diff --git a/skymp5-client0/src/front/components/movementApply.ts b/skymp5-client/src/front/components/movementApply.ts similarity index 94% rename from skymp5-client0/src/front/components/movementApply.ts rename to skymp5-client/src/front/components/movementApply.ts index 38e03eef3f..a92a522e40 100644 --- a/skymp5-client0/src/front/components/movementApply.ts +++ b/skymp5-client/src/front/components/movementApply.ts @@ -4,6 +4,7 @@ import { Game, TESModPlatform, Debug, + Form, } from "skyrimPlatform"; import { Movement, RunMode, AnimationVariables, Transform } from "./movement"; @@ -15,7 +16,7 @@ export const applyMovement = (refr: ObjectReference, m: Movement): void => { const ac = Actor.from(refr); if (ac) { - let lookAt: Actor | null; + let lookAt: Actor | null = undefined as unknown as Actor; if (m.lookAt) { try { lookAt = Game.findClosestActor( @@ -29,7 +30,7 @@ export const applyMovement = (refr: ObjectReference, m: Movement): void => { } } - if (lookAt) { + if (lookAt as Actor) { ac.setHeadTracking(true); ac.setLookAt(lookAt, false); } else { @@ -162,7 +163,7 @@ const cellWidth = 4096; const isInDifferentExteriorCell = (refr: ObjectReference, pos: number[]) => { const currentPos = getPos(refr); - const playerPos = getPos(Game.getPlayer()); + const playerPos = getPos(Game.getPlayer() as Actor); const targetDistanceToPlayer = getDistance(playerPos, pos); const currentDistanceToPlayer = getDistance(playerPos, currentPos); return ( @@ -175,7 +176,7 @@ const isInDifferentWorldOrCell = ( worldOrCell: number ) => { return ( - worldOrCell !== (refr.getWorldSpace() || refr.getParentCell()).getFormID() + worldOrCell !== ((refr.getWorldSpace() || refr.getParentCell()) as Form).getFormID() ); }; diff --git a/skymp5-client0/src/front/components/movementGet.ts b/skymp5-client/src/front/components/movementGet.ts similarity index 78% rename from skymp5-client0/src/front/components/movementGet.ts rename to skymp5-client/src/front/components/movementGet.ts index 982f963d79..71b8f85c37 100644 --- a/skymp5-client0/src/front/components/movementGet.ts +++ b/skymp5-client/src/front/components/movementGet.ts @@ -1,9 +1,9 @@ -import { ObjectReference, Actor, TESModPlatform } from "skyrimPlatform"; +import { ObjectReference, Actor, TESModPlatform, Form } from "skyrimPlatform"; import { NiPoint3 } from "../../lib/structures/movement"; import { Movement, RunMode } from "./movement"; export const getMovement = (refr: ObjectReference): Movement => { - const ac = Actor.from(refr); + const ac = Actor.from(refr) as Actor; // It is running for ObjectReferences because Standing // Doesn't lead to translateTo call @@ -27,7 +27,7 @@ export const getMovement = (refr: ObjectReference): Movement => { } return { - worldOrCell: (refr.getWorldSpace() || refr.getParentCell()).getFormID(), + worldOrCell: ((refr.getWorldSpace() || refr.getParentCell()) as Form).getFormID(), pos: [refr.getPositionX(), refr.getPositionY(), refr.getPositionZ()], rot: [refr.getAngleX(), refr.getAngleY(), refr.getAngleZ()], runMode: runMode, @@ -35,11 +35,11 @@ export const getMovement = (refr: ObjectReference): Movement => { runMode !== "Standing" ? 360 * refr.getAnimationVariableFloat("Direction") : 0, - isInJumpState: ac && ac.getAnimationVariableBool("bInJumpState"), - isSneaking: ac && isSneaking(ac), - isBlocking: ac && ac.getAnimationVariableBool("IsBlocking"), - isWeapDrawn: ac && ac.isWeaponDrawn(), - healthPercentage, + isInJumpState: (ac && ac.getAnimationVariableBool("bInJumpState")) as boolean, + isSneaking: (ac && isSneaking(ac)) as boolean, + isBlocking: (ac && ac.getAnimationVariableBool("IsBlocking")) as boolean, + isWeapDrawn: (ac && ac.isWeaponDrawn()) as boolean, + healthPercentage: healthPercentage as number, lookAt, }; }; diff --git a/skymp5-client0/src/front/console.ts b/skymp5-client/src/front/console.ts similarity index 90% rename from skymp5-client0/src/front/console.ts rename to skymp5-client/src/front/console.ts index 70aef53613..cd6dd1d030 100644 --- a/skymp5-client0/src/front/console.ts +++ b/skymp5-client/src/front/console.ts @@ -70,11 +70,11 @@ const getCommandExecutor = ( send({ t: MsgType.ConsoleCommand, data: { commandName, args } }); if ( storage["_api_onConsoleCommand"] && - storage["_api_onConsoleCommand"]["callback"] + (storage["_api_onConsoleCommand"] as any)["callback"] ) { if (commandName === "mp") { try { - storage["_api_onConsoleCommand"]["callback"](...args); + (storage["_api_onConsoleCommand"] as any)["callback"](...args); } catch (e) { printConsole("'_api_onConsoleCommand' - ", e); } @@ -92,12 +92,12 @@ export const setUpConsoleCommands = ( findConsoleCommand(" ConfigureUM") || findConsoleCommand("test"); if (command) { command.shortName = "mp"; - command.execute = getCommandExecutor("mp", send, localIdToRemoteId); + command.execute = getCommandExecutor("mp", send, localIdToRemoteId) as (...args: unknown[]) => boolean; } - Object.keys(schemas).forEach((commandName: CmdName) => { + (Object.keys(schemas) as any[]).forEach((commandName: CmdName) => { const command = findConsoleCommand(commandName); if (!command || nonVanilaCommands.includes(commandName)) return; - command.execute = getCommandExecutor(commandName, send, localIdToRemoteId); + command.execute = getCommandExecutor(commandName, send, localIdToRemoteId) as (...args: unknown[]) => boolean; }); }; diff --git a/skymp5-client0/src/front/consoleCommands.ts b/skymp5-client/src/front/consoleCommands.ts similarity index 100% rename from skymp5-client0/src/front/consoleCommands.ts rename to skymp5-client/src/front/consoleCommands.ts diff --git a/skymp5-client0/src/front/deathSystem.ts b/skymp5-client/src/front/deathSystem.ts similarity index 73% rename from skymp5-client0/src/front/deathSystem.ts rename to skymp5-client/src/front/deathSystem.ts index 50e6b7c36a..8b8b9d85da 100644 --- a/skymp5-client0/src/front/deathSystem.ts +++ b/skymp5-client/src/front/deathSystem.ts @@ -1,9 +1,9 @@ -import { hooks, Game, printConsole } from "skyrimPlatform"; +import { hooks, Game, printConsole,Actor } from "skyrimPlatform"; let gAllowGetUp = true; export const update = (): void => { - gAllowGetUp = Game.getPlayer().getActorValuePercentage("health") >= 0.05; + gAllowGetUp = (Game.getPlayer() as Actor).getActorValuePercentage("health") >= 0.05; }; hooks.sendAnimationEvent.add({ diff --git a/skymp5-client0/src/front/hostAttempts.ts b/skymp5-client/src/front/hostAttempts.ts similarity index 84% rename from skymp5-client0/src/front/hostAttempts.ts rename to skymp5-client/src/front/hostAttempts.ts index 1d7c0c5b7b..a6c87ff68e 100644 --- a/skymp5-client0/src/front/hostAttempts.ts +++ b/skymp5-client/src/front/hostAttempts.ts @@ -3,7 +3,7 @@ import { storage } from "skyrimPlatform"; storage["hostAttempts"] = []; export const tryHost = (targetRemoteId: number): void => { - storage["hostAttempts"].push(targetRemoteId); + (storage["hostAttempts"] as any).push(targetRemoteId); }; export const nextHostAttempt = (): number | undefined => { diff --git a/skymp5-client0/src/front/index.ts b/skymp5-client/src/front/index.ts similarity index 95% rename from skymp5-client0/src/front/index.ts rename to skymp5-client/src/front/index.ts index 85d3954f30..6758e2bbe9 100644 --- a/skymp5-client0/src/front/index.ts +++ b/skymp5-client/src/front/index.ts @@ -57,7 +57,7 @@ on("update", () => { const d = new Date(); - const gameHour = GlobalVariable.from(Game.getFormEx(gameHourId)); + const gameHour = GlobalVariable.from(Game.getFormEx(gameHourId)) as GlobalVariable; gameHour.setValue( d.getUTCHours() + d.getUTCMinutes() / 60 + @@ -65,16 +65,16 @@ on("update", () => { d.getUTCMilliseconds() / 60 / 60 / 1000 ); - const gameDay = GlobalVariable.from(Game.getFormEx(gameDayId)); + const gameDay = GlobalVariable.from(Game.getFormEx(gameDayId)) as GlobalVariable; gameDay.setValue(d.getUTCDate()); - const gameMonth = GlobalVariable.from(Game.getFormEx(gameMonthId)); + const gameMonth = GlobalVariable.from(Game.getFormEx(gameMonthId)) as GlobalVariable; gameMonth.setValue(d.getUTCMonth()); - const gameYear = GlobalVariable.from(Game.getFormEx(gameYearId)); + const gameYear = GlobalVariable.from(Game.getFormEx(gameYearId)) as GlobalVariable; gameYear.setValue(d.getUTCFullYear() - 2020 + 199); - const timeScale = GlobalVariable.from(Game.getFormEx(timeScaleId)); + const timeScale = GlobalVariable.from(Game.getFormEx(timeScaleId)) as GlobalVariable; timeScale.setValue(1); }); diff --git a/skymp5-client0/src/front/loadGameManager.ts b/skymp5-client/src/front/loadGameManager.ts similarity index 100% rename from skymp5-client0/src/front/loadGameManager.ts rename to skymp5-client/src/front/loadGameManager.ts diff --git a/skymp5-client0/src/front/messages.ts b/skymp5-client/src/front/messages.ts similarity index 100% rename from skymp5-client0/src/front/messages.ts rename to skymp5-client/src/front/messages.ts diff --git a/skymp5-client0/src/front/model.ts b/skymp5-client/src/front/model.ts similarity index 100% rename from skymp5-client0/src/front/model.ts rename to skymp5-client/src/front/model.ts diff --git a/skymp5-client0/src/front/modelSource.ts b/skymp5-client/src/front/modelSource.ts similarity index 100% rename from skymp5-client0/src/front/modelSource.ts rename to skymp5-client/src/front/modelSource.ts diff --git a/skymp5-client0/src/front/msgHandler.ts b/skymp5-client/src/front/msgHandler.ts similarity index 100% rename from skymp5-client0/src/front/msgHandler.ts rename to skymp5-client/src/front/msgHandler.ts diff --git a/skymp5-client0/src/front/networking.ts b/skymp5-client/src/front/networking.ts similarity index 100% rename from skymp5-client0/src/front/networking.ts rename to skymp5-client/src/front/networking.ts diff --git a/skymp5-client0/src/front/remoteServer.ts b/skymp5-client/src/front/remoteServer.ts similarity index 92% rename from skymp5-client0/src/front/remoteServer.ts rename to skymp5-client/src/front/remoteServer.ts index 0aef6ac5cb..0ddbfc6e66 100644 --- a/skymp5-client0/src/front/remoteServer.ts +++ b/skymp5-client/src/front/remoteServer.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-empty-function */ import * as networking from "./networking"; -import { WorldModel } from "./model"; +import { FormModel, WorldModel } from "./model"; import { MsgHandler } from "./msgHandler"; import { ModelSource } from "./modelSource"; import { SendTarget } from "./sendTarget"; @@ -22,6 +22,7 @@ import { Ui, settings, Armor, + Actor, } from "skyrimPlatform"; import * as loadGameManager from "./loadGameManager"; import { applyInventory, Inventory } from "./components/inventory"; @@ -54,7 +55,7 @@ if (Array.isArray(storage["eventSourceContexts"])) { storage["eventSourceContexts"] = storage["eventSourceContexts"].filter( (ctx: Record) => !ctx._expired ); - storage["eventSourceContexts"].forEach((ctx: any) => { + (storage["eventSourceContexts"] as any).forEach((ctx: any) => { setupEventSource(ctx); }); } @@ -146,10 +147,10 @@ if (storage["taskVerifySourceCode"] === true) { export const getPcInventory = (): Inventory => { const res = storage["pcInv"]; - if (typeof res === "object" && res["entries"]) { - return res; + if (typeof res === "object" && (res as any)["entries"]) { + return res as unknown as Inventory; } - return null; + return null as unknown as Inventory; }; const setPcInventory = (inv: Inventory): void => { @@ -162,7 +163,7 @@ on("update", () => { if (Date.now() - pcInvLastApply > 5000) { pcInvLastApply = Date.now(); const pcInv = getPcInventory(); - if (pcInv) applyInventory(Game.getPlayer(), pcInv, false, true); + if (pcInv) applyInventory(Game.getPlayer() as Actor, pcInv, false, true); } }); @@ -177,7 +178,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { openContainer(msg: messages.OpenContainer): void { once("update", async () => { await Utility.wait(0.1); // Give a chance to update inventory - ObjectReference.from(Game.getFormEx(msg.target)).activate( + (ObjectReference.from(Game.getFormEx(msg.target)) as ObjectReference).activate( Game.getPlayer(), true ); @@ -215,7 +216,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { msg.rot[2] ); Utility.wait(0.2).then(() => { - Game.getPlayer().setAngle(msg.rot[0], msg.rot[1], msg.rot[2]); + (Game.getPlayer() as Actor).setAngle(msg.rot[0], msg.rot[1], msg.rot[2]); }); }); } @@ -226,8 +227,8 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { const i = this.getIdManager().allocateIdFor(msg.idx); if (this.worldModel.forms.length <= i) this.worldModel.forms.length = i + 1; - let movement: Movement = null; - if (msg.refrId >= 0xff000000) { + let movement: Movement = null as unknown as Movement; + if (msg.refrId as number >= 0xff000000) { movement = { pos: msg.transform.pos, rot: msg.transform.rot, @@ -282,7 +283,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { const applyPcInv = () => { applyInventory( - Game.getPlayer(), + Game.getPlayer() as Actor, msg.equipment ? { entries: msg.equipment.inv.entries.filter( @@ -292,10 +293,10 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { : { entries: [] }, false ); - if (msg.props.inventory) + if (msg.props && msg.props.inventory) this.setInventory({ type: "setInventory", - inventory: msg.props.inventory as Inventory, + inventory: (msg.props as any).inventory as Inventory, }); }; @@ -354,8 +355,8 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { if (msg.look) { applyLookToPlayer(msg.look); if (msg.look.isFemale) - // Fix gender-related walking anim - Game.getPlayer().resurrect(); + // Fix gender-specific walking anim + (Game.getPlayer() as Actor).resurrect(); } }); } @@ -366,7 +367,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { destroyActor(msg: messages.DestroyActorMessage): void { const i = this.getIdManager().getId(msg.idx); - this.worldModel.forms[i] = null; + this.worldModel.forms[i] = null as unknown as FormModel; // Shrink to fit while (1) { @@ -392,7 +393,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { if (!this.worldModel.forms[i].numMovementChanges) { this.worldModel.forms[i].numMovementChanges = 0; } - this.worldModel.forms[i].numMovementChanges++; + (this.worldModel.forms[i].numMovementChanges as number)++; } UpdateAnimation(msg: messages.UpdateAnimationMessage): void { @@ -406,7 +407,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { if (!this.worldModel.forms[i].numLookChanges) { this.worldModel.forms[i].numLookChanges = 0; } - this.worldModel.forms[i].numLookChanges++; + (this.worldModel.forms[i].numLookChanges as number)++; } UpdateEquipment(msg: messages.UpdateEquipmentMessage): void { @@ -437,7 +438,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { once("update", () => Utility.wait(0.3).then(() => { const ironHelment = Armor.from(Game.getFormEx(0x00012e4d)); - Game.getPlayer().unequipItem(ironHelment, false, true); + (Game.getPlayer() as Actor).unequipItem(ironHelment, false, true); Game.showRaceMenu(); }) ); @@ -496,13 +497,13 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { storage[storageVar] = JSON.parse(JSON.stringify(functionSources)); for (const propName of Object.keys(functionSources)) { try { - storage[storageVar][propName] = new Function( + (storage[storageVar] as any)[propName] = new Function( "ctx", - storage[storageVar][propName] + (storage[storageVar] as any)[propName] ); const emptyFunction = functionSources[propName] === ""; if (emptyFunction) { - delete storage[storageVar][propName]; + delete (storage[storageVar] as any)[propName]; printConsole(`'${storageVar}.${propName}' -`, "Added empty"); } else { printConsole(`'${storageVar}.${propName}' -`, "Added"); @@ -511,7 +512,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { printConsole(`'${storageVar}.${propName}' -`, e); } } - storage[`${storageVar}_keys`] = Object.keys(storage[storageVar]); + storage[`${storageVar}_keys`] = Object.keys(storage[storageVar] as any); } updateGamemodeData(msg: messages.UpdateGamemodeDataMessage): void { @@ -568,7 +569,7 @@ export class RemoteServer implements MsgHandler, ModelSource, SendTarget { _eventName: eventName, state: {}, }; - storage["eventSourceContexts"].push(ctx); + (storage["eventSourceContexts"] as Record).push(ctx); setupEventSource(ctx); } catch (e) { printConsole(`'eventSources.${eventName}' -`, e); diff --git a/skymp5-client0/src/front/sendTarget.ts b/skymp5-client/src/front/sendTarget.ts similarity index 100% rename from skymp5-client0/src/front/sendTarget.ts rename to skymp5-client/src/front/sendTarget.ts diff --git a/skymp5-client0/src/front/skympClient.ts b/skymp5-client/src/front/skympClient.ts similarity index 88% rename from skymp5-client0/src/front/skympClient.ts rename to skymp5-client/src/front/skympClient.ts index a9e766ddfc..f81f8aecb6 100644 --- a/skymp5-client0/src/front/skympClient.ts +++ b/skymp5-client/src/front/skympClient.ts @@ -38,8 +38,8 @@ interface AnyMessage { t?: number; } const handleMessage = (msgAny: AnyMessage, handler_: MsgHandler) => { - const msgType: string = msgAny.type || MsgType[msgAny.t]; - const handler = (handler_ as unknown) as Record< + const msgType: string = msgAny.type || (MsgType as any)[(msgAny.t as any)]; + const handler = handler_ as unknown as Record< string, (m: AnyMessage) => void >; @@ -65,8 +65,8 @@ const handleMessage = (msgAny: AnyMessage, handler_: MsgHandler) => { storage["hosted"] = hosted; } - if (!hosted.includes(target)) { - hosted.push(target); + if (!(hosted as Array).includes(target)) { + (hosted as Array).push(target); } } @@ -88,8 +88,8 @@ for (let i = 0; i < 100; ++i) printConsole(); printConsole("Hello Multiplayer"); printConsole("settings:", settings["skymp5-client"]); -const targetIp = settings["skymp5-client"]["server-ip"]; -const targetPort = settings["skymp5-client"]["server-port"]; +const targetIp = settings["skymp5-client"]["server-ip"] as string; +const targetPort = settings["skymp5-client"]["server-port"] as number; if (storage.targetIp !== targetIp || storage.targetPort !== targetPort) { storage.targetIp = targetIp; @@ -114,7 +114,7 @@ export class SkympClient { printConsole("Connection failed"); }); - networking.on("connectionDenied", (err: string) => { + networking.on("connectionDenied", (err: Record | string) => { printConsole("Connection denied: ", err); }); @@ -126,8 +126,8 @@ export class SkympClient { this.msgHandler.handleDisconnect(); }); - networking.on("message", (msgAny: Record) => { - handleMessage(msgAny, this.msgHandler); + networking.on("message", (msgAny: Record | string) => { + handleMessage(msgAny as Record, this.msgHandler as MsgHandler); }); on("update", () => { @@ -149,7 +149,7 @@ export class SkympClient { }); on("activate", (e) => { - lastInv = getInventory(Game.getPlayer()); + lastInv = getInventory(Game.getPlayer() as Actor); let caster = e.caster ? e.caster.getFormID() : 0; let target = e.target ? e.target.getFormID() : 0; @@ -191,7 +191,7 @@ export class SkympClient { const baseObjId = e.baseObj ? e.baseObj.getFormID() : 0; if (oldContainerId !== 0x14 && newContainerId !== 0x14) return; - const furnitureRef = Game.getPlayer().getFurnitureReference(); + const furnitureRef = (Game.getPlayer() as Actor).getFurnitureReference(); if (!furnitureRef) return; const furrnitureId = furnitureRef.getFormID(); @@ -243,7 +243,7 @@ export class SkympClient { if (!lastInv) lastInv = getPcInventory(); if (lastInv) { printConsole(2); - const newInv = getInventory(Game.getPlayer()); + const newInv = getInventory(Game.getPlayer() as Actor); // It seems that 'ignoreWorn = false' fixes this: // https://github.com/skyrim-multiplayer/issue-tracker/issues/43 @@ -365,11 +365,11 @@ export class SkympClient { false ); if ( - storage._api_onAnimationEvent && - storage._api_onAnimationEvent.callback + (storage as Record)._api_onAnimationEvent && + (storage as Record)._api_onAnimationEvent.callback ) { try { - storage._api_onAnimationEvent.callback( + (storage as Record)._api_onAnimationEvent.callback( _refrId ? _refrId : 0x14, anim.animEventName ); @@ -389,7 +389,7 @@ export class SkympClient { if (!shown) { printConsole("Exited from race menu"); - const look = getLook(Game.getPlayer()); + const look = getLook(Game.getPlayer() as Actor); this.sendTarget.send( { t: MsgType.UpdateLook, data: look, _refrId }, true @@ -405,7 +405,7 @@ export class SkympClient { ++this.numEquipmentChanges; - const eq = getEquipment(Game.getPlayer(), this.numEquipmentChanges); + const eq = getEquipment(Game.getPlayer() as Actor, this.numEquipmentChanges); this.sendTarget.send( { t: MsgType.UpdateEquipment, data: eq, _refrId }, true @@ -424,7 +424,7 @@ export class SkympClient { private sendInputs() { const hosted = typeof storage["hosted"] === typeof [] ? storage["hosted"] : []; - const targets = [undefined].concat(hosted); + const targets = [undefined].concat(hosted as any); //printConsole({ targets }); targets.forEach((target) => { this.sendMovement(target); @@ -436,19 +436,17 @@ export class SkympClient { } private resetRemoteServer() { - const prevRemoteServer: RemoteServer = storage.remoteServer; + const prevRemoteServer: RemoteServer = storage.remoteServer as RemoteServer; let rs: RemoteServer; - if (prevRemoteServer && prevRemoteServer.getWorldModel) { + if (prevRemoteServer && prevRemoteServer.getWorldModel as unknown) { rs = prevRemoteServer; printConsole("Restore previous RemoteServer"); // Keep previous RemoteServer, but update func implementations - const newObj: Record< - string, - unknown - > = (new RemoteServer() as unknown) as Record; - const rsAny: Record = (rs as unknown) as Record< + const newObj: Record = + new RemoteServer() as unknown as Record; + const rsAny: Record = rs as unknown as Record< string, unknown >; @@ -467,7 +465,7 @@ export class SkympClient { } private resetView() { - const prevView: WorldView = storage.view; + const prevView: WorldView = storage.view as WorldView; const view = new WorldView(); once("update", () => { if (prevView && prevView.destroy) { @@ -477,7 +475,8 @@ export class SkympClient { storage.view = view; }); on("update", () => { - if (!this.singlePlayer) view.update(this.modelSource.getWorldModel()); + if (!this.singlePlayer) + view.update((this.modelSource as ModelSource).getWorldModel()); }); } @@ -496,9 +495,9 @@ export class SkympClient { private playerAnimSource = new Map(); private lastSendMovementMoment = new Map(); private lastAnimationSent = new Map(); - private msgHandler?: MsgHandler; + private msgHandler: MsgHandler = undefined as unknown as MsgHandler; private modelSource?: ModelSource; - private sendTarget?: SendTarget; + private sendTarget: SendTarget = undefined as unknown as SendTarget; private isRaceSexMenuShown = false; private singlePlayer = false; private equipmentChanged = false; @@ -507,5 +506,5 @@ export class SkympClient { once("update", () => { // Is it racing with OnInit in Papyrus? - sp.TESModPlatform.blockPapyrusEvents(true); + (sp.TESModPlatform as any).blockPapyrusEvents(true); }); diff --git a/skymp5-client0/src/front/spSnippet.ts b/skymp5-client/src/front/spSnippet.ts similarity index 90% rename from skymp5-client0/src/front/spSnippet.ts rename to skymp5-client/src/front/spSnippet.ts index b6699bebde..6364b6b680 100644 --- a/skymp5-client0/src/front/spSnippet.ts +++ b/skymp5-client/src/front/spSnippet.ts @@ -1,5 +1,5 @@ -import { Game, Form } from "../skyrim-platform/skyrimPlatform"; -import * as sp from "../skyrim-platform/skyrimPlatform"; +import { Game, Form } from "skyrimPlatform"; +import * as sp from "skyrimPlatform"; const spAny = sp as Record; @@ -48,14 +48,14 @@ const runStatic = async (snippet: Snippet): Promise => { export const run = async (snippet: Snippet): Promise => { if (snippet.class === "SkympHacks") { if (snippet.function === "AddItem" || snippet.function === "RemoveItem") { - const form = Form.from(deserializeArg(snippet.arguments[0])); + const form = Form.from(deserializeArg(snippet.arguments[0])) as Form; const sign = snippet.function === "AddItem" ? "+" : "-"; const count = snippet.arguments[1]; let soundId = 0x334ab; if (form.getFormID() !== 0xf) soundId = 0x14115; - sp.Sound.from(Game.getFormEx(soundId)).play(Game.getPlayer()); + (sp.Sound.from(Game.getFormEx(soundId)) as sp.Sound).play(Game.getPlayer()); if (count > 0) sp.Debug.notification(sign + " " + form.getName() + " (" + count + ")"); diff --git a/skymp5-client0/src/front/updateOwner.ts b/skymp5-client/src/front/updateOwner.ts similarity index 82% rename from skymp5-client0/src/front/updateOwner.ts rename to skymp5-client/src/front/updateOwner.ts index 1e48562d5a..48baa8314e 100644 --- a/skymp5-client0/src/front/updateOwner.ts +++ b/skymp5-client/src/front/updateOwner.ts @@ -10,9 +10,9 @@ export const setOwnerModel = (ownerModel: FormModel): void => { export const setup = (): void => { const ctx = { sp: sp, - refr: undefined as sp.ObjectReference, + refr: undefined as unknown as sp.ObjectReference, value: undefined as unknown, - _model: undefined as FormModel, + _model: undefined as unknown as FormModel, getFormIdInServerFormat: (clientsideFormId: number) => { return view.localIdToRemoteId(clientsideFormId); }, @@ -20,7 +20,7 @@ export const setup = (): void => { return view.remoteIdToLocalId(serversideFormId); }, get(propName: string) { - return this._model[propName]; + return (this._model as Record)[propName]; }, state: {}, }; @@ -36,7 +36,7 @@ export const setup = (): void => { const ownerModel = sp.storage["ownerModel"] as FormModel; for (const propName of keys) { - const f = funcs[propName]; + const f = (funcs as Record)[propName]; // Actually, must always be a valid funciton, but who knows if (!f) continue; @@ -46,7 +46,9 @@ export const setup = (): void => { ctx.value = (ctx._model as Record)[propName]; if (ctx.value === undefined) continue; - ctx.refr = sp.ObjectReference.from(sp.Game.getPlayer()); + ctx.refr = sp.ObjectReference.from( + sp.Game.getPlayer() + ) as sp.ObjectReference; ctx._model = ownerModel; try { if (f) f(ctx); diff --git a/skymp5-client0/src/front/version.ts b/skymp5-client/src/front/version.ts similarity index 100% rename from skymp5-client0/src/front/version.ts rename to skymp5-client/src/front/version.ts diff --git a/skymp5-client0/src/front/view.ts b/skymp5-client/src/front/view.ts similarity index 88% rename from skymp5-client0/src/front/view.ts rename to skymp5-client/src/front/view.ts index 6885a6a14a..eed63d0f03 100644 --- a/skymp5-client0/src/front/view.ts +++ b/skymp5-client/src/front/view.ts @@ -28,6 +28,7 @@ import { modWcProtection } from "./worldCleaner"; import { applyInventory } from "./components/inventory"; import { tryHost } from "./hostAttempts"; import { getMovement } from "./components/movementGet"; +import { Movement } from "../lib/structures/movement"; let gCrosshairRefId = 0; let gPcInJumpState = false; @@ -42,7 +43,10 @@ on("tick", () => { } else { gUpdateNeighborFunctionsKeys = []; } - gUpdateNeighborFunctions = storage["updateNeighborFunctions"]; + gUpdateNeighborFunctions = storage["updateNeighborFunctions"] as Record< + string, + any + >; }); export interface View { @@ -86,7 +90,8 @@ const tryHostIfNeed = (ac: Actor, remoteId: number) => { lastTryHost[remoteId] = Date.now(); if ( - getMovement(ac).worldOrCell === getMovement(Game.getPlayer()).worldOrCell + getMovement(ac).worldOrCell === + getMovement(Game.getPlayer() as Actor).worldOrCell ) { return tryHost(remoteId); } @@ -121,7 +126,7 @@ function dealWithRef(ref: ObjectReference, base: Form): void { } // https://github.com/skyrim-multiplayer/issue-tracker/issues/36 if (isFlora) { - const hasIngr = sp.Flora.from(base).getIngredient() != null; + const hasIngr = (sp.Flora.from(base) as sp.Flora).getIngredient() != null; if (hasIngr) ref.setMotionType(MotionType.Keyframed, false); } } @@ -168,18 +173,21 @@ const getDefaultEquipState = () => { interface LookState { lastNumChanges: number; - look: Look; + look: Look | null; } const getDefaultLookState = (): LookState => { return { lastNumChanges: 0, look: null }; }; -const undefinedRefr: ObjectReference = undefined; +const undefinedRefr: ObjectReference = undefined as unknown as ObjectReference; const unknownValue: unknown = undefined; -const undefinedFormModel: FormModel = undefined; -const undefinedObject: Record = undefined; -const undefinedView: FormViewArray = undefined; +const undefinedFormModel: FormModel = undefined as unknown as FormModel; +const undefinedObject: Record = undefined as unknown as Record< + string, + unknown +>; +const undefinedView: FormViewArray = undefined as unknown as FormViewArray; const ctx = { refr: undefinedRefr, value: unknownValue, @@ -195,7 +203,7 @@ const ctx = { return remoteIdToLocalId(serversideFormId); }, get(propName: string) { - return this._model[propName]; + return (this._model as Record)[propName]; }, respawn() { this._view.destroyForm(this.i); @@ -227,7 +235,8 @@ export class FormView implements View { // Players with different worldOrCell should be invisible if (model.movement) { const worldOrCell = - Game.getPlayer().getWorldSpace() || Game.getPlayer().getParentCell(); + (Game.getPlayer() as Actor).getWorldSpace() || + (Game.getPlayer() as Actor).getParentCell(); if ( worldOrCell && model.movement.worldOrCell !== worldOrCell.getFormID() @@ -245,7 +254,7 @@ export class FormView implements View { model.numLookChanges !== this.lookState.lastNumChanges ) { this.lookState.look = model.look; - this.lookState.lastNumChanges = model.numLookChanges; + this.lookState.lastNumChanges = model.numLookChanges as number; this.lookBasedBaseId = 0; } } @@ -255,7 +264,7 @@ export class FormView implements View { if (refId) { if (this.refrId !== refId) { this.destroy(); - this.refrId = model.refrId; + this.refrId = model.refrId as number; this.ready = true; const refr = ObjectReference.from(Game.getFormEx(this.refrId)); if (refr) { @@ -265,26 +274,32 @@ export class FormView implements View { } } else { const base = - getFormEx(+model.baseId) || getFormEx(this.getLookBasedBase()); + getFormEx(+(model.baseId as number)) || + getFormEx(this.getLookBasedBase()); if (!base) return; let refr = ObjectReference.from(Game.getFormEx(this.refrId)); const respawnRequired = !refr || !refr.getBaseObject() || - refr.getBaseObject().getFormID() !== base.getFormID(); + (refr.getBaseObject() as Form).getFormID() !== base.getFormID(); if (respawnRequired) { this.destroy(); - refr = Game.getPlayer().placeAtMe(base, 1, true, true); + refr = (Game.getPlayer() as Actor).placeAtMe( + base, + 1, + true, + true + ) as ObjectReference; this.state = {}; delete this.wasHostedByOther; const kTypeNpc = 43; if (base.getType() !== kTypeNpc) { refr.setAngle( - model.movement.rot[0], - model.movement.rot[1], - model.movement.rot[2] + model.movement?.rot[0] || 0, + model.movement?.rot[1] || 0, + model.movement?.rot[2] || 0 ); } modWcProtection(refr.getFormID(), 1); @@ -294,13 +309,13 @@ export class FormView implements View { this.ready = false; new SpawnProcess( - this.lookState.look, + this.lookState.look as Look, model.movement ? model.movement.pos : [ - Game.getPlayer().getPositionX(), - Game.getPlayer().getPositionY(), - Game.getPlayer().getPositionZ(), + (Game.getPlayer() as Actor).getPositionX(), + (Game.getPlayer() as Actor).getPositionY(), + (Game.getPlayer() as Actor).getPositionZ(), ], refr.getFormID(), () => { @@ -311,7 +326,7 @@ export class FormView implements View { if (model.look && model.look.name) refr.setDisplayName("" + model.look.name, true); } - this.refrId = refr.getFormID(); + this.refrId = (refr as ObjectReference).getFormID(); } if (!this.ready) return; @@ -370,7 +385,7 @@ export class FormView implements View { if (t >= 38 && t <= 39) { const wasHarvested = refr.isHarvested(); if (isHarvested != wasHarvested) { - let ac: Actor; + let ac: Actor = undefined as unknown as Actor; if (isHarvested) for (let i = 0; i < 20; ++i) { ac = Game.findRandomActor( @@ -378,7 +393,7 @@ export class FormView implements View { refr.getPositionY(), refr.getPositionZ(), 10000 - ); + ) as Actor; if (ac && ac.getFormID() !== 0x14) { break; } @@ -475,14 +490,15 @@ export class FormView implements View { this.movState.lastRehost = Date.now(); const remoteId = this.remoteRefrId; if (ac && ac.is3DLoaded()) { - tryHostIfNeed(ac, remoteId); + tryHostIfNeed(ac, remoteId as number); printConsole("try to rehost"); } } } if ( - +model.numMovementChanges !== this.movState.lastNumChanges || + +(model.numMovementChanges as number) !== + this.movState.lastNumChanges || Date.now() - this.movState.lastApply > 2000 ) { this.movState.lastApply = Date.now(); @@ -494,7 +510,7 @@ export class FormView implements View { applyMovement(refr, model.movement); model.movement.isWeapDrawn = backup; - this.movState.lastNumChanges = +model.numMovementChanges; + this.movState.lastNumChanges = +(model.numMovementChanges as number); this.movState.everApplied = true; } else { if (ac) ac.clearKeepOffsetFromActor(); @@ -537,7 +553,7 @@ export class FormView implements View { this.isOnScreen = isOnScreen; if (isOnScreen) { actor.queueNiNodeUpdate(); - Game.getPlayer().queueNiNodeUpdate(); + (Game.getPlayer() as Actor).queueNiNodeUpdate(); } } } @@ -588,7 +604,7 @@ export class FormView implements View { } getRemoteRefrId(): number { - return this.remoteRefrId; + return this.remoteRefrId as number; } private refrId = 0; @@ -624,7 +640,7 @@ class FormViewArray { destroyForm(i: number) { if (!this.formViews[i]) return; this.formViews[i].destroy(); - this.formViews[i] = undefined; + this.formViews[i] = undefined as unknown as FormView; } resize(newSize: number) { @@ -645,12 +661,16 @@ class FormViewArray { } const form = forms[i]; - let realPos: NiPoint3; + let realPos: NiPoint3 = undefined as unknown as NiPoint3; const offset = form.movement && (model.playerCharacterFormIdx === i || isCloneView); if (offset) { - realPos = form.movement.pos; - form.movement.pos = [realPos[0] + 128, realPos[1] + 128, realPos[2]]; + realPos = (form.movement as Movement).pos; + (form.movement as Movement).pos = [ + realPos[0] + 128, + realPos[1] + 128, + realPos[2], + ]; } if (isCloneView) { // Prevent using the same refr by normal and clone views @@ -666,7 +686,7 @@ class FormViewArray { } if (offset) { - form.movement.pos = realPos; + (form.movement as Movement).pos = realPos as NiPoint3; } } } @@ -698,9 +718,9 @@ export class WorldView implements View { // Default nord in Race Menu will have very ugly face // If other players are spawning when we show this menu on("update", () => { - const pc = Game.getPlayer(); + const pc = Game.getPlayer() as Actor; const pcWorldOrCell = ( - pc.getWorldSpace() || pc.getParentCell() + (pc.getWorldSpace() || pc.getParentCell()) as Form ).getFormID(); if (this.pcWorldOrCell !== pcWorldOrCell) { if (this.pcWorldOrCell) { @@ -743,13 +763,13 @@ export class WorldView implements View { const crosshair = Game.getCurrentCrosshairRef(); gCrosshairRefId = crosshair ? crosshair.getFormID() : 0; - gPcInJumpState = Game.getPlayer().getAnimationVariableBool("bInJumpState"); + gPcInJumpState = (Game.getPlayer() as Actor).getAnimationVariableBool("bInJumpState"); const pcWorldOrCell = - Game.getPlayer().getWorldSpace() || Game.getPlayer().getParentCell(); + (Game.getPlayer() as Actor).getWorldSpace() || (Game.getPlayer() as Actor).getParentCell(); gPcWorldOrCellId = pcWorldOrCell ? pcWorldOrCell.getFormID() : 0; - this.formViews.updateAll(model, showMe, false); + this.formViews.updateAll(model, showMe as boolean, false); if (showClones) { this.cloneFormViews.updateAll(model, false, true); diff --git a/skymp5-client0/src/front/worldCleaner.ts b/skymp5-client/src/front/worldCleaner.ts similarity index 90% rename from skymp5-client0/src/front/worldCleaner.ts rename to skymp5-client/src/front/worldCleaner.ts index 139f160cbd..4508593326 100644 --- a/skymp5-client0/src/front/worldCleaner.ts +++ b/skymp5-client/src/front/worldCleaner.ts @@ -6,16 +6,16 @@ const isInDialogue = (ac: Actor): boolean => ac.isInDialogueWithPlayer() || !!ac.getDialogueTarget(); function processOneActor(): void { - const pc = Game.getPlayer(); + const pc = Game.getPlayer() as Actor; const actor = Game.findRandomActor( pc.getPositionX(), pc.getPositionY(), pc.getPositionZ(), 8192 - ); + ) as Actor; const actorId = actor.getFormID(); - const currentProtection = protection.get(actorId); + const currentProtection = protection.get(actorId) as number; if (currentProtection > 0) return; if (!actor || actorId === 0x14 || actor.isDisabled() || actor.isDeleted()) diff --git a/skymp5-client0/src/lib/helloWorld.ts b/skymp5-client/src/lib/helloWorld.ts similarity index 100% rename from skymp5-client0/src/lib/helloWorld.ts rename to skymp5-client/src/lib/helloWorld.ts diff --git a/skymp5-client0/src/lib/idManager.ts b/skymp5-client/src/lib/idManager.ts similarity index 96% rename from skymp5-client0/src/lib/idManager.ts rename to skymp5-client/src/lib/idManager.ts index 808b505dfd..990e3e2cf9 100644 --- a/skymp5-client0/src/lib/idManager.ts +++ b/skymp5-client/src/lib/idManager.ts @@ -22,7 +22,7 @@ export class IdManager { } freeIdFor(value: number): void { - const id = this.idByValue[value]; + const id = this.idByValue[value] as number; if (id < this.minimumUnusedId) { this.minimumUnusedId = id; } diff --git a/skymp5-client0/src/lib/structures/animation.ts b/skymp5-client/src/lib/structures/animation.ts similarity index 100% rename from skymp5-client0/src/lib/structures/animation.ts rename to skymp5-client/src/lib/structures/animation.ts diff --git a/skymp5-client0/src/lib/structures/equipment.ts b/skymp5-client/src/lib/structures/equipment.ts similarity index 100% rename from skymp5-client0/src/lib/structures/equipment.ts rename to skymp5-client/src/lib/structures/equipment.ts diff --git a/skymp5-client0/src/lib/structures/inventory.ts b/skymp5-client/src/lib/structures/inventory.ts similarity index 100% rename from skymp5-client0/src/lib/structures/inventory.ts rename to skymp5-client/src/lib/structures/inventory.ts diff --git a/skymp5-client0/src/lib/structures/look.ts b/skymp5-client/src/lib/structures/look.ts similarity index 100% rename from skymp5-client0/src/lib/structures/look.ts rename to skymp5-client/src/lib/structures/look.ts diff --git a/skymp5-client0/src/lib/structures/movement.ts b/skymp5-client/src/lib/structures/movement.ts similarity index 100% rename from skymp5-client0/src/lib/structures/movement.ts rename to skymp5-client/src/lib/structures/movement.ts diff --git a/skymp5-client/tsconfig.json b/skymp5-client/tsconfig.json new file mode 100644 index 0000000000..f8ea09b3b8 --- /dev/null +++ b/skymp5-client/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": "../build/dist/client/Data/Platform/Modules", + "outFile": "../build/dist/client/Data/Platform/Plugins/skymp5-client.js", + "noImplicitAny": true, + "lib": ["ES2015", "es2017"], + "strict": true, + "skipLibCheck": true, + "module": "System", + "target": "ES5", + "rootDir": "" + }, + "include": ["src"] +} diff --git a/skymp5-client0/.github/workflows/deploy.yml b/skymp5-client0/.github/workflows/deploy.yml deleted file mode 100644 index c1f4cf7b14..0000000000 --- a/skymp5-client0/.github/workflows/deploy.yml +++ /dev/null @@ -1,10 +0,0 @@ -on: - pull_request: -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - run: npm install - - run: npm run build - - run: npm run test diff --git a/skymp5-client0/.github/workflows/pull_request.yml b/skymp5-client0/.github/workflows/pull_request.yml deleted file mode 100644 index c1f4cf7b14..0000000000 --- a/skymp5-client0/.github/workflows/pull_request.yml +++ /dev/null @@ -1,10 +0,0 @@ -on: - pull_request: -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - run: npm install - - run: npm run build - - run: npm run test diff --git a/skymp5-client0/README.md b/skymp5-client0/README.md deleted file mode 100644 index 0da416a1d1..0000000000 --- a/skymp5-client0/README.md +++ /dev/null @@ -1 +0,0 @@ -# skymp5-client diff --git a/skymp5-client0/package-lock.json b/skymp5-client0/package-lock.json deleted file mode 100644 index 59ea7d300e..0000000000 --- a/skymp5-client0/package-lock.json +++ /dev/null @@ -1,4812 +0,0 @@ -{ - "name": "skymp5-client", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "dev": true, - "requires": { - "@babel/types": "^7.12.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", - "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.20", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", - "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/node": { - "version": "14.14.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", - "integrity": "sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "dependencies": { - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "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" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "26.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", - "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", - "dev": true, - "requires": { - "@types/jest": "26.x", - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/skymp5-client0/package.json b/skymp5-client0/package.json deleted file mode 100644 index de1154f76f..0000000000 --- a/skymp5-client0/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "skymp5-client", - "version": "1.0.0", - "description": "", - "scripts": { - "watch": "tsc --p tsconfig.front.json -w", - "build": "tsc --p tsconfig.front.json", - "test": "jest --forceExit --coverage --verbose" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/skyrim-multiplayer/skymp5-client.git" - }, - "keywords": [], - "author": "Leonid Pospelov (https://skymp.io)", - "license": "SEE LICENSE IN 'LICENSE' FILE", - "bugs": { - "url": "https://github.com/skyrim-multiplayer/skymp5-client/issues" - }, - "homepage": "https://github.com/skyrim-multiplayer/skymp5-client#readme", - "devDependencies": { - "@types/jest": "^26.0.20", - "jest": "^26.6.3", - "ts-jest": "^26.4.4", - "typescript": "^4.1.3" - }, - "jest": { - "transform": { - "^.+\\.jsx?$": "babel-jest", - "^.+\\.tsx?$": "ts-jest" - } - } -} diff --git a/skymp5-client0/src/skyrim-platform/skyrimPlatform.ts b/skymp5-client0/src/skyrim-platform/skyrimPlatform.ts deleted file mode 100644 index 04791eabbc..0000000000 --- a/skymp5-client0/src/skyrim-platform/skyrimPlatform.ts +++ /dev/null @@ -1,2867 +0,0 @@ -// Generated automatically. Do not edit. -export declare function printConsole(...arguments: any[]): void; -export declare function writeScript(scriptName: string, src: string): void; -export declare function callNative( - className: string, - functionName: string, - self?: object, - ...args: any -): any; -export declare function getJsMemoryUsage(): number; -export declare function getPluginSourceCode(pluginName: string): string; -export declare function writePlugin( - pluginName: string, - newSources: string -): string; -export declare function getPlatformVersion(): string; -export declare let storage: any; -export declare let settings: any; - -export declare function on(eventName: "update", callback: () => void): void; -export declare function once(eventName: "update", callback: () => void): void; - -export declare function on(eventName: "tick", callback: () => void): void; -export declare function once(eventName: "tick", callback: () => void): void; - -export interface Face { - hairColor: number; - bodySkinColor: number; - headTextureSetId: number; - headPartIds: number[]; - presets: number[]; -} - -export interface ChangeFormNpc { - raceId?: number; - name?: string; - face?: Face; -} - -export declare function loadGame( - pos: number[], - angle: number[], - worldOrCell: number, - changeFormNpc?: ChangeFormNpc -): void; - -export declare function worldPointToScreenPoint( - ...args: number[][] -): number[][]; - -export type PacketType = - | "message" - | "disconnect" - | "connectionAccepted" - | "connectionFailed" - | "connectionDenied"; - -// Available only if multiplayer is installed on user's machine -interface MpClientPlugin { - getVersion(): string; - createClient(host: string, port: number): void; - destroyClient(): void; - isConnected(): boolean; - tick( - tickHandler: ( - packetType: PacketType, - jsonContent: string, - error: string - ) => void - ): void; - send(jsonContent: string, reliable: boolean): void; -} -export declare let mpClientPlugin: MpClientPlugin; - -export interface Browser { - setVisible(visible: boolean): void; - setFocused(focused: boolean): void; - loadUrl(url: string): void; - getToken(): string; -} -export declare let browser: Browser; - -export interface ExtraData { - type: - | "Health" - | "Count" - | "Enchantment" - | "Charge" - | "TextDisplayData" - | "Soul" - | "Poison" - | "Worn" - | "WornLeft"; -} -export interface ExtraHealth extends ExtraData { - type: "Health"; - health: number; -} -export interface ExtraCount extends ExtraData { - type: "Count"; - count: number; -} -export interface ExtraEnchantment extends ExtraData { - type: "Enchantment"; - enchantmentId: number; - maxCharge: number; - removeOnUnequip: boolean; -} -export interface ExtraCharge extends ExtraData { - type: "Charge"; - charge: number; -} -export interface ExtraTextDisplayData extends ExtraData { - type: "TextDisplayData"; - name: string; -} -export interface ExtraSoul extends ExtraData { - type: "Soul"; - soul: 0 | 1 | 2 | 3 | 4 | 5; -} -export interface ExtraPoison extends ExtraData { - type: "Poison"; - poisonId: number; - count: number; -} -export interface ExtraWorn extends ExtraData { - type: "Worn"; -} -export interface ExtraWornLeft extends ExtraData { - type: "WornLeft"; -} -export type BaseExtraList = ExtraData[]; -export interface InventoryChangesEntry { - countDelta: number; - baseId: number; - extendDataList: BaseExtraList[]; -} -export declare let getExtraContainerChanges: ( - objectReferenceId: number -) => InventoryChangesEntry[]; - -export interface InventoryEntry { - count: number; - baseId: number; -} -export declare let getContainer: (baseId: number) => InventoryEntry[]; - -export interface ActivateEvent { - target: ObjectReference; - caster: ObjectReference; - isCrimeToActivate: boolean; -} - -export interface MoveAttachDetachEvent { - movedRef: ObjectReference; - isCellAttached: boolean; -} -export interface WaitStopEvent { - isInterrupted: boolean; -} -export interface ObjectLoadedEvent { - object: Form; - isLoaded: boolean; -} -export interface LockChangedEvent { - lockedObject: ObjectReference; -} - -export interface CellFullyLoadedEvent { - cell: Cell; -} - -export interface GrabReleaseEvent { - refr: ObjectReference; - isGrabbed: boolean; -} - -export interface SwitchRaceCompleteEvent { - subject: ObjectReference; -} - -export interface UniqueIDChangeEvent { - oldBaseID: number; - newBaseID: number; - oldUniqueID: number; - newUniqueID: number; -} - -export interface TrackedStatsEvent { - statName: string; - newValue: number; -} - -export interface InitScriptEvent { - initializedObject: ObjectReference; -} - -export interface ResetEvent { - object: ObjectReference; -} - -export interface CombatEvent { - target: ObjectReference; - actor: ObjectReference; - isCombat: boolean; - isSearching: boolean; -} - -export interface DeathEvent { - actorDying: ObjectReference; - actorKiller: ObjectReference; -} - -export interface ContainerChangedEvent { - oldContainer: ObjectReference; - newContainer: ObjectReference; - baseObj: Form; - numItems: number; - uniqueID: number; - reference: ObjectReference; -} - -export interface HitEvent { - target: ObjectReference; - agressor: ObjectReference; - source: Form; - projectile: Projectile; - isPowerAttack: boolean; - isSneakAttack: boolean; - isBashAttack: boolean; - isHitBlocked: boolean; -} - -export interface EquipEvent { - actor: ObjectReference; - baseObj: Form; - uniqueId: number; - originalRefr: ObjectReference; -} - -export interface ActiveEffectApplyRemoveEvent { - effect: MagicEffect; - caster: ObjectReference; - target: ObjectReference; -} - -export interface MagicEffectApplyEvent { - effect: MagicEffect; - caster: ObjectReference; - target: ObjectReference; -} - -export declare function on( - eventName: "activate", - callback: (event: ActivateEvent) => void -): void; -export declare function once( - eventName: "activate", - callback: (event: ActivateEvent) => void -): void; - -export declare function on( - eventName: "waitStop", - callback: (event: WaitStopEvent) => void -): void; -export declare function once( - eventName: "waitStop", - callback: (event: WaitStopEvent) => void -): void; - -export declare function on( - eventName: "objectLoaded", - callback: (event: ObjectLoadedEvent) => void -): void; -export declare function once( - eventName: "objectLoaded", - callback: (event: ObjectLoadedEvent) => void -): void; - -export declare function on( - eventName: "moveAttachDetach", - callback: (event: MoveAttachDetachEvent) => void -): void; -export declare function once( - eventName: "moveAttachDetach", - callback: (event: MoveAttachDetachEvent) => void -): void; - -export declare function on( - eventName: "lockChanged", - callback: (event: LockChangedEvent) => void -): void; -export declare function once( - eventName: "lockChanged", - callback: (event: LockChangedEvent) => void -): void; - -export declare function on( - eventName: "grabRelease", - callback: (event: GrabReleaseEvent) => void -): void; -export declare function once( - eventName: "grabRelease", - callback: (event: GrabReleaseEvent) => void -): void; - -export declare function on( - eventName: "cellFullyLoaded", - callback: (event: CellFullyLoadedEvent) => void -): void; -export declare function once( - eventName: "cellFullyLoaded", - callback: (event: CellFullyLoadedEvent) => void -): void; - -export declare function on( - eventName: "switchRaceComplete", - callback: (event: SwitchRaceCompleteEvent) => void -): void; -export declare function once( - eventName: "switchRaceComplete", - callback: (event: SwitchRaceCompleteEvent) => void -): void; - -export declare function on( - eventName: "uniqueIdChange", - callback: (event: UniqueIDChangeEvent) => void -): void; -export declare function once( - eventName: "uniqueIdChange", - callback: (event: UniqueIDChangeEvent) => void -): void; - -export declare function on( - eventName: "trackedStats", - callback: (event: TrackedStatsEvent) => void -): void; -export declare function once( - eventName: "trackedStats", - callback: (event: TrackedStatsEvent) => void -): void; - -export declare function on( - eventName: "scriptInit", - callback: (event: InitScriptEvent) => void -): void; -export declare function once( - eventName: "scriptInit", - callback: (event: InitScriptEvent) => void -): void; - -export declare function on( - eventName: "reset", - callback: (event: ResetEvent) => void -): void; -export declare function once( - eventName: "reset", - callback: (event: ResetEvent) => void -): void; - -export declare function on( - eventName: "combatState", - callback: (event: CombatEvent) => void -): void; -export declare function once( - eventName: "combatState", - callback: (event: CombatEvent) => void -): void; - -export declare function on(eventName: "loadGame", callback: () => void): void; -export declare function once(eventName: "loadGame", callback: () => void): void; - -export declare function on( - eventName: "deathEnd", - callback: (event: DeathEvent) => void -): void; -export declare function once( - eventName: "deathEnd", - callback: (event: DeathEvent) => void -): void; - -export declare function on( - eventName: "deathStart", - callback: (event: DeathEvent) => void -): void; -export declare function once( - eventName: "deathStart", - callback: (event: DeathEvent) => void -): void; - -export declare function on( - eventName: "containerChanged", - callback: (event: ContainerChangedEvent) => void -): void; -export declare function once( - eventName: "containerChanged", - callback: (event: ContainerChangedEvent) => void -): void; - -export declare function on( - eventName: "hit", - callback: (event: HitEvent) => void -): void; -export declare function once( - eventName: "hit", - callback: (event: HitEvent) => void -): void; - -export declare function on( - eventName: "unequip", - callback: (event: EquipEvent) => void -): void; -export declare function once( - eventName: "unequip", - callback: (event: EquipEvent) => void -): void; - -export declare function on( - eventName: "equip", - callback: (event: EquipEvent) => void -): void; -export declare function once( - eventName: "equip", - callback: (event: EquipEvent) => void -): void; - -export declare function on( - eventName: "magicEffectApply", - callback: (event: MagicEffectApplyEvent) => void -): void; -export declare function once( - eventName: "magicEffectApply", - callback: (event: MagicEffectApplyEvent) => void -): void; - -export declare function on( - eventName: "effectFinish", - callback: (event: ActiveEffectApplyRemoveEvent) => void -): void; -export declare function once( - eventName: "effectFinish", - callback: (event: ActiveEffectApplyRemoveEvent) => void -): void; - -export declare function on( - eventName: "effectStart", - callback: (event: ActiveEffectApplyRemoveEvent) => void -): void; -export declare function once( - eventName: "effectStart", - callback: (event: ActiveEffectApplyRemoveEvent) => void -): void; - -declare class ConsoleComand { - longName: string; - shortName: string; - numArgs: number; - execute: (...arguments: any[]) => boolean; -} -export declare function findConsoleCommand(cmdName: string): ConsoleComand; - -export enum MotionType { - Dynamic = 1, - SphereInertia = 2, - BoxInertia = 3, - Keyframed = 4, - Fixed = 5, - ThinBoxInertia = 6, - Character = 7, -} - -export declare namespace SendAnimationEventHook { - class Context { - selfId: number; - animEventName: string; - - storage: Map; - } - - class LeaveContext extends Context { - animationSucceeded: boolean; - } - - class Handler { - enter(ctx: Context): void; - leave(ctx: LeaveContext): void; - } - - class Target { - add(handler: Handler): void; - } -} -export declare class Hooks { - sendAnimationEvent: SendAnimationEventHook.Target; -} - -export declare let hooks: Hooks; - -export declare class HttpResponse { - body: string; -} - -export declare class HttpClient { - constructor(host: string, port?: number); - get(path: string): Promise; -} - -// Based on Form.pex -export declare class Form { - static from(form: Form): Form; - getFormID(): number; - getGoldValue(): number; - getKeywords(): object[]; - getName(): string; - getNthKeyword(index: number): Keyword; - getNumKeywords(): number; - getType(): number; - getWeight(): number; - getWorldModelNthTextureSet(n: number): TextureSet; - getWorldModelNumTextureSets(): number; - getWorldModelPath(): string; - hasKeyword(akKeyword: Keyword): boolean; - hasWorldModel(): boolean; - isPlayable(): boolean; - playerKnows(): boolean; - registerForActorAction(actionType: number): void; - registerForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): boolean; - registerForCameraState(): void; - registerForControl(control: string): void; - registerForCrosshairRef(): void; - registerForKey(keyCode: number): void; - registerForLOS(akViewer: Actor, akTarget: ObjectReference): void; - registerForMenu(menuName: string): void; - registerForModEvent(eventName: string, callbackName: string): void; - registerForNiNodeUpdate(): void; - registerForSingleLOSGain(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleLOSLost(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleUpdate(afInterval: number): void; - registerForSingleUpdateGameTime(afInterval: number): void; - registerForSleep(): void; - registerForTrackedStatsEvent(): void; - registerForUpdate(afInterval: number): void; - registerForUpdateGameTime(afInterval: number): void; - sendModEvent(eventName: string, strArg: string, numArg: number): void; - setGoldValue(value: number): void; - setName(name: string): void; - setPlayerKnows(knows: boolean): void; - setWeight(weight: number): void; - setWorldModelNthTextureSet(nSet: TextureSet, n: number): void; - setWorldModelPath(path: string): void; - startObjectProfiling(): void; - stopObjectProfiling(): void; - tempClone(): Form; - unregisterForActorAction(actionType: number): void; - unregisterForAllControls(): void; - unregisterForAllKeys(): void; - unregisterForAllMenus(): void; - unregisterForAllModEvents(): void; - unregisterForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): void; - unregisterForCameraState(): void; - unregisterForControl(control: string): void; - unregisterForCrosshairRef(): void; - unregisterForKey(keyCode: number): void; - unregisterForLOS(akViewer: Actor, akTarget: ObjectReference): void; - unregisterForMenu(menuName: string): void; - unregisterForModEvent(eventName: string): void; - unregisterForNiNodeUpdate(): void; - unregisterForSleep(): void; - unregisterForTrackedStatsEvent(): void; - unregisterForUpdate(): void; - unregisterForUpdateGameTime(): void; -} - -// Based on Action.pex -export declare class Action extends Form { - static from(form: Form): Action; -} - -// Based on Activator.pex -export declare class Activator extends Form { - static from(form: Form): Activator; -} - -// Based on ActiveMagicEffect.pex -export declare class ActiveMagicEffect { - static from(form: Form): ActiveMagicEffect; - addInventoryEventFilter(akFilter: Form): void; - dispel(): void; - getBaseObject(): MagicEffect; - getCasterActor(): Actor; - getDuration(): number; - getMagnitude(): number; - getTargetActor(): Actor; - getTimeElapsed(): number; - registerForActorAction(actionType: number): void; - registerForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): boolean; - registerForCameraState(): void; - registerForControl(control: string): void; - registerForCrosshairRef(): void; - registerForKey(keyCode: number): void; - registerForLOS(akViewer: Actor, akTarget: ObjectReference): void; - registerForMenu(menuName: string): void; - registerForModEvent(eventName: string, callbackName: string): void; - registerForNiNodeUpdate(): void; - registerForSingleLOSGain(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleLOSLost(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleUpdate(afInterval: number): void; - registerForSingleUpdateGameTime(afInterval: number): void; - registerForSleep(): void; - registerForTrackedStatsEvent(): void; - registerForUpdate(afInterval: number): void; - registerForUpdateGameTime(afInterval: number): void; - removeAllInventoryEventFilters(): void; - removeInventoryEventFilter(akFilter: Form): void; - sendModEvent(eventName: string, strArg: string, numArg: number): void; - startObjectProfiling(): void; - stopObjectProfiling(): void; - unregisterForActorAction(actionType: number): void; - unregisterForAllControls(): void; - unregisterForAllKeys(): void; - unregisterForAllMenus(): void; - unregisterForAllModEvents(): void; - unregisterForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): void; - unregisterForCameraState(): void; - unregisterForControl(control: string): void; - unregisterForCrosshairRef(): void; - unregisterForKey(keyCode: number): void; - unregisterForLOS(akViewer: Actor, akTarget: ObjectReference): void; - unregisterForMenu(menuName: string): void; - unregisterForModEvent(eventName: string): void; - unregisterForNiNodeUpdate(): void; - unregisterForSleep(): void; - unregisterForTrackedStatsEvent(): void; - unregisterForUpdate(): void; - unregisterForUpdateGameTime(): void; -} - -// Based on ObjectReference.pex -export declare class ObjectReference extends Form { - static from(form: Form): ObjectReference; - activate( - akActivator: ObjectReference, - abDefaultProcessingOnly: boolean - ): boolean; - addDependentAnimatedObjectReference(akDependent: ObjectReference): boolean; - addInventoryEventFilter(akFilter: Form): void; - addItem(akItemToAdd: Form, aiCount: number, abSilent: boolean): void; - addToMap(abAllowFastTravel: boolean): void; - applyHavokImpulse( - afX: number, - afY: number, - afZ: number, - afMagnitude: number - ): Promise; - blockActivation(abBlocked: boolean): void; - calculateEncounterLevel(aiDifficulty: number): number; - canFastTravelToMarker(): boolean; - clearDestruction(): void; - createDetectionEvent(akOwner: Actor, aiSoundLevel: number): void; - createEnchantment( - maxCharge: number, - effects: object[], - magnitudes: number[], - areas: number[], - durations: number[] - ): void; - damageObject(afDamage: number): Promise; - delete(): Promise; - disable(abFadeOut: boolean): Promise; - disableNoWait(abFadeOut: boolean): void; - dropObject(akObject: Form, aiCount: number): Promise; - enable(abFadeIn: boolean): Promise; - enableFastTravel(abEnable: boolean): void; - enableNoWait(abFadeIn: boolean): void; - forceAddRagdollToWorld(): Promise; - forceRemoveRagdollFromWorld(): Promise; - getActorOwner(): ActorBase; - getAllForms(toFill: FormList): void; - getAngleX(): number; - getAngleY(): number; - getAngleZ(): number; - getAnimationVariableBool(arVariableName: string): boolean; - getAnimationVariableFloat(arVariableName: string): number; - getAnimationVariableInt(arVariableName: string): number; - getBaseObject(): Form; - getContainerForms(): object[]; - getCurrentDestructionStage(): number; - getCurrentLocation(): Location; - getCurrentScene(): Scene; - getDisplayName(): string; - getEditorLocation(): Location; - getEnableParent(): ObjectReference; - getEnchantment(): Enchantment; - getFactionOwner(): Faction; - getHeadingAngle(akOther: ObjectReference): number; - getHeight(): number; - getItemCharge(): number; - getItemCount(akItem: Form): number; - getItemHealthPercent(): number; - getItemMaxCharge(): number; - getKey(): Key; - getLength(): number; - getLinkedRef(apKeyword: Keyword): ObjectReference; - getLockLevel(): number; - getMass(): number; - getNthForm(index: number): Form; - getNthLinkedRef(aiLinkedRef: number): ObjectReference; - getNthReferenceAlias(n: number): ReferenceAlias; - getNumItems(): number; - getNumReferenceAliases(): number; - getOpenState(): number; - getParentCell(): Cell; - getPoison(): Potion; - getPositionX(): number; - getPositionY(): number; - getPositionZ(): number; - getReferenceAliases(): object[]; - getScale(): number; - getTotalArmorWeight(): number; - getTotalItemWeight(): number; - getTriggerObjectCount(): number; - getVoiceType(): VoiceType; - getWidth(): number; - getWorldSpace(): WorldSpace; - hasEffectKeyword(akKeyword: Keyword): boolean; - hasNode(asNodeName: string): boolean; - hasRefType(akRefType: LocationRefType): boolean; - ignoreFriendlyHits(abIgnore: boolean): void; - interruptCast(): void; - is3DLoaded(): boolean; - isActivateChild(akChild: ObjectReference): boolean; - isActivationBlocked(): boolean; - isDeleted(): boolean; - isDisabled(): boolean; - isFurnitureInUse(abIgnoreReserved: boolean): boolean; - isFurnitureMarkerInUse(aiMarker: number, abIgnoreReserved: boolean): boolean; - isHarvested(): boolean; - isIgnoringFriendlyHits(): boolean; - isInDialogueWithPlayer(): boolean; - isLockBroken(): boolean; - isLocked(): boolean; - isMapMarkerVisible(): boolean; - isOffLimits(): boolean; - knockAreaEffect(afMagnitude: number, afRadius: number): void; - lock(abLock: boolean, abAsOwner: boolean): void; - moveTo( - akTarget: ObjectReference, - afXOffset: number, - afYOffset: number, - afZOffset: number, - abMatchRotation: boolean - ): Promise; - moveToInteractionLocation(akTarget: ObjectReference): Promise; - moveToMyEditorLocation(): Promise; - moveToNode(akTarget: ObjectReference, asNodeName: string): Promise; - placeActorAtMe( - akActorToPlace: ActorBase, - aiLevelMod: number, - akZone: EncounterZone - ): Actor; - placeAtMe( - akFormToPlace: Form, - aiCount: number, - abForcePersist: boolean, - abInitiallyDisabled: boolean - ): ObjectReference; - playAnimation(asAnimation: string): boolean; - playAnimationAndWait( - asAnimation: string, - asEventName: string - ): Promise; - playGamebryoAnimation( - asAnimation: string, - abStartOver: boolean, - afEaseInTime: number - ): boolean; - playImpactEffect( - akImpactEffect: ImpactDataSet, - asNodeName: string, - afPickDirX: number, - afPickDirY: number, - afPickDirZ: number, - afPickLength: number, - abApplyNodeRotation: boolean, - abUseNodeLocalRotation: boolean - ): boolean; - playSyncedAnimationAndWaitSS( - asAnimation1: string, - asEvent1: string, - akObj2: ObjectReference, - asAnimation2: string, - asEvent2: string - ): Promise; - playSyncedAnimationSS( - asAnimation1: string, - akObj2: ObjectReference, - asAnimation2: string - ): boolean; - playTerrainEffect(asEffectModelName: string, asAttachBoneName: string): void; - processTrapHit( - akTrap: ObjectReference, - afDamage: number, - afPushback: number, - afXVel: number, - afYVel: number, - afZVel: number, - afXPos: number, - afYPos: number, - afZPos: number, - aeMaterial: number, - afStagger: number - ): void; - pushActorAway(akActorToPush: Actor, aiKnockbackForce: number): void; - removeAllInventoryEventFilters(): void; - removeAllItems( - akTransferTo: ObjectReference, - abKeepOwnership: boolean, - abRemoveQuestItems: boolean - ): void; - removeDependentAnimatedObjectReference(akDependent: ObjectReference): boolean; - removeInventoryEventFilter(akFilter: Form): void; - removeItem( - akItemToRemove: Form, - aiCount: number, - abSilent: boolean, - akOtherContainer: ObjectReference - ): void; - reset(akTarget: ObjectReference): Promise; - resetInventory(): void; - say( - akTopicToSay: Topic, - akActorToSpeakAs: Actor, - abSpeakInPlayersHead: boolean - ): void; - sendStealAlarm(akThief: Actor): void; - setActorCause(akActor: Actor): void; - setActorOwner(akActorBase: ActorBase): void; - setAngle(afXAngle: number, afYAngle: number, afZAngle: number): Promise; - setAnimationVariableBool(arVariableName: string, abNewValue: boolean): void; - setAnimationVariableFloat(arVariableName: string, afNewValue: number): void; - setAnimationVariableInt(arVariableName: string, aiNewValue: number): void; - setDestroyed(abDestroyed: boolean): void; - setDisplayName(name: string, force: boolean): boolean; - setEnchantment(source: Enchantment, maxCharge: number): void; - setFactionOwner(akFaction: Faction): void; - setHarvested(harvested: boolean): void; - setItemCharge(charge: number): void; - setItemHealthPercent(health: number): void; - setItemMaxCharge(maxCharge: number): void; - setLockLevel(aiLockLevel: number): void; - setMotionType( - aeMotionType: MotionType, - abAllowActivate: boolean - ): Promise; - setNoFavorAllowed(abNoFavor: boolean): void; - setOpen(abOpen: boolean): void; - setPosition(afX: number, afY: number, afZ: number): Promise; - setScale(afScale: number): Promise; - splineTranslateTo( - afX: number, - afY: number, - afZ: number, - afXAngle: number, - afYAngle: number, - afZAngle: number, - afTangentMagnitude: number, - afSpeed: number, - afMaxRotationSpeed: number - ): void; - splineTranslateToRefNode( - arTarget: ObjectReference, - arNodeName: string, - afTangentMagnitude: number, - afSpeed: number, - afMaxRotationSpeed: number - ): void; - stopTranslation(): void; - tetherToHorse(akHorse: ObjectReference): void; - translateTo( - afX: number, - afY: number, - afZ: number, - afXAngle: number, - afYAngle: number, - afZAngle: number, - afSpeed: number, - afMaxRotationSpeed: number - ): void; - waitForAnimationEvent(asEventName: string): Promise; - getDistance(akOther: ObjectReference): number; -} - -// Based on Actor.pex -export declare class Actor extends ObjectReference { - static from(form: Form): Actor; - addPerk(akPerk: Perk): void; - addShout(akShout: Shout): boolean; - addSpell(akSpell: Spell, abVerbose: boolean): boolean; - allowBleedoutDialogue(abCanTalk: boolean): void; - allowPCDialogue(abTalk: boolean): void; - attachAshPile(akAshPileBase: Form): void; - canFlyHere(): boolean; - changeHeadPart(hPart: HeadPart): void; - clearArrested(): void; - clearExpressionOverride(): void; - clearExtraArrows(): void; - clearForcedMovement(): void; - clearKeepOffsetFromActor(): void; - clearLookAt(): void; - damageActorValue(asValueName: string, afDamage: number): void; - dismount(): boolean; - dispelAllSpells(): void; - dispelSpell(akSpell: Spell): boolean; - doCombatSpellApply(akSpell: Spell, akTarget: ObjectReference): void; - drawWeapon(): void; - enableAI(abEnable: boolean): void; - endDeferredKill(): void; - equipItem(akItem: Form, abPreventRemoval: boolean, abSilent: boolean): void; - equipItemById( - item: Form, - itemId: number, - equipSlot: number, - preventUnequip: boolean, - equipSound: boolean - ): void; - equipItemEx( - item: Form, - equipSlot: number, - preventUnequip: boolean, - equipSound: boolean - ): void; - equipShout(akShout: Shout): void; - equipSpell(akSpell: Spell, aiSource: number): void; - evaluatePackage(): void; - forceActorValue(asValueName: string, afNewValue: number): void; - forceMovementDirection( - afXAngle: number, - afYAngle: number, - afZAngle: number - ): void; - forceMovementDirectionRamp( - afXAngle: number, - afYAngle: number, - afZAngle: number, - afRampTime: number - ): void; - forceMovementRotationSpeed( - afXMult: number, - afYMult: number, - afZMult: number - ): void; - forceMovementRotationSpeedRamp( - afXMult: number, - afYMult: number, - afZMult: number, - afRampTime: number - ): void; - forceMovementSpeed(afSpeedMult: number): void; - forceMovementSpeedRamp(afSpeedMult: number, afRampTime: number): void; - forceTargetAngle(afXAngle: number, afYAngle: number, afZAngle: number): void; - forceTargetDirection( - afXAngle: number, - afYAngle: number, - afZAngle: number - ): void; - forceTargetSpeed(afSpeed: number): void; - getActorValue(asValueName: string): number; - getActorValueMax(asValueName: string): number; - getActorValuePercentage(asValueName: string): number; - getBaseActorValue(asValueName: string): number; - getBribeAmount(): number; - getCombatState(): number; - getCombatTarget(): Actor; - getCrimeFaction(): Faction; - getCurrentPackage(): Package; - getDialogueTarget(): Actor; - getEquippedArmorInSlot(aiSlot: number): Armor; - getEquippedItemId(Location: number): number; - getEquippedItemType(aiHand: number): number; - getEquippedObject(Location: number): Form; - getEquippedShield(): Armor; - getEquippedShout(): Shout; - getEquippedSpell(aiSource: number): Spell; - getEquippedWeapon(abLeftHand: boolean): Weapon; - getFactionRank(akFaction: Faction): number; - getFactionReaction(akOther: Actor): number; - getFactions(minRank: number, maxRank: number): object[]; - getFlyingState(): number; - getForcedLandingMarker(): ObjectReference; - getFurnitureReference(): ObjectReference; - getGoldAmount(): number; - getHighestRelationshipRank(): number; - getKiller(): Actor; - getLevel(): number; - getLeveledActorBase(): ActorBase; - getLightLevel(): number; - getLowestRelationshipRank(): number; - getNoBleedoutRecovery(): boolean; - getNthSpell(n: number): Spell; - getPlayerControls(): boolean; - getRace(): Race; - getRelationshipRank(akOther: Actor): number; - getSitState(): number; - getSleepState(): number; - getSpellCount(): number; - getVoiceRecoveryTime(): number; - getWarmthRating(): number; - getWornForm(slotMask: number): Form; - getWornItemId(slotMask: number): number; - hasAssociation(akAssociation: AssociationType, akOther: Actor): boolean; - hasFamilyRelationship(akOther: Actor): boolean; - hasLOS(akOther: ObjectReference): boolean; - hasMagicEffect(akEffect: MagicEffect): boolean; - hasMagicEffectWithKeyword(akKeyword: Keyword): boolean; - hasParentRelationship(akOther: Actor): boolean; - hasPerk(akPerk: Perk): boolean; - hasSpell(akForm: Form): boolean; - isAIEnabled(): boolean; - isAlarmed(): boolean; - isAlerted(): boolean; - isAllowedToFly(): boolean; - isArrested(): boolean; - isArrestingTarget(): boolean; - isBeingRidden(): boolean; - isBleedingOut(): boolean; - isBribed(): boolean; - isChild(): boolean; - isCommandedActor(): boolean; - isDead(): boolean; - isDetectedBy(akOther: Actor): boolean; - isDoingFavor(): boolean; - isEquipped(akItem: Form): boolean; - isEssential(): boolean; - isFlying(): boolean; - isGhost(): boolean; - isGuard(): boolean; - isHostileToActor(akActor: Actor): boolean; - isInCombat(): boolean; - isInFaction(akFaction: Faction): boolean; - isInKillMove(): boolean; - isIntimidated(): boolean; - isOnMount(): boolean; - isOverEncumbered(): boolean; - isPlayerTeammate(): boolean; - isPlayersLastRiddenHorse(): boolean; - isRunning(): boolean; - isSneaking(): boolean; - isSprinting(): boolean; - isSwimming(): boolean; - isTrespassing(): boolean; - isUnconscious(): boolean; - isWeaponDrawn(): boolean; - keepOffsetFromActor( - arTarget: Actor, - afOffsetX: number, - afOffsetY: number, - afOffsetZ: number, - afOffsetAngleX: number, - afOffsetAngleY: number, - afOffsetAngleZ: number, - afCatchUpRadius: number, - afFollowRadius: number - ): void; - kill(akKiller: Actor): void; - killSilent(akKiller: Actor): void; - modActorValue(asValueName: string, afAmount: number): void; - modFactionRank(akFaction: Faction, aiMod: number): void; - moveToPackageLocation(): Promise; - openInventory(abForceOpen: boolean): void; - pathToReference( - aTarget: ObjectReference, - afWalkRunPercent: number - ): Promise; - playIdle(akIdle: Idle): boolean; - playIdleWithTarget(akIdle: Idle, akTarget: ObjectReference): boolean; - playSubGraphAnimation(asEventName: string): void; - queueNiNodeUpdate(): void; - regenerateHead(): void; - removeFromAllFactions(): void; - removeFromFaction(akFaction: Faction): void; - removePerk(akPerk: Perk): void; - removeShout(akShout: Shout): boolean; - removeSpell(akSpell: Spell): boolean; - replaceHeadPart(oPart: HeadPart, newPart: HeadPart): void; - resetAI(): void; - resetExpressionOverrides(): void; - resetHealthAndLimbs(): void; - restoreActorValue(asValueName: string, afAmount: number): void; - resurrect(): Promise; - sendAssaultAlarm(): void; - sendLycanthropyStateChanged(abIsWerewolf: boolean): void; - sendTrespassAlarm(akCriminal: Actor): void; - sendVampirismStateChanged(abIsVampire: boolean): void; - setActorValue(asValueName: string, afValue: number): void; - setAlert(abAlerted: boolean): void; - setAllowFlying(abAllowed: boolean): void; - setAllowFlyingEx( - abAllowed: boolean, - abAllowCrash: boolean, - abAllowSearch: boolean - ): void; - setAlpha(afTargetAlpha: number, abFade: boolean): void; - setAttackActorOnSight(abAttackOnSight: boolean): void; - setBribed(abBribe: boolean): void; - setCrimeFaction(akFaction: Faction): void; - setCriticalStage(aiStage: number): void; - setDoingFavor(abDoingFavor: boolean): void; - setDontMove(abDontMove: boolean): void; - setExpressionModifier(index: number, value: number): void; - setExpressionOverride(aiMood: number, aiStrength: number): void; - setExpressionPhoneme(index: number, value: number): void; - setEyeTexture(akNewTexture: TextureSet): void; - setFactionRank(akFaction: Faction, aiRank: number): void; - setForcedLandingMarker(aMarker: ObjectReference): void; - setGhost(abIsGhost: boolean): void; - setHeadTracking(abEnable: boolean): void; - setIntimidated(abIntimidate: boolean): void; - setLookAt(akTarget: ObjectReference, abPathingLookAt: boolean): void; - setNoBleedoutRecovery(abAllowed: boolean): void; - setNotShowOnStealthMeter(abNotShow: boolean): void; - setOutfit(akOutfit: Outfit, abSleepOutfit: boolean): void; - setPlayerControls(abControls: boolean): void; - setPlayerResistingArrest(): void; - setPlayerTeammate(abTeammate: boolean, abCanDoFavor: boolean): void; - setRace(akRace: Race): void; - setRelationshipRank(akOther: Actor, aiRank: number): void; - setRestrained(abRestrained: boolean): void; - setSubGraphFloatVariable(asVariableName: string, afValue: number): void; - setUnconscious(abUnconscious: boolean): void; - setVehicle(akVehicle: ObjectReference): void; - setVoiceRecoveryTime(afTime: number): void; - sheatheWeapon(): void; - showBarterMenu(): void; - showGiftMenu( - abGivingGift: boolean, - apFilterList: FormList, - abShowStolenItems: boolean, - abUseFavorPoints: boolean - ): Promise; - startCannibal(akTarget: Actor): void; - startCombat(akTarget: Actor): void; - startDeferredKill(): void; - startSneaking(): void; - startVampireFeed(akTarget: Actor): void; - stopCombat(): void; - stopCombatAlarm(): void; - trapSoul(akTarget: Actor): boolean; - unLockOwnedDoorsInCell(): void; - unequipAll(): void; - unequipItem(akItem: Form, abPreventEquip: boolean, abSilent: boolean): void; - unequipItemEx(item: Form, equipSlot: number, preventEquip: boolean): void; - unequipItemSlot(aiSlot: number): void; - unequipShout(akShout: Shout): void; - unequipSpell(akSpell: Spell, aiSource: number): void; - updateWeight(neckDelta: number): void; - willIntimidateSucceed(): boolean; - wornHasKeyword(akKeyword: Keyword): boolean; -} - -// Based on ActorBase.pex -export declare class ActorBase extends Form { - static from(form: Form): ActorBase; - getClass(): Class; - getCombatStyle(): CombatStyle; - getDeadCount(): number; - getFaceMorph(index: number): number; - getFacePreset(index: number): number; - getFaceTextureSet(): TextureSet; - getGiftFilter(): FormList; - getHairColor(): ColorForm; - getHeight(): number; - getIndexOfHeadPartByType(type: number): number; - getIndexOfOverlayHeadPartByType(type: number): number; - getNthHeadPart(slotPart: number): HeadPart; - getNthOverlayHeadPart(slotPart: number): HeadPart; - getNthSpell(n: number): Spell; - getNumHeadParts(): number; - getNumOverlayHeadParts(): number; - getOutfit(bSleepOutfit: boolean): Outfit; - getRace(): Race; - getSex(): number; - getSkin(): Armor; - getSkinFar(): Armor; - getSpellCount(): number; - getTemplate(): ActorBase; - getVoiceType(): VoiceType; - getWeight(): number; - isEssential(): boolean; - isInvulnerable(): boolean; - isProtected(): boolean; - isUnique(): boolean; - setClass(c: Class): void; - setCombatStyle(cs: CombatStyle): void; - setEssential(abEssential: boolean): void; - setFaceMorph(value: number, index: number): void; - setFacePreset(value: number, index: number): void; - setFaceTextureSet(textures: TextureSet): void; - setHairColor(color: ColorForm): void; - setHeight(height: number): void; - setInvulnerable(abInvulnerable: boolean): void; - setNthHeadPart(HeadPart: HeadPart, slotPart: number): void; - setOutfit(akOutfit: Outfit, abSleepOutfit: boolean): void; - setProtected(abProtected: boolean): void; - setSkin(skin: Armor): void; - setSkinFar(skin: Armor): void; - setVoiceType(nVoice: VoiceType): void; - setWeight(weight: number): void; -} - -// Based on ActorValueInfo.pex -export declare class ActorValueInfo extends Form { - static from(form: Form): ActorValueInfo; - addSkillExperience(exp: number): void; - getBaseValue(akActor: Actor): number; - getCurrentValue(akActor: Actor): number; - getExperienceForLevel(currentLevel: number): number; - getMaximumValue(akActor: Actor): number; - getPerkTree( - list: FormList, - akActor: Actor, - unowned: boolean, - allRanks: boolean - ): void; - getPerks(akActor: Actor, unowned: boolean, allRanks: boolean): object[]; - getSkillExperience(): number; - getSkillImproveMult(): number; - getSkillImproveOffset(): number; - getSkillLegendaryLevel(): number; - getSkillOffsetMult(): number; - getSkillUseMult(): number; - isSkill(): boolean; - setSkillExperience(exp: number): void; - setSkillImproveMult(value: number): void; - setSkillImproveOffset(value: number): void; - setSkillLegendaryLevel(level: number): void; - setSkillOffsetMult(value: number): void; - setSkillUseMult(value: number): void; - static getActorValueInfoByID(id: number): ActorValueInfo; - static getActorValueInfoByName(avName: string): ActorValueInfo; -} - -// Based on Alias.pex -export declare class Alias { - static from(form: Form): Alias; - getID(): number; - getName(): string; - getOwningQuest(): Quest; - registerForActorAction(actionType: number): void; - registerForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): boolean; - registerForCameraState(): void; - registerForControl(control: string): void; - registerForCrosshairRef(): void; - registerForKey(keyCode: number): void; - registerForLOS(akViewer: Actor, akTarget: ObjectReference): void; - registerForMenu(menuName: string): void; - registerForModEvent(eventName: string, callbackName: string): void; - registerForNiNodeUpdate(): void; - registerForSingleLOSGain(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleLOSLost(akViewer: Actor, akTarget: ObjectReference): void; - registerForSingleUpdate(afInterval: number): void; - registerForSingleUpdateGameTime(afInterval: number): void; - registerForSleep(): void; - registerForTrackedStatsEvent(): void; - registerForUpdate(afInterval: number): void; - registerForUpdateGameTime(afInterval: number): void; - sendModEvent(eventName: string, strArg: string, numArg: number): void; - startObjectProfiling(): void; - stopObjectProfiling(): void; - unregisterForActorAction(actionType: number): void; - unregisterForAllControls(): void; - unregisterForAllKeys(): void; - unregisterForAllMenus(): void; - unregisterForAllModEvents(): void; - unregisterForAnimationEvent( - akSender: ObjectReference, - asEventName: string - ): void; - unregisterForCameraState(): void; - unregisterForControl(control: string): void; - unregisterForCrosshairRef(): void; - unregisterForKey(keyCode: number): void; - unregisterForLOS(akViewer: Actor, akTarget: ObjectReference): void; - unregisterForMenu(menuName: string): void; - unregisterForModEvent(eventName: string): void; - unregisterForNiNodeUpdate(): void; - unregisterForSleep(): void; - unregisterForTrackedStatsEvent(): void; - unregisterForUpdate(): void; - unregisterForUpdateGameTime(): void; -} - -// Based on Ammo.pex -export declare class Ammo extends Form { - static from(form: Form): Ammo; - getDamage(): number; - getProjectile(): Projectile; - isBolt(): boolean; -} - -// Based on MiscObject.pex -export declare class MiscObject extends Form { - static from(form: Form): MiscObject; -} - -// Based on Apparatus.pex -export declare class Apparatus extends MiscObject { - static from(form: Form): Apparatus; - getQuality(): number; - setQuality(quality: number): void; -} - -// Based on Armor.pex -export declare class Armor extends Form { - static from(form: Form): Armor; - addSlotToMask(slotMask: number): number; - getArmorRating(): number; - getEnchantment(): Enchantment; - getIconPath(bFemalePath: boolean): string; - getMessageIconPath(bFemalePath: boolean): string; - getModelPath(bFemalePath: boolean): string; - getNthArmorAddon(n: number): ArmorAddon; - getNumArmorAddons(): number; - getSlotMask(): number; - getWarmthRating(): number; - getWeightClass(): number; - modArmorRating(modBy: number): void; - removeSlotFromMask(slotMask: number): number; - setArmorRating(armorRating: number): void; - setEnchantment(e: Enchantment): void; - setIconPath(path: string, bFemalePath: boolean): void; - setMessageIconPath(path: string, bFemalePath: boolean): void; - setModelPath(path: string, bFemalePath: boolean): void; - setSlotMask(slotMask: number): void; - setWeightClass(weightClass: number): void; - static getMaskForSlot(slot: number): number; -} - -// Based on ArmorAddon.pex -export declare class ArmorAddon extends Form { - static from(form: Form): ArmorAddon; - addSlotToMask(slotMask: number): number; - getModelNthTextureSet(n: number, first: boolean, female: boolean): TextureSet; - getModelNumTextureSets(first: boolean, female: boolean): number; - getModelPath(firstPerson: boolean, female: boolean): string; - getNthAdditionalRace(n: number): Race; - getNumAdditionalRaces(): number; - getSlotMask(): number; - removeSlotFromMask(slotMask: number): number; - setModelNthTextureSet( - texture: TextureSet, - n: number, - first: boolean, - female: boolean - ): void; - setModelPath(path: string, firstPerson: boolean, female: boolean): void; - setSlotMask(slotMask: number): void; -} - -// Based on Art.pex -export declare class Art extends Form { - static from(form: Form): Art; - getModelPath(): string; - setModelPath(path: string): void; -} - -// Based on AssociationType.pex -export declare class AssociationType extends Form { - static from(form: Form): AssociationType; -} - -// Based on Book.pex -export declare class Book extends Form { - static from(form: Form): Book; - getSkill(): number; - getSpell(): Spell; - isRead(): boolean; - isTakeable(): boolean; -} - -// Based on Cell.pex -export declare class Cell extends Form { - static from(form: Form): Cell; - getActorOwner(): ActorBase; - getFactionOwner(): Faction; - getNthRef(n: number, formTypeFilter: number): ObjectReference; - getNumRefs(formTypeFilter: number): number; - getWaterLevel(): number; - isAttached(): boolean; - isInterior(): boolean; - reset(): void; - setActorOwner(akActor: ActorBase): void; - setFactionOwner(akFaction: Faction): void; - setFogColor( - aiNearRed: number, - aiNearGreen: number, - aiNearBlue: number, - aiFarRed: number, - aiFarGreen: number, - aiFarBlue: number - ): void; - setFogPlanes(afNear: number, afFar: number): void; - setFogPower(afPower: number): void; - setPublic(abPublic: boolean): void; -} - -// Based on Class.pex -export declare class Class extends Form { - static from(form: Form): Class; -} - -// Based on ColorForm.pex -export declare class ColorForm extends Form { - static from(form: Form): ColorForm; - getColor(): number; - setColor(color: number): void; -} - -// Based on CombatStyle.pex -export declare class CombatStyle extends Form { - static from(form: Form): CombatStyle; - getAllowDualWielding(): boolean; - getAvoidThreatChance(): number; - getCloseRangeDuelingCircleMult(): number; - getCloseRangeDuelingFallbackMult(): number; - getCloseRangeFlankingFlankDistance(): number; - getCloseRangeFlankingStalkTime(): number; - getDefensiveMult(): number; - getFlightDiveBombChance(): number; - getFlightFlyingAttackChance(): number; - getFlightHoverChance(): number; - getGroupOffensiveMult(): number; - getLongRangeStrafeMult(): number; - getMagicMult(): number; - getMeleeAttackStaggeredMult(): number; - getMeleeBashAttackMult(): number; - getMeleeBashMult(): number; - getMeleeBashPowerAttackMult(): number; - getMeleeBashRecoiledMult(): number; - getMeleeMult(): number; - getMeleePowerAttackBlockingMult(): number; - getMeleePowerAttackStaggeredMult(): number; - getMeleeSpecialAttackMult(): number; - getOffensiveMult(): number; - getRangedMult(): number; - getShoutMult(): number; - getStaffMult(): number; - getUnarmedMult(): number; - setAllowDualWielding(allow: boolean): void; - setAvoidThreatChance(chance: number): void; - setCloseRangeDuelingCircleMult(mult: number): void; - setCloseRangeDuelingFallbackMult(mult: number): void; - setCloseRangeFlankingFlankDistance(mult: number): void; - setCloseRangeFlankingStalkTime(mult: number): void; - setDefensiveMult(mult: number): void; - setFlightDiveBombChance(chance: number): void; - setFlightFlyingAttackChance(mult: number): void; - setFlightHoverChance(chance: number): void; - setGroupOffensiveMult(mult: number): void; - setLongRangeStrafeMult(mult: number): void; - setMagicMult(mult: number): void; - setMeleeAttackStaggeredMult(mult: number): void; - setMeleeBashAttackMult(mult: number): void; - setMeleeBashMult(mult: number): void; - setMeleeBashPowerAttackMult(mult: number): void; - setMeleeBashRecoiledMult(mult: number): void; - setMeleeMult(mult: number): void; - setMeleePowerAttackBlockingMult(mult: number): void; - setMeleePowerAttackStaggeredMult(mult: number): void; - setMeleeSpecialAttackMult(mult: number): void; - setOffensiveMult(mult: number): void; - setRangedMult(mult: number): void; - setShoutMult(mult: number): void; - setStaffMult(mult: number): void; - setUnarmedMult(mult: number): void; -} - -// Based on ConstructibleObject.pex -export declare class ConstructibleObject extends MiscObject { - static from(form: Form): ConstructibleObject; - getNthIngredient(n: number): Form; - getNthIngredientQuantity(n: number): number; - getNumIngredients(): number; - getResult(): Form; - getResultQuantity(): number; - getWorkbenchKeyword(): Keyword; - setNthIngredient(required: Form, n: number): void; - setNthIngredientQuantity(value: number, n: number): void; - setResult(result: Form): void; - setResultQuantity(quantity: number): void; - setWorkbenchKeyword(aKeyword: Keyword): void; -} - -// Based on Container.pex -export declare class Container extends Form { - static from(form: Form): Container; -} - -// Based on Debug.pex -export declare class Debug { - static from(form: Form): Debug; - static centerOnCell(param1: string): void; - static centerOnCellAndWait(param1: string): Promise; - static closeUserLog(param1: string): void; - static dBSendPlayerPosition(): void; - static debugChannelNotify(param1: string, param2: string): void; - static dumpAliasData(param1: Quest): void; - static getConfigName(): Promise; - static getPlatformName(): Promise; - static getVersionNumber(): Promise; - static messageBox(param1: string): void; - static notification(param1: string): void; - static openUserLog(param1: string): boolean; - static playerMoveToAndWait(param1: string): Promise; - static quitGame(): void; - static sendAnimationEvent(param1: ObjectReference, param2: string): void; - static setFootIK(param1: boolean): void; - static setGodMode(param1: boolean): void; - static showRefPosition(arRef: ObjectReference): void; - static startScriptProfiling(param1: string): void; - static startStackProfiling(): void; - static stopScriptProfiling(param1: string): void; - static stopStackProfiling(): void; - static takeScreenshot(param1: string): void; - static toggleAI(): void; - static toggleCollisions(): void; - static toggleMenus(): void; - static trace(param1: string, param2: number): void; - static traceStack(param1: string, param2: number): void; - static traceUser(param1: string, param2: string, param3: number): boolean; -} - -// Based on DefaultObjectManager.pex -export declare class DefaultObjectManager extends Form { - static from(form: Form): DefaultObjectManager; - getForm(key: string): Form; - setForm(key: string, newForm: Form): void; -} - -// Based on Door.pex -export declare class Door extends Form { - static from(form: Form): Door; -} - -// Based on EffectShader.pex -export declare class EffectShader extends Form { - static from(form: Form): EffectShader; - play(param1: ObjectReference, param2: number): void; - stop(param1: ObjectReference): void; -} - -// Based on Enchantment.pex -export declare class Enchantment extends Form { - static from(form: Form): Enchantment; - getBaseEnchantment(): Enchantment; - getCostliestEffectIndex(): number; - getKeywordRestrictions(): FormList; - getNthEffectArea(index: number): number; - getNthEffectDuration(index: number): number; - getNthEffectMagicEffect(index: number): MagicEffect; - getNthEffectMagnitude(index: number): number; - getNumEffects(): number; - isHostile(): boolean; - setKeywordRestrictions(newKeywordList: FormList): void; - setNthEffectArea(index: number, value: number): void; - setNthEffectDuration(index: number, value: number): void; - setNthEffectMagnitude(index: number, value: number): void; -} - -// Based on EncounterZone.pex -export declare class EncounterZone extends Form { - static from(form: Form): EncounterZone; -} - -// Based on EquipSlot.pex -export declare class EquipSlot extends Form { - static from(form: Form): EquipSlot; - getNthParent(n: number): EquipSlot; - getNumParents(): number; -} - -// Based on Explosion.pex -export declare class Explosion extends Form { - static from(form: Form): Explosion; -} - -// Based on Faction.pex -export declare class Faction extends Form { - static from(form: Form): Faction; - canPayCrimeGold(): boolean; - clearFactionFlag(flag: number): void; - getBuySellList(): FormList; - getCrimeGold(): number; - getCrimeGoldNonViolent(): number; - getCrimeGoldViolent(): number; - getInfamy(): number; - getInfamyNonViolent(): number; - getInfamyViolent(): number; - getMerchantContainer(): ObjectReference; - getReaction(akOther: Faction): number; - getStolenItemValueCrime(): number; - getStolenItemValueNoCrime(): number; - getVendorEndHour(): number; - getVendorRadius(): number; - getVendorStartHour(): number; - isFactionFlagSet(flag: number): boolean; - isFactionInCrimeGroup(akOther: Faction): boolean; - isNotSellBuy(): boolean; - isPlayerExpelled(): boolean; - modCrimeGold(aiAmount: number, abViolent: boolean): void; - modReaction(akOther: Faction, aiAmount: number): void; - onlyBuysStolenItems(): boolean; - playerPayCrimeGold(abRemoveStolenItems: boolean, abGoToJail: boolean): void; - sendAssaultAlarm(): void; - sendPlayerToJail( - abRemoveInventory: boolean, - abRealJail: boolean - ): Promise; - setAlly( - akOther: Faction, - abSelfIsFriendToOther: boolean, - abOtherIsFriendToSelf: boolean - ): void; - setBuySellList(akList: FormList): void; - setCrimeGold(aiGold: number): void; - setCrimeGoldViolent(aiGold: number): void; - setEnemy( - akOther: Faction, - abSelfIsNeutralToOther: boolean, - abOtherIsNeutralToSelf: boolean - ): void; - setFactionFlag(flag: number): void; - setMerchantContainer(akContainer: ObjectReference): void; - setNotSellBuy(notSellBuy: boolean): void; - setOnlyBuysStolenItems(onlyStolen: boolean): void; - setPlayerEnemy(abIsEnemy: boolean): void; - setPlayerExpelled(abIsExpelled: boolean): void; - setReaction(akOther: Faction, aiNewValue: number): void; - setVendorEndHour(hour: number): void; - setVendorRadius(radius: number): void; - setVendorStartHour(hour: number): void; -} - -// Based on Flora.pex -export declare class Flora extends Activator { - static from(form: Form): Flora; - getHarvestSound(): SoundDescriptor; - getIngredient(): Form; - setHarvestSound(akSoundDescriptor: SoundDescriptor): void; - setIngredient(akIngredient: Form): void; -} - -// Based on FormList.pex -export declare class FormList extends Form { - static from(form: Form): FormList; - addForm(apForm: Form): void; - addForms(forms: object[]): void; - find(apForm: Form): number; - getAt(aiIndex: number): Form; - getSize(): number; - hasForm(akForm: Form): boolean; - removeAddedForm(apForm: Form): void; - revert(): void; - toArray(): object[]; -} - -// Based on Furniture.pex -export declare class Furniture extends Activator { - static from(form: Form): Furniture; -} - -// Based on Game.pex -export declare class Game { - static from(form: Form): Game; - static addAchievement(aiAchievementID: number): void; - static addHavokBallAndSocketConstraint( - arRefA: ObjectReference, - arRefANode: string, - arRefB: ObjectReference, - arRefBNode: string, - afRefALocalOffsetX: number, - afRefALocalOffsetY: number, - afRefALocalOffsetZ: number, - afRefBLocalOffsetX: number, - afRefBLocalOffsetY: number, - afRefBLocalOffsetZ: number - ): Promise; - static addPerkPoints(aiPerkPoints: number): void; - static advanceSkill(asSkillName: string, afMagnitude: number): void; - static calculateFavorCost(aiFavorPrice: number): number; - static clearPrison(): void; - static clearTempEffects(): void; - static disablePlayerControls( - abMovement: boolean, - abFighting: boolean, - abCamSwitch: boolean, - abLooking: boolean, - abSneaking: boolean, - abMenu: boolean, - abActivate: boolean, - abJournalTabs: boolean, - aiDisablePOVType: number - ): void; - static enableFastTravel(abEnable: boolean): void; - static enablePlayerControls( - abMovement: boolean, - abFighting: boolean, - abCamSwitch: boolean, - abLooking: boolean, - abSneaking: boolean, - abMenu: boolean, - abActivate: boolean, - abJournalTabs: boolean, - aiDisablePOVType: number - ): void; - static fadeOutGame( - abFadingOut: boolean, - abBlackFade: boolean, - afSecsBeforeFade: number, - afFadeDuration: number - ): void; - static fastTravel(akDestination: ObjectReference): void; - static findClosestActor( - afX: number, - afY: number, - afZ: number, - afRadius: number - ): Actor; - static findClosestReferenceOfAnyTypeInList( - arBaseObjects: FormList, - afX: number, - afY: number, - afZ: number, - afRadius: number - ): ObjectReference; - static findClosestReferenceOfType( - arBaseObject: Form, - afX: number, - afY: number, - afZ: number, - afRadius: number - ): ObjectReference; - static findRandomActor( - afX: number, - afY: number, - afZ: number, - afRadius: number - ): Actor; - static findRandomReferenceOfAnyTypeInList( - arBaseObjects: FormList, - afX: number, - afY: number, - afZ: number, - afRadius: number - ): ObjectReference; - static findRandomReferenceOfType( - arBaseObject: Form, - afX: number, - afY: number, - afZ: number, - afRadius: number - ): ObjectReference; - static forceFirstPerson(): void; - static forceThirdPerson(): void; - static getCameraState(): number; - static getCurrentConsoleRef(): ObjectReference; - static getCurrentCrosshairRef(): ObjectReference; - static getDialogueTarget(): ObjectReference; - static getExperienceForLevel(currentLevel: number): number; - static getForm(aiFormID: number): Form; - static getFormEx(formId: number): Form; - static getFormFromFile(aiFormID: number, asFilename: string): Form; - static getGameSettingFloat(asGameSetting: string): number; - static getGameSettingInt(asGameSetting: string): number; - static getGameSettingString(asGameSetting: string): Promise; - static getHotkeyBoundObject(hotkey: number): Form; - static getLightModAuthor(idx: number): string; - static getLightModByName(name: string): number; - static getLightModCount(): number; - static getLightModDependencyCount(idx: number): number; - static getLightModDescription(idx: number): string; - static getLightModName(idx: number): string; - static getModAuthor(modIndex: number): string; - static getModByName(name: string): number; - static getModCount(): number; - static getModDependencyCount(modIndex: number): number; - static getModDescription(modIndex: number): string; - static getModName(modIndex: number): string; - static getNthLightModDependency(modIdx: number, idx: number): number; - static getNthTintMaskColor(n: number): number; - static getNthTintMaskTexturePath(n: number): string; - static getNthTintMaskType(n: number): number; - static getNumTintMasks(): number; - static getNumTintsByType(type: number): number; - static getPerkPoints(): number; - static getPlayerExperience(): number; - static getPlayerGrabbedRef(): ObjectReference; - static getPlayerMovementMode(): boolean; - static getPlayersLastRiddenHorse(): Actor; - static getRealHoursPassed(): number; - static getSunPositionX(): number; - static getSunPositionY(): number; - static getSunPositionZ(): number; - static getTintMaskColor(type: number, index: number): number; - static getTintMaskTexturePath(type: number, index: number): string; - static hideTitleSequenceMenu(): void; - static incrementSkill(asSkillName: string): void; - static incrementSkillBy(asSkillName: string, aiCount: number): void; - static incrementStat(asStatName: string, aiModAmount: number): void; - static isActivateControlsEnabled(): boolean; - static isCamSwitchControlsEnabled(): boolean; - static isFastTravelControlsEnabled(): boolean; - static isFastTravelEnabled(): boolean; - static isFightingControlsEnabled(): boolean; - static isJournalControlsEnabled(): boolean; - static isLookingControlsEnabled(): boolean; - static isMenuControlsEnabled(): boolean; - static isMovementControlsEnabled(): boolean; - static isObjectFavorited(Form: Form): boolean; - static isPlayerSungazing(): boolean; - static isPluginInstalled(name: string): boolean; - static isSneakingControlsEnabled(): boolean; - static isWordUnlocked(akWord: WordOfPower): boolean; - static loadGame(name: string): void; - static modPerkPoints(perkPoints: number): void; - static playBink( - asFilename: string, - abInterruptible: boolean, - abMuteAudio: boolean, - abMuteMusic: boolean, - abLetterbox: boolean - ): void; - static precacheCharGen(): void; - static precacheCharGenClear(): void; - static queryStat(asStat: string): number; - static quitToMainMenu(): void; - static removeHavokConstraints( - arFirstRef: ObjectReference, - arFirstRefNodeName: string, - arSecondRef: ObjectReference, - arSecondRefNodeName: string - ): Promise; - static requestAutosave(): void; - static requestModel(asModelName: string): void; - static requestSave(): void; - static saveGame(name: string): void; - static sendWereWolfTransformation(): void; - static serveTime(): void; - static setAllowFlyingMountLandingRequests(abAllow: boolean): void; - static setBeastForm(abEntering: boolean): void; - static setCameraTarget(arTarget: Actor): void; - static setGameSettingBool(setting: string, value: boolean): void; - static setGameSettingFloat(setting: string, value: number): void; - static setGameSettingInt(setting: string, value: number): void; - static setGameSettingString(setting: string, value: string): void; - static setHudCartMode(abSetCartMode: boolean): void; - static setInChargen( - abDisableSaving: boolean, - abDisableWaiting: boolean, - abShowControlsDisabledMessage: boolean - ): void; - static setMiscStat(name: string, value: number): void; - static setNthTintMaskColor(n: number, color: number): void; - static setNthTintMaskTexturePath(path: string, n: number): void; - static setPerkPoints(perkPoints: number): void; - static setPlayerAIDriven(abAIDriven: boolean): void; - static setPlayerExperience(exp: number): void; - static setPlayerLevel(level: number): void; - static setPlayerReportCrime(abReportCrime: boolean): void; - static setPlayersLastRiddenHorse(horse: Actor): void; - static setSittingRotation(afValue: number): void; - static setSunGazeImageSpaceModifier(apImod: ImageSpaceModifier): void; - static setTintMaskColor(color: number, type: number, index: number): void; - static setTintMaskTexturePath( - path: string, - type: number, - index: number - ): void; - static showFirstPersonGeometry(abShow: boolean): void; - static showLimitedRaceMenu(): void; - static showRaceMenu(): void; - static showTitleSequenceMenu(): void; - static showTrainingMenu(aTrainer: Actor): void; - static startTitleSequence(asSequenceName: string): void; - static teachWord(akWord: WordOfPower): void; - static triggerScreenBlood(aiValue: number): void; - static unbindObjectHotkey(hotkey: number): void; - static unlockWord(akWord: WordOfPower): void; - static updateHairColor(): void; - static updateThirdPerson(): void; - static updateTintMaskColors(): void; - static usingGamepad(): boolean; - static getPlayer(): Actor; - static shakeCamera( - akSource: ObjectReference, - afStrength: number, - afDuration: number - ): void; - static shakeController( - afSmallMotorStrength: number, - afBigMotorStreangth: number, - afDuration: number - ): void; -} - -// Based on GlobalVariable.pex -export declare class GlobalVariable extends Form { - static from(form: Form): GlobalVariable; - getValue(): number; - setValue(param1: number): void; -} - -// Based on Hazard.pex -export declare class Hazard extends Form { - static from(form: Form): Hazard; -} - -// Based on HeadPart.pex -export declare class HeadPart extends Form { - static from(form: Form): HeadPart; - getIndexOfExtraPart(p: HeadPart): number; - getNthExtraPart(n: number): HeadPart; - getNumExtraParts(): number; - getPartName(): string; - getType(): number; - getValidRaces(): FormList; - hasExtraPart(p: HeadPart): boolean; - isExtraPart(): boolean; - setValidRaces(vRaces: FormList): void; - static getHeadPart(name: string): HeadPart; -} - -// Based on Idle.pex -export declare class Idle extends Form { - static from(form: Form): Idle; -} - -// Based on ImageSpaceModifier.pex -export declare class ImageSpaceModifier extends Form { - static from(form: Form): ImageSpaceModifier; - apply(param1: number): void; - applyCrossFade(param1: number): void; - popTo(param1: ImageSpaceModifier, param2: number): void; - remove(): void; - static removeCrossFade(param1: number): void; -} - -// Based on ImpactDataSet.pex -export declare class ImpactDataSet extends Form { - static from(form: Form): ImpactDataSet; -} - -// Based on Ingredient.pex -export declare class Ingredient extends Form { - static from(form: Form): Ingredient; - getCostliestEffectIndex(): number; - getEffectAreas(): number[]; - getEffectDurations(): number[]; - getEffectMagnitudes(): number[]; - getIsNthEffectKnown(index: number): boolean; - getMagicEffects(): object[]; - getNthEffectArea(index: number): number; - getNthEffectDuration(index: number): number; - getNthEffectMagicEffect(index: number): MagicEffect; - getNthEffectMagnitude(index: number): number; - getNumEffects(): number; - isHostile(): boolean; - learnAllEffects(): void; - learnEffect(aiIndex: number): void; - learnNextEffect(): number; - setNthEffectArea(index: number, value: number): void; - setNthEffectDuration(index: number, value: number): void; - setNthEffectMagnitude(index: number, value: number): void; -} - -// Based on Input.pex -export declare class Input { - static from(form: Form): Input; - static getMappedControl(keycode: number): string; - static getMappedKey(control: string, deviceType: number): number; - static getNthKeyPressed(n: number): number; - static getNumKeysPressed(): number; - static holdKey(dxKeycode: number): void; - static isKeyPressed(dxKeycode: number): boolean; - static releaseKey(dxKeycode: number): void; - static tapKey(dxKeycode: number): void; -} - -// Based on Key.pex -export declare class Key extends MiscObject { - static from(form: Form): Key; -} - -// Based on Keyword.pex -export declare class Keyword extends Form { - static from(form: Form): Keyword; - getString(): string; - sendStoryEvent( - akLoc: Location, - akRef1: ObjectReference, - akRef2: ObjectReference, - aiValue1: number, - aiValue2: number - ): void; - sendStoryEventAndWait( - akLoc: Location, - akRef1: ObjectReference, - akRef2: ObjectReference, - aiValue1: number, - aiValue2: number - ): Promise; - static getKeyword(key: string): Keyword; -} - -// Based on LeveledActor.pex -export declare class LeveledActor extends Form { - static from(form: Form): LeveledActor; - addForm(apForm: Form, aiLevel: number): void; - getNthCount(n: number): number; - getNthForm(n: number): Form; - getNthLevel(n: number): number; - getNumForms(): number; - revert(): void; - setNthCount(n: number, count: number): void; - setNthLevel(n: number, level: number): void; -} - -// Based on LeveledItem.pex -export declare class LeveledItem extends Form { - static from(form: Form): LeveledItem; - addForm(apForm: Form, aiLevel: number, aiCount: number): void; - getChanceGlobal(): GlobalVariable; - getChanceNone(): number; - getNthCount(n: number): number; - getNthForm(n: number): Form; - getNthLevel(n: number): number; - getNumForms(): number; - revert(): void; - setChanceGlobal(glob: GlobalVariable): void; - setChanceNone(chance: number): void; - setNthCount(n: number, count: number): void; - setNthLevel(n: number, level: number): void; -} - -// Based on LeveledSpell.pex -export declare class LeveledSpell extends Form { - static from(form: Form): LeveledSpell; - addForm(apForm: Form, aiLevel: number): void; - getChanceNone(): number; - getNthForm(n: number): Form; - getNthLevel(n: number): number; - getNumForms(): number; - revert(): void; - setChanceNone(chance: number): void; - setNthLevel(n: number, level: number): void; -} - -// Based on Light.pex -export declare class Light extends Form { - static from(form: Form): Light; - getWarmthRating(): number; -} - -// Based on Location.pex -export declare class Location extends Form { - static from(form: Form): Location; - getKeywordData(param1: Keyword): number; - getRefTypeAliveCount(param1: LocationRefType): number; - getRefTypeDeadCount(param1: LocationRefType): number; - hasCommonParent(param1: Location, param2: Keyword): boolean; - hasRefType(param1: LocationRefType): boolean; - isChild(param1: Location): boolean; - isCleared(): boolean; - isLoaded(): boolean; - setCleared(param1: boolean): void; - setKeywordData(param1: Keyword, param2: number): void; -} - -// Based on LocationAlias.pex -export declare class LocationAlias extends Alias { - static from(form: Form): LocationAlias; - clear(): void; - forceLocationTo(param1: Location): void; - getLocation(): Location; -} - -// Based on LocationRefType.pex -export declare class LocationRefType extends Keyword { - static from(form: Form): LocationRefType; -} - -// Based on MagicEffect.pex -export declare class MagicEffect extends Form { - static from(form: Form): MagicEffect; - clearEffectFlag(flag: number): void; - getArea(): number; - getAssociatedSkill(): Promise; - getBaseCost(): number; - getCastTime(): number; - getCastingArt(): Art; - getCastingType(): number; - getDeliveryType(): number; - getEnchantArt(): Art; - getEnchantShader(): EffectShader; - getEquipAbility(): Spell; - getExplosion(): Explosion; - getHitEffectArt(): Art; - getHitShader(): EffectShader; - getImageSpaceMod(): ImageSpaceModifier; - getImpactDataSet(): ImpactDataSet; - getLight(): Light; - getPerk(): Perk; - getProjectile(): Projectile; - getResistance(): string; - getSkillLevel(): number; - getSkillUsageMult(): number; - getSounds(): object[]; - isEffectFlagSet(flag: number): boolean; - setArea(area: number): void; - setAssociatedSkill(skill: string): void; - setBaseCost(cost: number): void; - setCastTime(castTime: number): void; - setCastingArt(obj: Art): void; - setEffectFlag(flag: number): void; - setEnchantArt(obj: Art): void; - setEnchantShader(obj: EffectShader): void; - setEquipAbility(obj: Spell): void; - setExplosion(obj: Explosion): void; - setHitEffectArt(obj: Art): void; - setHitShader(obj: EffectShader): void; - setImageSpaceMod(obj: ImageSpaceModifier): void; - setImpactDataSet(obj: ImpactDataSet): void; - setLight(obj: Light): void; - setPerk(obj: Perk): void; - setProjectile(obj: Projectile): void; - setResistance(skill: string): void; - setSkillLevel(level: number): void; - setSkillUsageMult(usageMult: number): void; -} - -// Based on Message.pex -export declare class Message extends Form { - static from(form: Form): Message; - show( - param1: number, - param2: number, - param3: number, - param4: number, - param5: number, - param6: number, - param7: number, - param8: number, - param9: number - ): Promise; - showAsHelpMessage( - param1: string, - param2: number, - param3: number, - param4: number - ): void; - static resetHelpMessage(param1: string): void; -} - -// Based on MusicType.pex -export declare class MusicType extends Form { - static from(form: Form): MusicType; - add(): void; - remove(): void; -} - -// Based on NetImmerse.pex -export declare class NetImmerse { - static from(form: Form): NetImmerse; - static getNodeLocalPosition( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getNodeLocalPositionX( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeLocalPositionY( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeLocalPositionZ( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeLocalRotationEuler( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getNodeLocalRotationMatrix( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getNodeScale( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeWorldPosition( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getNodeWorldPositionX( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeWorldPositionY( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeWorldPositionZ( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): number; - static getNodeWorldRotationEuler( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getNodeWorldRotationMatrix( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getRelativeNodePosition( - ref: ObjectReference, - nodeA: string, - nodeB: string, - _in: number[], - firstPerson: boolean - ): boolean; - static getRelativeNodePositionX( - ref: ObjectReference, - nodeA: string, - nodeB: string, - firstPerson: boolean - ): number; - static getRelativeNodePositionY( - ref: ObjectReference, - nodeA: string, - nodeB: string, - firstPerson: boolean - ): number; - static getRelativeNodePositionZ( - ref: ObjectReference, - nodeA: string, - nodeB: string, - firstPerson: boolean - ): number; - static hasNode( - ref: ObjectReference, - node: string, - firstPerson: boolean - ): boolean; - static setNodeLocalPosition( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static setNodeLocalPositionX( - ref: ObjectReference, - node: string, - x: number, - firstPerson: boolean - ): void; - static setNodeLocalPositionY( - ref: ObjectReference, - node: string, - y: number, - firstPerson: boolean - ): void; - static setNodeLocalPositionZ( - ref: ObjectReference, - node: string, - z: number, - firstPerson: boolean - ): void; - static setNodeLocalRotationEuler( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static setNodeLocalRotationMatrix( - ref: ObjectReference, - node: string, - _in: number[], - firstPerson: boolean - ): boolean; - static setNodeScale( - ref: ObjectReference, - node: string, - scale: number, - firstPerson: boolean - ): void; - static setNodeTextureSet( - ref: ObjectReference, - node: string, - tSet: TextureSet, - firstPerson: boolean - ): void; -} - -// Based on Outfit.pex -export declare class Outfit extends Form { - static from(form: Form): Outfit; - getNthPart(n: number): Form; - getNumParts(): number; -} - -// Based on Projectile.pex -export declare class Projectile extends Form { - static from(form: Form): Projectile; -} - -// Based on Package.pex -export declare class Package extends Form { - static from(form: Form): Package; - getOwningQuest(): Quest; - getTemplate(): Package; -} - -// Based on Perk.pex -export declare class Perk extends Form { - static from(form: Form): Perk; - getNextPerk(): Perk; - getNthEntryLeveledList(n: number): LeveledItem; - getNthEntryPriority(n: number): number; - getNthEntryQuest(n: number): Quest; - getNthEntryRank(n: number): number; - getNthEntrySpell(n: number): Spell; - getNthEntryStage(n: number): number; - getNthEntryText(n: number): string; - getNthEntryValue(n: number, i: number): number; - getNumEntries(): number; - setNthEntryLeveledList(n: number, lList: LeveledItem): boolean; - setNthEntryPriority(n: number, priority: number): boolean; - setNthEntryQuest(n: number, newQuest: Quest): boolean; - setNthEntryRank(n: number, rank: number): boolean; - setNthEntrySpell(n: number, newSpell: Spell): boolean; - setNthEntryStage(n: number, stage: number): boolean; - setNthEntryText(n: number, newText: string): boolean; - setNthEntryValue(n: number, i: number, value: number): boolean; -} - -// Based on Potion.pex -export declare class Potion extends Form { - static from(form: Form): Potion; - getCostliestEffectIndex(): number; - getEffectAreas(): number[]; - getEffectDurations(): number[]; - getEffectMagnitudes(): number[]; - getMagicEffects(): object[]; - getNthEffectArea(index: number): number; - getNthEffectDuration(index: number): number; - getNthEffectMagicEffect(index: number): MagicEffect; - getNthEffectMagnitude(index: number): number; - getNumEffects(): number; - getUseSound(): SoundDescriptor; - isFood(): boolean; - isHostile(): boolean; - isPoison(): boolean; - setNthEffectArea(index: number, value: number): void; - setNthEffectDuration(index: number, value: number): void; - setNthEffectMagnitude(index: number, value: number): void; -} - -// Based on Quest.pex -export declare class Quest extends Form { - static from(form: Form): Quest; - completeAllObjectives(): void; - completeQuest(): void; - failAllObjectives(): void; - getAlias(aiAliasID: number): Alias; - getAliasById(aliasId: number): Alias; - getAliasByName(name: string): Alias; - getAliases(): object[]; - getCurrentStageID(): number; - getID(): string; - getNthAlias(index: number): Alias; - getNumAliases(): number; - getPriority(): number; - isActive(): boolean; - isCompleted(): boolean; - isObjectiveCompleted(aiObjective: number): boolean; - isObjectiveDisplayed(aiObjective: number): boolean; - isObjectiveFailed(aiObjective: number): boolean; - isRunning(): boolean; - isStageDone(aiStage: number): boolean; - isStarting(): boolean; - isStopped(): boolean; - isStopping(): boolean; - reset(): void; - setActive(abActive: boolean): void; - setCurrentStageID(aiStageID: number): Promise; - setObjectiveCompleted(aiObjective: number, abCompleted: boolean): void; - setObjectiveDisplayed( - aiObjective: number, - abDisplayed: boolean, - abForce: boolean - ): void; - setObjectiveFailed(aiObjective: number, abFailed: boolean): void; - start(): Promise; - stop(): void; - updateCurrentInstanceGlobal(aUpdateGlobal: GlobalVariable): boolean; - static getQuest(editorId: string): Quest; -} - -// Based on Race.pex -export declare class Race extends Form { - static from(form: Form): Race; - clearRaceFlag(n: number): void; - getDefaultVoiceType(female: boolean): VoiceType; - getNthSpell(n: number): Spell; - getSkin(): Armor; - getSpellCount(): number; - isRaceFlagSet(n: number): boolean; - setDefaultVoiceType(female: boolean, voice: VoiceType): void; - setRaceFlag(n: number): void; - setSkin(skin: Armor): void; - static getNthPlayableRace(n: number): Race; - static getNumPlayableRaces(): number; - static getRace(editorId: string): Race; -} - -// Based on ReferenceAlias.pex -export declare class ReferenceAlias extends Alias { - static from(form: Form): ReferenceAlias; - addInventoryEventFilter(param1: Form): void; - clear(): void; - forceRefTo(param1: ObjectReference): void; - getReference(): ObjectReference; - removeAllInventoryEventFilters(): void; - removeInventoryEventFilter(param1: Form): void; -} - -// Based on Spell.pex -export declare class Spell extends Form { - static from(form: Form): Spell; - cast(akSource: ObjectReference, akTarget: ObjectReference): Promise; - getCastTime(): number; - getCostliestEffectIndex(): number; - getEffectAreas(): number[]; - getEffectDurations(): number[]; - getEffectMagnitudes(): number[]; - getEffectiveMagickaCost(caster: Actor): number; - getEquipType(): EquipSlot; - getMagicEffects(): object[]; - getMagickaCost(): number; - getNthEffectArea(index: number): number; - getNthEffectDuration(index: number): number; - getNthEffectMagicEffect(index: number): MagicEffect; - getNthEffectMagnitude(index: number): number; - getNumEffects(): number; - getPerk(): Perk; - isHostile(): boolean; - preload(): void; - remoteCast( - akSource: ObjectReference, - akBlameActor: Actor, - akTarget: ObjectReference - ): Promise; - setEquipType(type: EquipSlot): void; - setNthEffectArea(index: number, value: number): void; - setNthEffectDuration(index: number, value: number): void; - setNthEffectMagnitude(index: number, value: number): void; - unload(): void; -} - -// Based on Static.pex -export declare class Static extends Form { - static from(form: Form): Static; -} - -// Based on Scene.pex -export declare class Scene extends Form { - static from(form: Form): Scene; - forceStart(): void; - getOwningQuest(): Quest; - isActionComplete(param1: number): boolean; - isPlaying(): boolean; - start(): void; - stop(): void; -} - -// Based on Scroll.pex -export declare class Scroll extends Form { - static from(form: Form): Scroll; - cast(akSource: ObjectReference, akTarget: ObjectReference): Promise; - getCastTime(): number; - getCostliestEffectIndex(): number; - getEffectAreas(): number[]; - getEffectDurations(): number[]; - getEffectMagnitudes(): number[]; - getEquipType(): EquipSlot; - getMagicEffects(): object[]; - getNthEffectArea(index: number): number; - getNthEffectDuration(index: number): number; - getNthEffectMagicEffect(index: number): MagicEffect; - getNthEffectMagnitude(index: number): number; - getNumEffects(): number; - getPerk(): Perk; - setEquipType(type: EquipSlot): void; - setNthEffectArea(index: number, value: number): void; - setNthEffectDuration(index: number, value: number): void; - setNthEffectMagnitude(index: number, value: number): void; -} - -// Based on ShaderParticleGeometry.pex -export declare class ShaderParticleGeometry extends Form { - static from(form: Form): ShaderParticleGeometry; - apply(param1: number): void; - remove(param1: number): void; -} - -// Based on Shout.pex -export declare class Shout extends Form { - static from(form: Form): Shout; - getNthRecoveryTime(n: number): number; - getNthSpell(n: number): Spell; - getNthWordOfPower(n: number): WordOfPower; - setNthRecoveryTime(n: number, time: number): void; - setNthSpell(n: number, aSpell: Spell): void; - setNthWordOfPower(n: number, aWoop: WordOfPower): void; -} - -// Based on SoulGem.pex -export declare class SoulGem extends MiscObject { - static from(form: Form): SoulGem; - getGemSize(): number; - getSoulSize(): number; -} - -// Based on Sound.pex -export declare class Sound extends Form { - static from(form: Form): Sound; - getDescriptor(): SoundDescriptor; - play(akSource: ObjectReference): number; - playAndWait(akSource: ObjectReference): Promise; - static setInstanceVolume(aiPlaybackInstance: number, afVolume: number): void; - static stopInstance(aiPlaybackInstance: number): void; -} - -// Based on SoundCategory.pex -export declare class SoundCategory extends Form { - static from(form: Form): SoundCategory; - mute(): void; - pause(): void; - setFrequency(param1: number): void; - setVolume(param1: number): void; - unMute(): void; - unPause(): void; -} - -// Based on SoundDescriptor.pex -export declare class SoundDescriptor extends Form { - static from(form: Form): SoundDescriptor; - getDecibelAttenuation(): number; - getDecibelVariance(): number; - getFrequencyShift(): number; - getFrequencyVariance(): number; - setDecibelAttenuation(dbAttenuation: number): void; - setDecibelVariance(dbVariance: number): void; - setFrequencyShift(frequencyShift: number): void; - setFrequencyVariance(frequencyVariance: number): void; -} - -// Based on TESModPlatform.pex -export declare class TESModPlatform { - static from(form: Form): TESModPlatform; - static addItemEx( - containerRefr: ObjectReference, - item: Form, - countDelta: number, - health: number, - enchantment: Enchantment, - maxCharge: number, - removeEnchantmentOnUnequip: boolean, - chargePercent: number, - textDisplayData: string, - soul: number, - poison: Potion, - poisonCount: number - ): void; - static blockPapyrusEvents(block: boolean): void; - static clearTintMasks(targetActor: Actor): void; - static createNpc(): ActorBase; - static getNthVtableElement( - pointer: Form, - pointerOffset: number, - elementIndex: number - ): number; - static getSkinColor(base: ActorBase): ColorForm; - static isPlayerRunningEnabled(): boolean; - static moveRefrToPosition( - refr: ObjectReference, - cell: Cell, - world: WorldSpace, - posX: number, - posY: number, - posZ: number, - rotX: number, - rotY: number, - rotZ: number - ): void; - static pushTintMask( - targetActor: Actor, - type: number, - argb: number, - texturePath: string - ): void; - static pushWornState(worn: boolean, wornLeft: boolean): void; - static resetContainer(container: Form): void; - static resizeHeadpartsArray(npc: ActorBase, newSize: number): void; - static resizeTintsArray(newSize: number): void; - static setFormIdUnsafe(Form: Form, newId: number): void; - static setNpcHairColor(npc: ActorBase, hairColor: number): void; - static setNpcRace(npc: ActorBase, race: Race): void; - static setNpcSex(npc: ActorBase, sex: number): void; - static setNpcSkinColor(npc: ActorBase, skinColor: number): void; - static setWeaponDrawnMode(actor: Actor, mode: number): void; - static updateEquipment(actor: Actor, item: Form, leftHand: boolean): void; -} - -// Based on TalkingActivator.pex -export declare class TalkingActivator extends Activator { - static from(form: Form): TalkingActivator; -} - -// Based on TextureSet.pex -export declare class TextureSet extends Form { - static from(form: Form): TextureSet; - getNthTexturePath(n: number): string; - getNumTexturePaths(): number; - setNthTexturePath(n: number, texturePath: string): void; -} - -// Based on Topic.pex -export declare class Topic extends Form { - static from(form: Form): Topic; - add(): void; -} - -// Based on TopicInfo.pex -export declare class TopicInfo extends Form { - static from(form: Form): TopicInfo; - getOwningQuest(): Quest; -} - -// Based on TreeObject.pex -export declare class TreeObject extends Form { - static from(form: Form): TreeObject; - getHarvestSound(): SoundDescriptor; - getIngredient(): Form; - setHarvestSound(akSoundDescriptor: SoundDescriptor): void; - setIngredient(akIngredient: Form): void; -} - -// Based on Ui.pex -export declare class Ui { - static from(form: Form): Ui; - static closeCustomMenu(): void; - static getBool(menuName: string, target: string): boolean; - static getFloat(menuName: string, target: string): number; - static getInt(menuName: string, target: string): number; - static getString(menuName: string, target: string): string; - static invokeBool(menuName: string, target: string, arg: boolean): void; - static invokeBoolA(menuName: string, target: string, args: boolean[]): void; - static invokeFloat(menuName: string, target: string, arg: number): void; - static invokeFloatA(menuName: string, target: string, args: number[]): void; - static invokeForm(menuName: string, target: string, arg: Form): void; - static invokeInt(menuName: string, target: string, arg: number): void; - static invokeIntA(menuName: string, target: string, args: number[]): void; - static invokeString(menuName: string, target: string, arg: string): void; - static invokeStringA(menuName: string, target: string, args: string[]): void; - static isMenuOpen(menuName: string): boolean; - static isTextInputEnabled(): boolean; - static openCustomMenu(swfPath: string, flags: number): void; - static setBool(menuName: string, target: string, value: boolean): void; - static setFloat(menuName: string, target: string, value: number): void; - static setInt(menuName: string, target: string, value: number): void; - static setString(menuName: string, target: string, value: string): void; -} - -// Based on VisualEffect.pex -export declare class VisualEffect extends Form { - static from(form: Form): VisualEffect; - play(param1: ObjectReference, param2: number, param3: ObjectReference): void; - stop(param1: ObjectReference): void; -} - -// Based on VoiceType.pex -export declare class VoiceType extends Form { - static from(form: Form): VoiceType; -} - -// Based on Weapon.pex -export declare class Weapon extends Form { - static from(form: Form): Weapon; - fire(akSource: ObjectReference, akAmmo: Ammo): void; - getBaseDamage(): number; - getCritDamage(): number; - getCritEffect(): Spell; - getCritEffectOnDeath(): boolean; - getCritMultiplier(): number; - getEnchantment(): Enchantment; - getEnchantmentValue(): number; - getEquipType(): EquipSlot; - getEquippedModel(): Static; - getIconPath(): string; - getMaxRange(): number; - getMessageIconPath(): string; - getMinRange(): number; - getModelPath(): string; - getReach(): number; - getResist(): string; - getSkill(): string; - getSpeed(): number; - getStagger(): number; - getTemplate(): Weapon; - getWeaponType(): number; - setBaseDamage(damage: number): void; - setCritDamage(damage: number): void; - setCritEffect(ce: Spell): void; - setCritEffectOnDeath(ceod: boolean): void; - setCritMultiplier(crit: number): void; - setEnchantment(e: Enchantment): void; - setEnchantmentValue(value: number): void; - setEquipType(type: EquipSlot): void; - setEquippedModel(model: Static): void; - setIconPath(path: string): void; - setMaxRange(maxRange: number): void; - setMessageIconPath(path: string): void; - setMinRange(minRange: number): void; - setModelPath(path: string): void; - setReach(reach: number): void; - setResist(resist: string): void; - setSkill(skill: string): void; - setSpeed(speed: number): void; - setStagger(stagger: number): void; - setWeaponType(type: number): void; -} - -// Based on Weather.pex -export declare class Weather extends Form { - static from(form: Form): Weather; - forceActive(abOverride: boolean): void; - getClassification(): number; - getFogDistance(day: boolean, type: number): number; - getSunDamage(): number; - getSunGlare(): number; - getWindDirection(): number; - getWindDirectionRange(): number; - setActive(abOverride: boolean, abAccelerate: boolean): void; - static findWeather(auiType: number): Weather; - static getCurrentWeather(): Weather; - static getCurrentWeatherTransition(): number; - static getOutgoingWeather(): Weather; - static getSkyMode(): number; - static releaseOverride(): void; -} - -// Based on WordOfPower.pex -export declare class WordOfPower extends Form { - static from(form: Form): WordOfPower; -} - -// Based on WorldSpace.pex -export declare class WorldSpace extends Form { - static from(form: Form): WorldSpace; -} - -// Based on Utility.pex -export declare class Utility { - static from(form: Form): Utility; - static captureFrameRate(numFrames: number): string; - static createAliasArray(size: number, fill: Alias): object[]; - static createBoolArray(size: number, fill: boolean): boolean[]; - static createFloatArray(size: number, fill: number): number[]; - static createFormArray(size: number, fill: Form): object[]; - static createIntArray(size: number, fill: number): number[]; - static createStringArray(size: number, fill: string): string[]; - static endFrameRateCapture(): void; - static gameTimeToString(afGameTime: number): Promise; - static getAverageFrameRate(): number; - static getBudgetCount(): number; - static getBudgetName(aiBudgetNumber: number): string; - static getCurrentBudget(aiBudgetNumber: number): number; - static getCurrentGameTime(): number; - static getCurrentMemory(): number; - static getCurrentRealTime(): number; - static getINIBool(ini: string): boolean; - static getINIFloat(ini: string): number; - static getINIInt(ini: string): number; - static getINIString(ini: string): string; - static getMaxFrameRate(): number; - static getMinFrameRate(): number; - static isInMenuMode(): boolean; - static overBudget(aiBudgetNumber: number): boolean; - static randomFloat(afMin: number, afMax: number): number; - static randomInt(aiMin: number, aiMax: number): number; - static resizeAliasArray( - source: object[], - size: number, - fill: Alias - ): object[]; - static resizeBoolArray( - source: boolean[], - size: number, - fill: boolean - ): boolean[]; - static resizeFloatArray( - source: number[], - size: number, - fill: number - ): number[]; - static resizeFormArray(source: object[], size: number, fill: Form): object[]; - static resizeIntArray(source: number[], size: number, fill: number): number[]; - static resizeStringArray( - source: string[], - size: number, - fill: string - ): string[]; - static setINIBool(ini: string, value: boolean): void; - static setINIFloat(ini: string, value: number): void; - static setINIInt(ini: string, value: number): void; - static setINIString(ini: string, value: string): void; - static startFrameRateCapture(): void; - static wait(afSeconds: number): Promise; - static waitGameTime(afHours: number): Promise; - static waitMenuMode(afSeconds: number): Promise; -} diff --git a/skymp5-client0/test/idManager.test.ts b/skymp5-client0/test/idManager.test.ts deleted file mode 100644 index 448812bd2b..0000000000 --- a/skymp5-client0/test/idManager.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IdManager } from "../src/lib/idManager"; - -describe("IdManager", () => { - it("should create ordered ids for values", () => { - const m = new IdManager(); - expect(m.allocateIdFor(121)).toEqual(0); - expect(m.allocateIdFor(213)).toEqual(1); - expect(m.allocateIdFor(999)).toEqual(2); - - m.freeIdFor(213); - expect(m.allocateIdFor(11111)).toEqual(1); - expect(m.allocateIdFor(11112)).toEqual(3); - - expect(m.getId(121)).toEqual(0); - expect(m.getId(213)).toEqual(-1); - expect(m.getId(999)).toEqual(2); - expect(m.getId(11111)).toEqual(1); - expect(m.getId(11112)).toEqual(3); - - expect(m.getValueById(0)).toEqual(121); - }); -}); diff --git a/skymp5-client0/tsconfig.front.json b/skymp5-client0/tsconfig.front.json deleted file mode 100644 index 3403530bad..0000000000 --- a/skymp5-client0/tsconfig.front.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "skipLibCheck": true, - "module": "System", - "target": "ES5", - "outFile": "./dist_front/skymp5-client.js", - "rootDir": "", - "paths": { - "chai": ["./node_modules/@types/chai"] - } - }, - "exclude": ["src/back"] -} diff --git a/skymp5-client0/tsconfig.json b/skymp5-client0/tsconfig.json deleted file mode 100644 index 913ba3da74..0000000000 --- a/skymp5-client0/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "noImplicitAny": true, - "baseUrl": "./src/skyrim-platform", - "lib": ["ES2015", "es2017"], - }, - "include": ["src"] -} - \ No newline at end of file diff --git a/skyrim-platform/.github/workflows/deploy.yml b/skyrim-platform/.github/workflows/deploy.yml deleted file mode 100644 index 03973a9437..0000000000 --- a/skyrim-platform/.github/workflows/deploy.yml +++ /dev/null @@ -1,54 +0,0 @@ -on: - push: - branches: - - master - pull_request: - branches: - - master -jobs: - build: - runs-on: windows-latest - env: - buildDir: "${{ github.workspace }}/build/" - steps: - - uses: actions/checkout@master - with: - submodules: "recursive" - fetch-depth: 0 - - # Install latest CMake. - - uses: lukka/get-cmake@latest - - - uses: actions/setup-node@v2 - with: - node-version: "12" - - name: Run CMake to generate project file and build the project - uses: lukka/run-cmake@v3 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: "CMakeLists.txt" - buildDirectory: ${{ env.buildDir }} - # This input tells run-cmake to consume the vcpkg.cmake toolchain file set by run-vcpkg. - useVcpkgToolchainFile: true - buildWithCMake: true - buildWithCMakeArgs: "--config Release" - - name: Use dev_service to pack everything into a dist directory - working-directory: ./tools/dev_service - run: npm run pack - - name: Create an archive - shell: bash - run: | - mkdir ./builds - 7z a -t7z -mx=9 ./builds/skyrim-platform-$(git describe --tags).7z ./tools/dev_service/dist/* - - run: ls . - - run: ls ./tools/dev_service/dist - - uses: shallwefootball/s3-upload-action@master - if: ${{ github.event_name == 'push' }} - name: Upload S3 - id: S3 - with: - aws_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY}} - aws_bucket: "skyrim-platform-builds" - source_dir: "./builds" - destination_dir: "" diff --git a/skyrim-platform/.github/workflows/npmpublish.yml b/skyrim-platform/.github/workflows/npmpublish.yml deleted file mode 100644 index 36daf47076..0000000000 --- a/skyrim-platform/.github/workflows/npmpublish.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Node.js Package - -on: - release: - types: [created] - -jobs: - publish-npm: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://registry.npmjs.org/ - - run: mkdir dist_codegen && cd src/platform_se/codegen && node index.js && mv skyrimPlatform.ts ../../../dist_codegen/index.ts - - run: npm publish --access public - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} \ No newline at end of file diff --git a/skyrim-platform/.npmignore b/skyrim-platform/.npmignore deleted file mode 100644 index 0f5d7a8876..0000000000 --- a/skyrim-platform/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -src -tools diff --git a/skyrim-platform/CMakeLists.txt b/skyrim-platform/CMakeLists.txt index 9bd1009733..46d1297e79 100644 --- a/skyrim-platform/CMakeLists.txt +++ b/skyrim-platform/CMakeLists.txt @@ -1,8 +1,3 @@ -set(VCPKG_TARGET_TRIPLET "x64-windows-sp") -set(VCPKG_OVERLAY_TRIPLETS "${CMAKE_CURRENT_LIST_DIR}/overlay_triplets") -set(VCPKG_OVERLAY_PORTS "${CMAKE_CURRENT_LIST_DIR}/overlay_ports") -set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake") - cmake_minimum_required(VERSION 3.19.1) project(platform_se) @@ -52,5 +47,5 @@ endif() message(STATUS "Found CEF: ${CEF_ROOT}") list(APPEND CMAKE_MODULE_PATH "${CEF_ROOT}/cmake") -set(SKYRIM_MP_ROOT ${CMAKE_SOURCE_DIR}) +set(SKYRIM_MP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(src/platform_se _platform_se) \ No newline at end of file diff --git a/skyrim-platform/docs/BuildingIssues_RU.md b/skyrim-platform/docs/BuildingIssues_RU.md deleted file mode 100644 index 2d04fb6e3d..0000000000 --- a/skyrim-platform/docs/BuildingIssues_RU.md +++ /dev/null @@ -1,32 +0,0 @@ -### После изменения версии vcpkg необходимо - -- Удалить следующие файлы и директории: - -``` -skyrim-platform\build\CMakeFiles -skyrim-platform\build\CMakeCache.txt -skyrim-platform\build\_platform_se_\CMakeFiles -skyrim-platform\build\_platform_se_\CMakeCache.txt -``` - -- Перегенерировать проект (`cd C:/Projects/skyrim-platform/build && cmake -DCEF_DIR=C:/Projects/cef64 -DSKYRIM_DIR="C:/Program Files (x86)/Steam/steamapps/common/Skyrim Special Edition" ..`) - -### Building package directxtk:x64-windows-static failed with: BUILD_FAILED - -- Откройте `C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt\wrl\module.h` на строке `1427` - -- Удалите или закомментите эти строчки: - -```c++ - Details::CheckForDuplicateEntries((GetFirstEntryPointer() + 1), GetMidEntryPointer(), - [](const Details::CreatorMap* entry, const Details::CreatorMap* entry2) -> void { - __WRL_ASSERT__(entry->activationId.clsid != entry2->activationId.clsid && "Duplicate CLSID!"); - } - ); - - Details::CheckForDuplicateEntries((GetMidEntryPointer() + 1), GetLastEntryPointer(), - [](const Details::CreatorMap* entry, const Details::CreatorMap* entry2) -> void { - __WRL_ASSERT__(::wcscmp((entry->activationId.getRuntimeName)(), (entry2->activationId.getRuntimeName)()) != 0 && "Duplicate runtime class name!"); - } - ); -``` diff --git a/skyrim-platform/docs/CommitNaming_RU.md b/skyrim-platform/docs/CommitNaming_RU.md deleted file mode 100644 index fa6a7806ef..0000000000 --- a/skyrim-platform/docs/CommitNaming_RU.md +++ /dev/null @@ -1,61 +0,0 @@ -# Теги - -`[DOCS]` Изменения в текстовых файлах, предназначенных для чтения сторонними людьми (документация). -`[INTERNAL]` Изменение настроек сборки, исправление ошибок сборки, изменения разных скриптах, в том числе в **генерации документации** и прочие изменения, не затрагивающие код, выполняющийся на конечной машине, **кроме автотестов**. Также изменения в текстовых файлах, предназначенных для мейнтейнеров SP. -`[TESTS]` Изменения в автотестах. -`[REFACT]` Изменения в коде, не затрагивающие функциональность. -`[OPTIMIZE]` Изменения в коде с целью повышения производительности. -`[MAJOR]` Тег ставится, когда в коммите сделаны обратно несовместимые изменения API. -`[MINOR]` Тег ставится, когда вы добавляете новую функциональность, не нарушая обратной совместимости. -`[FIX]` Тег ставится, когда коммит исправляет баг или краш. - -## Список доступных комбинаций - -Никаким другим образом теги комбинировать нельзя. - -`[DOCS]` -`[INTERNAL]` -`[TESTS]` -`[REFACT]` -`[OPTIMIZE]` -`[MAJOR]` -`[MINOR]` -`[FIX]` - -## Закрытие issue коммитом - -Если для бага или улучшения, которое делается коммитом существует открытый issue, то коммит должен называться по форме `[TAG1][TAG2] My awesome commit (close #108)` - -## Примеры - -`[FIX] Crash in ObjectReference::СlearDestruction (close #108)` - Исправили краш при вызове функции ObjectReference.clearDestruction. - -`[OPTIMIZE] Function search (close #108)` - Улучшили поиск функций в плане скорости работы. - -`[REFACT] Function search (close #108)` - Улучшили поиск функций в плане внешнего вида кода. - -## Протокол действий при нарушении версионирования - -### Мажорная версия - -Если обратная совместимость была нарушена коммитом, не имеющим тега `[MAJOR]`, то такое нарушение считается багом. - -- Делается исправление коммитом с тегом `[FIX]`, восстанавливающее совместимость. -- Выпускается пустой коммит `[MAJOR] Bump major version`. Тем самым мы признаём, что мы хотели сломать совместимость, но забыли поставить тег `[MAJOR]` ранее. - -### Минорная версия - -- Выпускается пустой коммит `[MINOR] Bump minor version` - -## Выпуск версий - -Каждую пятницу в 23:59 делается коммит вида `[PUBLISH] Stable 1.2.3`, на него ставится тег, соответствующий версии, напр., `1.2.3`, после чего он пушится в master. - -Если никаких коммитов с предыдущего `[PUBLISH] ...` не последовало, то новая версия не публикуется (пропускается неделя). - -В skymp можно использовать только версии платформы вида `1.2.3`, без хеша коммита и т.д. Если в skymp нужно срочно обновить платформу, выпускается коммит вида `[PUBLISH] Hotfix 1.2.3` в ручном режиме: - -1. `git commit --allow-empty` -2. `git tag 1.2.3` -3. `git push origin 1.2.3` -4. `git push origin master` diff --git a/skyrim-platform/docs/Docs_RU.md b/skyrim-platform/docs/Docs_RU.md deleted file mode 100644 index 1a092b0661..0000000000 --- a/skyrim-platform/docs/Docs_RU.md +++ /dev/null @@ -1,276 +0,0 @@ - - -### Papyrus-типы из оригинальной игры -* Все типы в SkyrimPlatform имеют такое же название как и в Papyrus, например: `Game`, `Actor`, `Form`, `Spell`, `Perk` и т.д. - -* Для использования типов из Papyrus, включая вызов методов и статических функций, которыми они обладают, их нужно импортировать: -```typescript -import { Game, Actor } from "../skyrimPlatform" -``` -### Нативные функции -* У большинства типов присутствует перечень нативных функций, они делятся на статические функции (`Native Global` в Papyrus) и методы (`Native`). - -* Статические функции вызываются на типе: -```typescript -let sunX = Game.GetSunPositionX(); -let pl = Game.GetPlayer(); -Game.forceFirstPerson(); -``` - -* Методы вызываются на объекте: - ```typescript - let isPlayerInCombat = pl.isInCombat(); - ``` - -* Список типов оригинальной игры с документацией можно найти здесь: https://www.creationkit.com/index.php?title=Category:Script_Objects -* Вызов функций из оригинальной игры доступен только внутри обработчика события `update` (см. ниже). При попытке сделать это в другом контексте, исключение будет выброшено. - -### Form -* Форму (`Form`) наследуют большинство игровых типов, имеющих методы, такие как `Actor`, `Weapon` и т.д. -* У каждой формы есть ID, представляющий собой 32-битное беззнаковое число (`uint32_t`). В SkyrimPlatform представлена типом `number`. -* Если вам нужно найти форму по ее ID, используйте `Game.getFormEx`. Обратите внимание, что именно `Game.getFormEx`, а не `Game.getForm`. Последняя всегда возвращает `null` для ID выше 0x80000000 (поведение оригинальной игры). -* Получить ID формы можно с помощью метода `getFormID`. Гарантируется, что `Game.getFormEx` будет находить форму по ID, который был возвращён данным методом, если форма не была уничтожена игрой. - -### Безопасное использование объектов -* После того как вы получили объект нужно убедиться, что он не является `null`: -```typescript -let actor = Game.findClosestActor(x, y, z, radius); -if (actor) { - let isInCombat = actor.isInCombat(); -} -``` -Или -```typescript -let actor = Game.findClosestActor(x, y, z, radius); -if (!actor) return; -let isInCombat = actor.isInCombat(); -``` -* Гарантируется, что `Game.getPlayer` никогда не возвращает `null`. - -### Необработанные исключения -* Необработанные JS-исключения будут выведены в консоль вместе со стеком вызовов. -* Необработанные Promise rejections также выводятся в консоль. -* Не выпускайте плагины, в которых есть известные вам ошибки, которые не обрабатываются. Стабильная работа SkyrimPlatform не гарантируется при необработанных исключениях. - - -### Сравнение объектов -* Для сравнения объектов в SkyrimPlatform вам нужно сравнить их ID: -```typescript -if (object1.getFormId() === object2.getFormId()) -``` - -### Приведение объектов к строке -* Типы, портированные из Papyrus имеют ограниченную поддержку ряда операций, нормальных для обычных JS-объектов, таких как `toString`, `toJSON`. -```typescript -Game.getPlayer().toString(); // '[object Actor]' -JSON.stringify(Game.getPlayer()); // `{}` -``` - -### Приведение типов -* Если у вас есть объект `Form` являющийся оружием, а вам нужен `Weapon`, вы можете использовать приведение типов: -```typescript -let sword = Game.getFormEx(swordId); // Получаем Form -let weap = Weapon.from(sword); // Приводим к Weapon -``` -* Если вы указали ID формы которая на самом деле не является оружием переменная `weap` будет равна `null`. -* Передача `null` в функцию для приведения типов в качестве аргумента не бросит исключение , а вернет `null`: -```typescript -ObjectReference.from(null); // null -``` -* Попытка привести к типу, не имеющему экземпляров или несовместимому по иерархии наследования, также вернёт `null`: -```typescript -Game.from(Game.getPlayer()); // null -Spell.from(Game.getPlayer()); // null -``` -* Также можно использовать приведение типов для того чтобы получить объект базового типа, включая `Form`: -```typescript -let refr = ObjectReference.from(Game.getPlayer()); -let form = Form.from(refr); -``` -* Приведение объекта к его же типу вернёт оригинальный объект: -```typescript -let actor = Actor.from(Game.getPlayer()); -``` - -### Papyrus-типы, добавленные SkyrimPlatform -* SkyrimPlatform в настоящее время добавляет только один тип: `TESModPlatform`. Экземпляры данного типа не существуют по аналогии с `Game`. Ниже перечислены его стататические функции. -* `moveRefrToPosition` - телепортирует объект в заданную локацию и позицию. -* `setWeaponDrawnMode` - заставляет актёра всегда держать оружие достанным/убранным. -* `getNthVtableElement` - получает сдвиг функции из виртуальной таблицы (для реверс-инжиниринга). -* `getSkinColor` - получает цвет кожи ActorBase. -* `createNpc` - создаёт новую форму типа ActorBase. -* `setNpcSex` - изменяет пол ActorBase. -* `setNpcRace` - изменяет расу ActorBase. -* `setNpcSkinColor` - изменяет цвет кожи ActorBase. -* `setNpcHairColor` - изменяет цвет волос ActorBase. -* `resizeHeadpartsArray` - изменяет размер массива частей головы ActorBase. -* `resizeTintsArray` - изменяет размер массива TintMasks главного героя. -* `setFormIdUnsafe` - изменяет ID формы. Небезопасно, используйте на свой страх и риск. -* `clearTintMasks` - удалить TintMasks для данного Actor или ГГ, если Actor не передан. -* `pushTintMask` - добавить TintMask с опр. параметрами для данного Actor или ГГ, если Actor не передан. -* `pushWornState`, `addItemEx` - добавить/удалить предметы с опр. ExtraData. -* `updateEquipment` - обновить экипировку (нестабильно). -* `resetContainer` - очистить базовый контейнер. - - -### Асинхронность -* Выполнение некоторых игровых функций занимает время и происходит в фоновом режиме. Такие функции в SkyrimPlatform возвращают `Promise`: -```typescript -Game.getPlayer().setPosition(0,0,0).then(() => { - printConsole('Teleported to the center of the world'); -}); -``` -```typescript -Utility.wait(1).then(() => printConsole('1 second passed')); -``` -* При асинхронном вызове выполнение продолжается немедленно: -```typescript -Utility.wait(1); -printConsole(`Выведется сразу, а не через секунду`); -printConsole(`Надо было юзать then`); -``` -* Вы можете использовать `async`/`await`, чтобы код выглядел синхронным: -```typescript -let f = async () => { - await Utility.wait(1); - printConsole('1 second passed'); -}; -``` - -### События - -* На данный момент в SkyrimPlatform есть возможность подписаться на собственные события: `update` и `tick`. - -* `update` - это событие, которое вызывается один раз за каждый кадр в игре (60 раз в секунду при 60 FPS) после того как вы загрузили сохранение или начали новую игру. -```typescript -import { on } from "../skyrimPlatform" -on('update', () => { -// На данном этапе методы всех импортированых -// типов уже доступны. -}); -``` - -* `tick` - это событие которые вызывается один раз за каждый кадр в игре сразу после запуска игры. -```typescript -import { on } from "../skyrimPlatform" -on('tick', () => { -// Тут нет доступа к игровым методам. -}); -``` -* А также на игровые события, такие как `effectStart`, `effectFinish`, `magicEffectApply`, `equip`, `unequip`, `hit`, `containerChanged`, `deathStart`, `deathEnd`, `loadGame`, `combatState`, `reset`, `scriptInit`, `trackedStats`, `uniqueIdChange`, `switchRaceComplete`, `cellFullyLoaded`, `grabRelease`, `lockChanged`, `moveAttachDetach`, `objectLoaded`, `waitStop`, `activate`. - -* С помощью `on` можно навсегда подписаться на событие. -```typescript -import { on } from "../skyrimPlatform" -on("equip", (even) => { - printConsole(`actor: ${even.actor.getBaseObject().getName()}`); - printConsole(`object: ${even.baseObj.getName()}`); -}); -``` -* С помощью `once` можно добавить обработчик, который вызовется единожды при следующем срабатывании события. -```typescript -import { once } from "../skyrimPlatform" -once("equip", (even) => { - printConsole(`actor: ${even.actor.getBaseObject().getName()}`); - printConsole(`object: ${even.baseObj.getName()}`); -}); -``` -* В переменной `even` всегда содержатся переменные касающиеся того события на которое вы подписаны. - -### Хуки -* Хуки позволяют перехватывать запуск и завершение некоторых функций движка игры. -* Поддерживаемые хуки в данный момент: `sendAnimationEvent` -```typescript -import { hooks, printConsole } from "../skyrimPlatform" -hooks.sendAnimationEvent.add({ - enter(ctx) { - printConsole(ctx.animEventName); - }, - leave(ctx) { - if (ctx.animationSucceeded) printConsole(ctx.selfId); - }; -}); -``` -* `enter` вызывается перед запуском функции. `ctx` содержит аргументы, переданные в функцию, а также `storage` (см. ниже). -* `leave` вызывается перед завершением функции. `ctx` содержит возвращаемое значение функции, помимо того, что в нём было после завершения `enter`. -* `ctx` - это один и тот же объект для вызовов `enter` и `leave`. -* `ctx.storage` служит для хранения данных между вызовами `enter` и `leave`. -* Скриптовые функции недоступны внутри обработчиков `enter` и `leave`. - -### Собственные методы и свойства SkyrimPlatform -* Существуют методы, например, такие как `printConsole()`, которые можно вызвать сразу после импортирования. Они не относятся ни к одному из игровых типов. -* `printConsole(...arguments: any[]): void` - вывод в игровую консоль, открывающуюся на клавишу `~`. -```typescript -import { printConsole, Game } from "../skyrimPlatform" -on('update', () => { - printConsole(`player id = ${Game.getPlayer().getFormID()}`); -}); -``` -* `worldPointToScreenPoint` - преобразовать массив точек игрового мира в массив точек на экране пользователя. Точка на экране обозначается 3 числами от -1 до 1. -* `on(eventName: string, callback: any): void` - подписаться на событие с именем `eventName`. -* `callNative(className: string, functionName: string, self?: object, ...args: any): any` - вызвать функцию из оригинальной игры по имени. -* `getJsMemoryUsage(): number` - получить количество оперативной памяти, используемой встроенным JS-движком, в байтах. -* `storage` - объект, служащий для сохранения данных между перезагрузкой скриптов. -* `browser` - объект, предоставляющий доступ к Chromium Embedded Framework. -* `getExtraContainerChanges` - получить ExtraContainerChanges данного ObjectReference. -* `getContainer` - получить все предметы базового контейнера. -* `settings` - объект, предоставляющий доступ к настройкам плагинов: -```typescript -import { settings, printConsole } from "../skyrimPlatform" -let option = settings["plugin-name"]["my-option"]; -printConsole(option); -``` -Файл с настройками для плагина называется `имя-плагина-settings.txt` и должен находиться в папке `Data/Platform/Plugins`. -Формат файла - JSON, расширение `.txt` - для удобства пользователей. - -### Изменение игровых консольных команд -* SkyrimPlatform позволяет изменить реализацию любой консольной команды игры, для подобной модификации вам необходимо получить объект консольной команды, передав имя команды в метод `findConsoleCommand(commandName)` короткое или длинное. -```typescript -let getAV = findConsoleCommand("GetActorValueInfo"); - -let getAV = findConsoleCommand("GetAVInfo"); -``` -* Получив такой объект вы можете изменить короткое (`shortName`) или же длинное (`longName`) имя команды, а также количество принимаемых аргументов (`numArgs`) и функцию (`execute`) которая будет выполнятся при вызове этой консольной команды через консоль игры. -```typescript -getAV.longName = "printArg"; -getAV.shortName = ""; - -getAV.execute = (refrId: number, arg: string) => { - printConsole(arg); - return false; -}; -``` -* Возвращаемое значение вашей новой реализации указывает на то, будет ли выполнена оригинальная функция этой команды. -* Первым аргументом передаётся FormId объекта, на котором вызывается консольная команда или 0 в случае его отсутствия. -* Остальными параметрами будут аргументы, с которыми была вызвана консольная команда, имеющие тип `string` или `number`. -* Поскольку игровые функции не доступны в данном контексте, вы должны зарегистрировать обработчик события `update` с помощью `once`, если требуется вызвать игровую функцию при вызове консольной команды: - -```typescript -getAV.longName = "ShowMessageBox"; -getAV.shortName = ""; - -getAV.execute = (refrId: number, arg: string) => { - once("update", () => { - Debug.messageBox(arg); - }); - return false; -}; -``` - -### HTTP-запросы (experimental) -SkyrimPlatform предоставляет ограниченную поддержку HTTP-запросов. -В данный момент только `get` доступен. -```typescript -import { HttpClient, } from "../skyrimPlatfosrm"; -let http = new HttpClient('vk.com', 80); -http.get('/').then(response => printConsole(response.body)); -``` -* В случае, если запрос завершился неудачно, `response.body` будет пуст. - -### Hot Reload -* Hot Reload для SkyrimPlatform-плагинов поддерживается. Изменение содержимого `Data/Platform/Plugins` вызывает перезагрузку всех плагинов без перезапуска игры. -* Для полноценного использования это фичи, т.е. перезагрузки вашего плагина при Ctrl+S, возьмите за основу пример плагина https://github.com/skyrim-multiplayer/skyrimplatform-plugin-example -* При перезагрузке плагинов добавленные обработчики событий и хуков удаляются, прерываются асинхронные операции и обнуляются все переменные, кроме `storage` и его свойств. - -### DumpFunctions -* В SkyrimPlatform встроен функционал, позволяющий вывести в файл `Data/Platform/Output/DumpFunctions.txt` информацию об игровых функциях (сочетание клавиш 9+O+L). Игра приостанавливается на несколько секунд в ходе работы DumpFunctions. diff --git a/skyrim-platform/hooks/commit-msg.hook b/skyrim-platform/hooks/commit-msg.hook deleted file mode 100644 index f1b24e7d81..0000000000 --- a/skyrim-platform/hooks/commit-msg.hook +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/python -import re -import sys - -allowed_tags = ["PUBLISH", "DOCS", "INTERNAL", "TESTS", "REFACT", "OPTIMIZE", "MAJOR", "MINOR", "FIX"] -try: - data = open(sys.argv[1]).read() - tags = re.findall(r"\[(.+)\]", data) - print(tags) - if len(tags) == 1 and tags[0] in allowed_tags: - sys.exit(0) - else: - print("Aborting commit. Your commit message does not follow the rules specified in CommitNaming_RU.md") - sys.exit(-1) -except IndexError: - print("IndexError") - sys.exit(-1) diff --git a/skyrim-platform/overlay_ports/jsengine/portfile.cmake b/skyrim-platform/overlay_ports/jsengine/portfile.cmake deleted file mode 100644 index d9a1e4dd66..0000000000 --- a/skyrim-platform/overlay_ports/jsengine/portfile.cmake +++ /dev/null @@ -1,17 +0,0 @@ -vcpkg_from_github( - OUT_SOURCE_PATH SOURCE_PATH - REPO skyrim-multiplayer/JsEngine - REF 67913e2fd0ed4d5665f9260b140f0f1e1166b4cd - SHA512 65c4982b7636a1b3d837ba89f6fdca64d1eb915c6fe64542d20897c1084453730919b4c2364c2520b0c09605fdb79ad31ffe547c012edac7377bec06c0b94b50 - HEAD_REF master -) - -file(GLOB_RECURSE sources ${SOURCE_PATH}/*.h) -foreach(file ${sources}) - file( - COPY ${file} - DESTINATION ${CURRENT_PACKAGES_DIR}/include - ) -endforeach() - -file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright) \ No newline at end of file diff --git a/skyrim-platform/overlay_ports/jsengine/vcpkg.json b/skyrim-platform/overlay_ports/jsengine/vcpkg.json deleted file mode 100644 index 8655d6c4cb..0000000000 --- a/skyrim-platform/overlay_ports/jsengine/vcpkg.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "jsengine", - "version-string": "2021-05-09-1", - "homepage": "https://github.com/skyrim-multiplayer/JsEngine", - "license": "MIT", - "dependencies": [] - } \ No newline at end of file diff --git a/skyrim-platform/src/platform_se/CMakeLists.txt b/skyrim-platform/src/platform_se/CMakeLists.txt index 6566a08e1f..1b4316dcb0 100644 --- a/skyrim-platform/src/platform_se/CMakeLists.txt +++ b/skyrim-platform/src/platform_se/CMakeLists.txt @@ -1,16 +1,16 @@ cmake_minimum_required(VERSION 3.19.1) -if ("${CMAKE_PROJECT_NAME}" STREQUAL "" OR "${CMAKE_PROJECT_NAME}" STREQUAL "platform_se") +if("${CMAKE_PROJECT_NAME}" STREQUAL "" OR "${CMAKE_PROJECT_NAME}" STREQUAL "platform_se") set(CMAKE_SYSTEM_VERSION "10.0.17763.0" CACHE STRING INTERNAL FORCE) set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION "10.0.17763.0" CACHE STRING INTERNAL FORCE) project(platform_se) endif() -if ("${SKYRIM_MP_ROOT}" STREQUAL "") +if("${SKYRIM_MP_ROOT}" STREQUAL "") message(FATAL_ERROR "SKYRIM_MP_ROOT is not specified") endif() -set(cmake_dir "${SKYRIM_MP_ROOT}/src/cmake") -if (NOT EXISTS "${cmake_dir}") +set(cmake_dir "${CMAKE_SOURCE_DIR}/cmake") +if(NOT EXISTS "${cmake_dir}") message(FATAL_ERROR "\"${cmake_dir}\" does not exist") endif() @@ -81,7 +81,7 @@ target_link_libraries(SkyrimPlatformCEF PUBLIC core_library) target_link_libraries(SkyrimPlatformCEF PUBLIC cef) set_target_properties(SkyrimPlatformCEF PROPERTIES WIN32_EXECUTABLE TRUE) -if (NOT "${SKIP_SKYRIM_PLATFORM_BUILDING}") +if(NOT "${SKIP_SKYRIM_PLATFORM_BUILDING}") include(${cmake_dir}/CMakeRC.cmake) @@ -109,12 +109,12 @@ if (NOT "${SKIP_SKYRIM_PLATFORM_BUILDING}") ) npm_execute_command( - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/tools/dev_service" + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tools/dev_service" COMMAND install ) file(GLOB_RECURSE platform_src "skyrim_platform/*") - list(APPEND platform_src "${SKYRIM_MP_ROOT}/.clang-format") + list(APPEND platform_src "${CMAKE_SOURCE_DIR}/.clang-format") list(APPEND platform_src "codegen/index.js") list(APPEND platform_src "codegen/FunctionsDump.txt") add_library(skyrim_platform SHARED ${platform_src}) @@ -123,11 +123,12 @@ if (NOT "${SKIP_SKYRIM_PLATFORM_BUILDING}") target_include_directories(skyrim_platform PRIVATE "${third_party}") target_link_libraries(skyrim_platform PRIVATE "${third_party}/frida/frida-gum.lib") target_link_libraries(skyrim_platform PRIVATE cef) + target_link_libraries(skyrim_platform PRIVATE chakra-wrapper) apply_default_settings(TARGETS skyrim_platform) list(APPEND VCPKG_DEPENDENT skyrim_platform) file(GLOB_RECURSE platform_entry_src "skyrim_platform_entry/*") - list(APPEND platform_entry_src "${SKYRIM_MP_ROOT}/.clang-format") + list(APPEND platform_entry_src "${CMAKE_SOURCE_DIR}/.clang-format") add_library(skyrim_platform_entry SHARED ${platform_entry_src}) set_target_properties(skyrim_platform_entry PROPERTIES OUTPUT_NAME "SkyrimPlatform") target_include_directories(skyrim_platform_entry PRIVATE "${third_party}") @@ -178,22 +179,25 @@ if (NOT "${SKIP_SKYRIM_PLATFORM_BUILDING}") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/cef_dir.txt ${CEF_ROOT}) # touch dev_service in watch mode + # TODO: do we actually support dev_service in watch mode? consider removing this target add_custom_target(RestartGame ALL COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/touch_$) add_dependencies(RestartGame ${DEPENDENCIES_FOR_CUSTOM_TARGETS}) add_custom_target(codegen ALL - COMMAND node ${CMAKE_SOURCE_DIR}/src/platform_se/codegen/index.js + COMMAND node ${PROJECT_SOURCE_DIR}/src/platform_se/codegen/index.js WORKING_DIRECTORY ${wdir} ) list(APPEND DEPENDENCIES_FOR_CUSTOM_TARGETS codegen) add_dependencies(vs_startup_project ${DEPENDENCIES_FOR_CUSTOM_TARGETS}) - add_custom_target(pack ALL + # this target was originally called pack, now it is called skyrim-platform + # so we can use add_dependencies(x skyrim-platform) in other projects + add_custom_target(skyrim-platform ALL COMMAND npm run pack$<$:-debug> - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tools/dev_service + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tools/dev_service ) - add_dependencies(pack ${DEPENDENCIES_FOR_CUSTOM_TARGETS}) + add_dependencies(skyrim-platform ${DEPENDENCIES_FOR_CUSTOM_TARGETS}) endif() apply_default_settings(TARGETS @@ -201,8 +205,6 @@ apply_default_settings(TARGETS core_library hooks reverse ui SkyrimPlatformCEF ) -list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/src/cmake/modules) - foreach(target ${VCPKG_DEPENDENT}) find_package(ChakraCore REQUIRED) target_link_libraries(${target} PUBLIC ChakraCore::ChakraCore) diff --git a/skyrim-platform/submodules/CommonLibSSE b/skyrim-platform/submodules/CommonLibSSE new file mode 160000 index 0000000000..ec96be63eb --- /dev/null +++ b/skyrim-platform/submodules/CommonLibSSE @@ -0,0 +1 @@ +Subproject commit ec96be63ebaa82349225456005b773c75364f2b6 diff --git a/skyrim-platform/tools/dev_service/index.js b/skyrim-platform/tools/dev_service/index.js index 67dbce176d..58138f79f3 100644 --- a/skyrim-platform/tools/dev_service/index.js +++ b/skyrim-platform/tools/dev_service/index.js @@ -23,14 +23,15 @@ let config = require("./config"); console.log("Dev service started"); -const getBinaryDir = () => path.resolve(__dirname, "../../build"); +const getBinaryDir = () => path.resolve(__dirname, "../../../build"); const getSourceDir = () => path.resolve(__dirname, "../.."); console.log(`Binary dir is '${getBinaryDir()}'`); console.log(`Source dir is '${getSourceDir()}'`); -let bin = path.join(getBinaryDir(), "_platform_se"); +let bin = path.join(getBinaryDir(), "skyrim-platform/_platform_se"); let sourceDir = path.join(getSourceDir()); +let distDir = path.join(getBinaryDir(), "dist/client"); const watchCallback = (_eventType, fileName) => { { @@ -44,13 +45,13 @@ const watchCallback = (_eventType, fileName) => { game.kill(); } - if (fs.existsSync("./dist")) { - fs.removeSync("./dist"); + if (fs.existsSync(distDir)) { + fs.removeSync(distDir); } - if (!fs.existsSync("./dist")) { + if (!fs.existsSync(distDir)) { while (true) try { - fs.mkdirSync("./dist"); + fs.mkdirSync(distDir, { recursive: true }); break; } catch (e) { if (e.toString().indexOf("EPERM") === -1) { @@ -80,19 +81,19 @@ const watchCallback = (_eventType, fileName) => { ].forEach((item, i) => { cp( path.join(cefDir, "Release", item), - "./dist/Data/Platform/Distribution/RuntimeDependencies" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies") ); }); ["libEGL.dll", "libGLESv2.dll"].forEach((item, i) => { cp( path.join(cefDir, "Release/swiftshader", item), - "./dist/Data/Platform/Distribution/RuntimeDependencies/swiftshader" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies/swiftshader") ); }); ["icudtl.dat"].forEach((item, i) => { cp( path.join(cefDir, "Resources", item), - "./dist/Data/Platform/Distribution/RuntimeDependencies" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies") ); }); [ @@ -104,58 +105,58 @@ const watchCallback = (_eventType, fileName) => { ].forEach((item, i) => { cp( path.join(cefDir, "Resources", item), - "./dist/Data/Platform/Distribution/CEF" + path.join(distDir, "Data/Platform/Distribution/CEF") ); }); fs.copySync( path.join(cefDir, "Resources/locales"), - "./dist/Data/Platform/Distribution/CEF/locales" + path.join(distDir, "Data/Platform/Distribution/CEF/locales") ); - cp(binPath("SkyrimPlatform.pdb"), "./dist"); - cp(binPath("SkyrimPlatformImpl.pdb"), "./dist"); + cp(binPath("SkyrimPlatform.pdb"), distDir); + cp(binPath("SkyrimPlatformImpl.pdb"), distDir); cp( binPath("ChakraCore.dll"), - "./dist/Data/Platform/Distribution/RuntimeDependencies" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies") ); cp( binPath("SkyrimPlatformCEF.exe"), - "./dist/Data/Platform/Distribution/RuntimeDependencies" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies") ); - cp(binPath("SkyrimPlatformCEF.pdb"), "./dist"); - cp(binPath("SkyrimPlatform.dll"), "./dist/Data/SKSE/Plugins"); + cp(binPath("SkyrimPlatformCEF.pdb"), distDir); + cp(binPath("SkyrimPlatform.dll"), path.join(distDir, "Data/SKSE/Plugins")); cp( binPath("SkyrimPlatformImpl.dll"), - "./dist/Data/Platform/Distribution/RuntimeDependencies" + path.join(distDir, "Data/Platform/Distribution/RuntimeDependencies") ); cp( path.join(sourceDir, `src/platform_se/pex/TESModPlatform.pex`), - "./dist/Data/Scripts" + path.join(distDir, "Data/Scripts") ); cp( path.join(bin, `_codegen/skyrimPlatform.ts`), - "./dist/Data/Platform/Modules" + path.join(distDir, "Data/Platform/Modules") ); cp( path.join(sourceDir, "tools/system_polyfill/dist/___systemPolyfill.js"), - "./dist/Data/Platform/Distribution" + path.join(distDir, "Data/Platform/Distribution") ); fs.copySync( path.join(sourceDir, "tools/plugin-example"), - "./dist/Data/Platform/plugin-example" + path.join(distDir, "Data/Platform/plugin-example") ); - fs.copySync(path.join(sourceDir, "requirements"), "./dist"); - fs.removeSync("./dist/Data/Platform/plugin-example/node_modules"); - fs.removeSync("./dist/Data/Platform/plugin-example/dist"); + fs.copySync(path.join(sourceDir, "requirements"), distDir); + fs.removeSync(path.join(distDir, "Data/Platform/plugin-example/node_modules")); + fs.removeSync(path.join(distDir, "Data/Platform/plugin-example/dist")); if (!process.env.DEV_SERVICE_NO_GAME) { - fs.copySync("./dist", config.SkyrimSEFolder); + fs.copySync(distDir, config.SkyrimSEFolder); } // No need to release pdb to the public - fs.unlinkSync("./dist/SkyrimPlatform.pdb"); - fs.unlinkSync("./dist/SkyrimPlatformCEF.pdb"); - fs.unlinkSync("./dist/SkyrimPlatformImpl.pdb"); + fs.unlinkSync(path.join(distDir, "SkyrimPlatform.pdb")); + fs.unlinkSync(path.join(distDir, "SkyrimPlatformCEF.pdb")); + fs.unlinkSync(path.join(distDir, "SkyrimPlatformImpl.pdb")); if (!process.env.DEV_SERVICE_NO_GAME) { console.log(`Starting ${config.SkyrimSEFolder}`); diff --git a/vcpkg b/vcpkg new file mode 160000 index 0000000000..3426db05b9 --- /dev/null +++ b/vcpkg @@ -0,0 +1 @@ +Subproject commit 3426db05b996481ca31e95fff3734cf23e0f51bc diff --git a/skyrim-platform/vcpkg.json b/vcpkg.json similarity index 55% rename from skyrim-platform/vcpkg.json rename to vcpkg.json index f637c88ddb..4e40fd5e02 100644 --- a/skyrim-platform/vcpkg.json +++ b/vcpkg.json @@ -1,8 +1,8 @@ { - "name": "skyrim-platform", + "name": "skymp", "version-string": "", "homepage": "https://skymp.io", - "description": "A modding tool for Skyrim allowing writing scripts with JavaScript/TypeScript.", + "description": "Online mod for Skyrim SE.", "dependencies": [ "chakracore", "nlohmann-json", @@ -10,7 +10,6 @@ "zlib", "mhook", "directxtk", - "spdlog", - "jsengine" + "spdlog" ] } \ No newline at end of file