diff --git a/.github/workflows/discord-release.yml b/.github/workflows/discord-release.yml deleted file mode 100644 index 1320a593..00000000 --- a/.github/workflows/discord-release.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Release messages to discord announcement channel - -on: - release: - types: - - created - -jobs: - run_main: - runs-on: ubuntu-latest - name: Sends custom message - steps: - - name: Sending message - uses: nhevia/discord-styled-releases@main - with: - webhook_id: ${{ secrets.DISCORD_WEBHOOK_ID }} - webhook_token: ${{ secrets.DISCORD_WEBHOOK_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 289ec7b9..1d0eebbb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,13 @@ name: Create Release on: - pull_request: + pull_request_target: types: [closed] jobs: create-release: runs-on: ubuntu-latest - if: github.event.pull_request.merged + if: github.event.pull_request.merged && (contains(github.event.pull_request.labels.*.name, 'major') || contains(github.event.pull_request.labels.*.name, 'minor') || contains(github.event.pull_request.labels.*.name, 'patch')) steps: - name: Checkout Code uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 29674b76..d59b1891 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,12 +1,14 @@ name: Tests -on: [push] +on: + push: + branches: [main] + pull_request: + branches: [main] jobs: build: - runs-on: ubuntu-latest - steps: - name: Checkout Code uses: actions/checkout@v4 diff --git a/package.json b/package.json index 55d97a7a..d47ffac8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "LGPL-3.0-only", "type": "module", "dependencies": { - "@timesplinter/pimple": "^1.1.1", + "@timesplinter/pimple": "^2.0.0", "buttplug": "^3.2.1", "class-transformer": "^0.5.1", "cors": "^2.8.5", @@ -22,7 +22,7 @@ "socket.io": "^4.6.0", "unique-names-generator": "^4.7.1", "uuid": "^8.3.2", - "vm2": "^3.9.14" + "isolated-vm": "^5.0.0" }, "devDependencies": { "@babel/core": "^7.22.8", @@ -58,7 +58,7 @@ "node": ">=18.0.0 <21.0.0" }, "scripts": { - "compile": "tsc && node dist/index.js --trace-warnings | pino-pretty", + "compile": "tsc && node dist/index.js --trace-warnings --no-node-snapshot | pino-pretty", "dev": "nodemon", "test": "jest", "coverage": "jest --collect-coverage", diff --git a/src/automation/scriptRuntime.ts b/src/automation/scriptRuntime.ts index fd6ef131..7ce7e4b3 100644 --- a/src/automation/scriptRuntime.ts +++ b/src/automation/scriptRuntime.ts @@ -1,4 +1,3 @@ -import {NodeVM, VMScript} from "vm2"; import Device from "../device/device.js"; import DeviceRepositoryInterface from "../repository/deviceRepositoryInterface.js"; import fs, {WriteStream} from "fs"; @@ -6,13 +5,9 @@ import readLastLines from "read-last-lines/dist/index.js"; import EventEmitter from "events"; import AutomationEventType from "./automationEventType.js"; import DeviceManagerEvent from "../device/deviceManagerEvent.js"; - -type DeviceEvent = { type: string|null, device: Device|null } -type Sandbox = { - devices: DeviceRepositoryInterface, - event: DeviceEvent - context: { [key: string]: string } -} +import ivm, {TransferOptions, ArgumentType} from 'isolated-vm'; +import Logger from "../logging/Logger.js"; +import ClassToPlainSerializer from "../serialization/classToPlainSerializer.js"; type ScriptRuntimeEvents = { [AutomationEventType.consoleLog]: (data: string) => void, @@ -20,15 +15,19 @@ type ScriptRuntimeEvents = { [AutomationEventType.scriptStopped]: () => void, } +type EventFunction = ivm.Reference<(msg: string) => void>; + export class ScriptRuntime { private readonly eventEmitter: EventEmitter; - private scriptCode: VMScript = null; + private scriptCode: ivm.Script = null; + + private vm: ivm.Isolate = null; - private vm: NodeVM = null; + private context: ivm.Context = null; - private sandbox: Sandbox; + private eventFunction: EventFunction = null; private readonly deviceRepository: DeviceRepositoryInterface; @@ -38,73 +37,104 @@ export class ScriptRuntime private runningSince: Date = null; - public constructor(deviceRepository: DeviceRepositoryInterface, logPath: string, eventEmitter: EventEmitter) { + private readonly logger: Logger; + + private readonly serializer: ClassToPlainSerializer; + + public constructor( + deviceRepository: DeviceRepositoryInterface, + logPath: string, + eventEmitter: EventEmitter, + logger: Logger, + serializer: ClassToPlainSerializer + ) { this.eventEmitter = eventEmitter; this.deviceRepository = deviceRepository; this.logPath = logPath; + this.logger = logger.child({name: 'scriptRuntime'}); + this.serializer = serializer; } - public load(scriptCode: string): void + public async load(scriptCode: string): Promise { - this.scriptCode = new VMScript(scriptCode); + try { + this.logger.debug(`Instantiate isolate`) + this.vm = new ivm.Isolate({ memoryLimit: 128 /* MB */ , onCatastrophicError: message => console.error(message)}); - this.sandbox = { - event: { type: null, device: null }, - devices: this.deviceRepository, - context: {}, - } - this.vm = new NodeVM({ - console: 'redirect', - require: { - external: true, - root: './', - }, - sandbox: this.sandbox - }); + this.logger.debug(`Create isolate context`) + this.context = await this.vm.createContext(); + + this.logWriter = fs.createWriteStream(`${this.logPath}/automation.log`); + + // Get a Reference{} to the global object within the context. + const jail = this.context.global; + + // This makes the global object available in the context as `global`. We use `derefInto()` here + // because otherwise `global` would actually be a Reference{} object in the new isolate. + this.logger.debug(`Deref gloabal into jail`) + await jail.set('global', jail.derefInto()); + + this.logger.debug(`Create shared functions`) + + // Create references to the main process functions + const deviceGetByIdRef = new ivm.Reference((uuid: string) => this.deviceRepository.getById(uuid)); + const logRef = new ivm.Reference((data: string) => this.log(data)); + + // Define and expose wrapper functions + const deviceGetByIdWrapper = new ivm.Reference((...args: [uuid: ArgumentType]) => { + return deviceGetByIdRef.applySync(undefined, args); + }); + const logWrapper = new ivm.Reference((...args: any[]) => { + // @ts-expect-error any stuff + return logRef.applySync(undefined, args); + }); + const onEventWrapper = new ivm.Reference((...args: [message: ArgumentType]) => { + return logRef.applySync(undefined, args); + }); + + await jail.set('deviceGetById', deviceGetByIdWrapper); + await jail.set('log', logWrapper); + await jail.set('onEvent', onEventWrapper); + + this.logger.debug(`Create shared functions -> done!`) - this.logWriter = fs.createWriteStream(`${this.logPath}/automation.log`) + // Compile and run the user code + this.logger.debug(`Compiling script...`) + this.scriptCode = await this.vm.compileScript(scriptCode); + this.logger.debug(`Compiling script done!`) - this.vm.on('console.log', (data: string) => { - console.log(`VM stdout: ${data}`); - void this.log(data); - this.eventEmitter.emit(AutomationEventType.consoleLog, data); - }); + this.runningSince = new Date(); - this.runningSince = new Date(); + this.eventFunction = this.context.global.getSync('onDeviceEvent') as EventFunction; + this.logger.debug('Run script...') + await this.scriptCode.run(this.context); - this.eventEmitter.emit(AutomationEventType.scriptStarted); - console.log('script loaded') + this.eventEmitter.emit(AutomationEventType.scriptStarted); + + return this.eventFunction; + } catch (e: unknown) { + const msg = (e as Error).message; + this.logger.error(`VM stdout: ${msg}`); + void this.log(msg); + this.eventEmitter.emit(AutomationEventType.consoleLog, (e as Error).toString()); + } } public stop(): void { this.vm = null; - this.sandbox = null; this.logWriter.close(); this.runningSince = null; this.eventEmitter.emit(AutomationEventType.scriptStopped); - console.log('script stopped') + this.logger.info('script stopped'); } + // eslint-disable-next-line @typescript-eslint/no-unused-vars public runForEvent(eventType: DeviceManagerEvent, device: Device): void { - if (null === this.vm) { - return; - } - - this.sandbox.event.type = eventType; - this.sandbox.event.device = device; - - try { - this.vm.run(this.scriptCode); - } catch (e: unknown) { - const msg = (e as Error).message; - console.error(`VM stdout: ${msg}`); - void this.log(msg); - this.eventEmitter.emit(AutomationEventType.consoleLog, (e as Error).toString()); - } + this.eventFunction.applySync(undefined, ['Hello world from the outside'], {timeout: 1000}); } public async getLog(maxLines: number): Promise diff --git a/src/controller/automation/runScriptController.ts b/src/controller/automation/runScriptController.ts index 120293bc..861a253b 100644 --- a/src/controller/automation/runScriptController.ts +++ b/src/controller/automation/runScriptController.ts @@ -11,7 +11,7 @@ export default class RunScriptController implements ControllerInterface this.scriptRuntime = scriptRuntime; } - public execute(req: Request, res: Response): void + public async execute(req: Request, res: Response): Promise { if(!req.is('text/plain')) { res.status(400).send('Content-Type header must be text/plain'); @@ -20,8 +20,11 @@ export default class RunScriptController implements ControllerInterface const scriptCode = req.body as string; - this.scriptRuntime.load(scriptCode); - + try { + await this.scriptRuntime.load(scriptCode); + } catch (e) { + console.error(e); + } const response = { running: this.scriptRuntime.isRunning(), runningSince: this.scriptRuntime.getRunningSince(), diff --git a/src/device/protocol/buttplugIo/buttplugIoDeviceFactory.ts b/src/device/protocol/buttplugIo/buttplugIoDeviceFactory.ts index 2cdf2916..c52c5c82 100644 --- a/src/device/protocol/buttplugIo/buttplugIoDeviceFactory.ts +++ b/src/device/protocol/buttplugIo/buttplugIoDeviceFactory.ts @@ -28,8 +28,8 @@ export default class ButtplugIoDeviceFactory this.logger = logger; } - public create(buttplugDevice: ButtplugClientDevice, provider: string): ButtplugIoDevice { - const knownDevice = this.createKnownDevice(buttplugDevice, provider); + public create(buttplugDevice: ButtplugClientDevice, provider: string, useDeviceNameAsId: boolean): ButtplugIoDevice { + const knownDevice = this.createKnownDevice(buttplugDevice, provider, useDeviceNameAsId); const deviceAttrs = ButtplugIoDeviceFactory.parseDeviceAttributes(buttplugDevice); @@ -83,10 +83,13 @@ export default class ButtplugIoDeviceFactory return attributeList; } - private createKnownDevice(buttplugDevice: ButtplugClientDevice, provider: string): KnownDevice { + private createKnownDevice(buttplugDevice: ButtplugClientDevice, provider: string, useDeviceNameAsId: boolean): KnownDevice { // Since we don't get a unique identifier for the Bluetooth device from Intiface, // we need to use the index assigned to the device by Intiface. It's the best we have. - const deviceId = `buttplugio-${buttplugDevice.index}`; + // or the name if using Intiface-engine without id persistence + const nameString = buttplugDevice.name.replace(/[^a-zA-Z0-9]/g, ''); + const deviceId = useDeviceNameAsId ? `buttplugio-${nameString}` : `buttplugio-${buttplugDevice.index}`; + let knownDevice = this.settings.getKnownDeviceById(deviceId) if (null !== knownDevice) { diff --git a/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProvider.ts b/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProvider.ts index efe45c42..8957e0d7 100644 --- a/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProvider.ts +++ b/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProvider.ts @@ -19,16 +19,22 @@ export default class ButtplugIoWebsocketDeviceProvider extends DeviceProvider private readonly buttplugIoDeviceFactory: ButtplugIoDeviceFactory; private readonly websocketAddress: string; + private readonly autoScan: boolean; + private readonly useDeviceNameAsId: boolean; public constructor( eventEmitter: EventEmitter, deviceFactory: ButtplugIoDeviceFactory, websocketAddress: string, + autoScan: boolean, + useDeviceNameAsId: boolean, logger: Logger ) { super(eventEmitter, logger.child({ name: 'buttplugIoWebsocketDeviceProvider' })); this.buttplugIoDeviceFactory = deviceFactory; this.websocketAddress = websocketAddress; + this.autoScan = autoScan; + this.useDeviceNameAsId = useDeviceNameAsId; } public async init(): Promise @@ -52,6 +58,10 @@ export default class ButtplugIoWebsocketDeviceProvider extends DeviceProvider setInterval(() => { this.connectToServer() }, 3000); + if (true === this.autoScan) { + setInterval(() => { this.discoverButtplugIoDevices() }, 60000); + } + resolve(); }); } @@ -68,11 +78,29 @@ export default class ButtplugIoWebsocketDeviceProvider extends DeviceProvider .catch((e: unknown) => this.logger.error(`Could not connect to buttplug.io server (${url})`, e)); } + + private discoverButtplugIoDevices(): void { + if (false === this.buttplugClient.connected) { + return; + } + + this.buttplugClient.startScanning() + .then(() => this.logger.info('Start scanning for Buttplug.io devices')) + .catch((e: unknown) => this.logger.error(`Could not start scanning for buttplug.io devices`, e)); + + setTimeout(() => { + this.buttplugClient.stopScanning() + .then(() => this.logger.info('Stop scanning for Buttplug.io devices')) + .catch((e: unknown) => this.logger.error(`Could not stop scanning for buttplug.io devices`, e)); + }, 30000); + } + + private addButtplugIoDevice(buttplugDevice: ButtplugClientDevice): void { this.logger.info(`Buttplug.io device detected: ${buttplugDevice.name}`, buttplugDevice); try { - const device = this.buttplugIoDeviceFactory.create(buttplugDevice, ButtplugIoWebsocketDeviceProvider.name); + const device = this.buttplugIoDeviceFactory.create(buttplugDevice, ButtplugIoWebsocketDeviceProvider.name, this.useDeviceNameAsId); const deviceStatusUpdaterInterval = this.initDeviceStatusUpdater(device); this.connectedDevices.set(buttplugDevice.index, device); diff --git a/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProviderFactory.ts b/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProviderFactory.ts index ec57a9c5..3528d02a 100644 --- a/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProviderFactory.ts +++ b/src/device/protocol/buttplugIo/buttplugIoWebsocketDeviceProviderFactory.ts @@ -8,6 +8,8 @@ import ButtplugIoWebsocketDeviceProvider from "./buttplugIoWebsocketDeviceProvid type ButtplugIoWebsocketConfig = { address: string, + autoScan: boolean, + useDeviceNameAsId: boolean } export default class ButtplugIoWebsocketDeviceProviderFactory implements DeviceProviderFactory @@ -36,6 +38,8 @@ export default class ButtplugIoWebsocketDeviceProviderFactory implements DeviceP this.eventEmitter, this.deviceFactory, config.address, + config.autoScan, + config.useDeviceNameAsId, this.logger ); } diff --git a/src/index.ts b/src/index.ts index 71d582b5..5b0fee2e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,43 +8,25 @@ import ControllerServiceProvider from './serviceProvider/controllerServiceProvid import RepositoryServiceProvider from './serviceProvider/repositoryServiceProvider.js'; import SerializationServiceProvider from './serviceProvider/serializationServiceProvider.js'; import FactoryServiceProvider from './serviceProvider/factoryServiceProvider.js'; -import GetDevicesController from "./controller/getDevicesController.js"; -import DeviceManager from "./device/deviceManager.js"; import DeviceServiceProvider from "./serviceProvider/deviceServiceProvider.js"; -import GetDeviceController from "./controller/getDeviceController.js"; -import PatchDeviceDataController from "./controller/patchDeviceController.js"; import SettingsServiceProvider from "./serviceProvider/settingsServiceProvider.js"; -import {Server} from "socket.io"; import * as http from 'http' import SocketServiceProvider from "./serviceProvider/socketServiceProvider.js"; -import DeviceUpdateHandler from "./socket/deviceUpdateHandler.js"; -import ClassToPlainSerializer from "./serialization/classToPlainSerializer.js"; import {DeviceUpdateData} from "./socket/types"; -import HealthController from "./controller/healthController.js"; -import GetScriptsController from "./controller/automation/getScriptsController.js"; -import GetScriptController from "./controller/automation/getScriptController.js"; -import CreateScriptController from "./controller/automation/createScriptController.js"; import AutomationServiceProvider from "./serviceProvider/automationServiceProvider.js"; -import ScriptRuntime from "./automation/scriptRuntime.js"; import type Device from "./device/device.js"; -import RunScriptController from "./controller/automation/runScriptController.js"; -import StopScriptController from "./controller/automation/stopScriptController.js"; import WebSocketEvent from "./device/webSocketEvent.js"; -import DeleteScriptController from "./controller/automation/deleteScriptController.js"; -import GetLogController from "./controller/automation/getLogController.js"; import ServerServiceProvider from "./serviceProvider/serverServiceProvider.js"; import asyncHandler from "express-async-handler" -import StatusScriptController from "./controller/automation/statusScriptController.js"; import AutomationEventType from "./automation/automationEventType.js"; import DeviceManagerEvent from "./device/deviceManagerEvent.js"; -import DeviceProviderLoader from "./device/provider/deviceProviderLoader.js"; import LoggerServiceProvider from "./serviceProvider/loggerServiceProvider.js"; -import Logger from "./logging/Logger.js"; import DeviceDiscriminator from "./serialization/discriminator/deviceDiscriminator.js"; +import ServiceMap from "./serviceMap.js"; const APP_PORT = process.env.PORT; -const container = new Pimple(); +const container = new Pimple(); const app = express(); const httpServer = http.createServer(app); @@ -61,12 +43,12 @@ container .register(new FactoryServiceProvider()) ; -const logger = container.get('logger.default') as Logger; -const io = container.get('server.websocket') as Server; -const deviceManager = container.get('device.manager') as DeviceManager; -const scriptRuntime = container.get('automation.scriptRuntime') as ScriptRuntime; +const logger = container.get('logger.default'); +const io = container.get('server.websocket'); +const deviceManager = container.get('device.manager'); +const scriptRuntime = container.get('automation.scriptRuntime'); -(container.get('device.provider.loader') as DeviceProviderLoader).loadFromSettings(); +container.get('device.provider.loader').loadFromSettings(); // Middlewares app @@ -78,62 +60,62 @@ app // Routes app.get('/health', asyncHandler((req, res) => { - const controller = container.get('controller.health') as HealthController + const controller = container.get('controller.health') return controller.execute(req, res) })); app.get('/devices', (req, res) => { - const controller = container.get('controller.getDevices') as GetDevicesController + const controller = container.get('controller.getDevices') return controller.execute(req, res) }); app.get('/device/:deviceId', (req, res) => { - const controller = container.get('controller.getDevice') as GetDeviceController + const controller = container.get('controller.getDevice') return controller.execute(req, res) }); app.patch('/device/:deviceId', (req, res) => { - const controller = container.get('controller.patchDevice') as PatchDeviceDataController + const controller = container.get('controller.patchDevice') return controller.execute(req, res) }); app.get('/automation/scripts', (req, res) => { - const controller = container.get('controller.automation.getScripts') as GetScriptsController + const controller = container.get('controller.automation.getScripts') return controller.execute(req, res) }); app.get('/automation/scripts/:fileName([a-z\\d._-]+.js)', (req, res) => { - const controller = container.get('controller.automation.getScript') as GetScriptController + const controller = container.get('controller.automation.getScript') return controller.execute(req, res) }); app.post('/automation/scripts/:fileName([a-z\\d._-]+.js)', (req, res) => { - const controller = container.get('controller.automation.createScript') as CreateScriptController + const controller = container.get('controller.automation.createScript') return controller.execute(req, res) }); app.delete('/automation/scripts/:fileName([a-z\\d._-]+.js)', (req, res) => { - const controller = container.get('controller.automation.deleteScript') as DeleteScriptController + const controller = container.get('controller.automation.deleteScript') return controller.execute(req, res) }); app.get('/automation/log', asyncHandler((req, res) => { - const controller = container.get('controller.automation.getLog') as GetLogController + const controller = container.get('controller.automation.getLog') return controller.execute(req, res) })); -app.post('/automation/run', (req, res) => { - const controller = container.get('controller.automation.runScript') as RunScriptController +app.post('/automation/run', asyncHandler((req, res) => { + const controller = container.get('controller.automation.runScript') return controller.execute(req, res) -}); +})); app.get('/automation/stop', (req, res) => { - const controller = container.get('controller.automation.stopScript') as StopScriptController + const controller = container.get('controller.automation.stopScript') return controller.execute(req, res) }); app.get('/automation/status', (req, res) => { - const controller = container.get('controller.automation.statusScript') as StatusScriptController + const controller = container.get('controller.automation.statusScript') return controller.execute(req, res) }); @@ -145,12 +127,12 @@ io.on('connection', socket => { logger.debug(`Client disconnected: ${socket.id}`); }); - const deviceUpdateHandler = container.get('socket.deviceUpdateHandler') as DeviceUpdateHandler; + const deviceUpdateHandler = container.get('socket.deviceUpdateHandler'); socket.on(WebSocketEvent.deviceUpdateReceived, (data) => deviceUpdateHandler.handle(data as DeviceUpdateData)); }); -const serializer = container.get('serializer.classToPlain') as ClassToPlainSerializer; +const serializer = container.get('serializer.classToPlain'); const deviceDiscriminator = DeviceDiscriminator.createClassTransformerTypeDiscriminator('type'); diff --git a/src/serviceMap.ts b/src/serviceMap.ts new file mode 100644 index 00000000..25eb1119 --- /dev/null +++ b/src/serviceMap.ts @@ -0,0 +1,89 @@ +import ClassToPlainSerializer from "./serialization/classToPlainSerializer.js"; +import PlainToClassSerializer from "./serialization/plainToClassSerializer.js"; +import Logger from "./logging/Logger.js"; +import {Server} from "socket.io/dist/index.js"; +import DeviceManager from "./device/deviceManager.js"; +import SerialDeviceTransportFactory from "./device/transport/serialDeviceTransportFactory.js"; +import DeviceProviderFactory from "./device/provider/deviceProviderFactory.js"; +import SlvCtrlPlusDeviceFactory from "./device/protocol/slvCtrlPlus/slvCtrlPlusDeviceFactory.js"; +import ButtplugIoDeviceFactory from "./device/protocol/buttplugIo/buttplugIoDeviceFactory.js"; +import DeviceNameGenerator from "./device/deviceNameGenerator.js"; +import DeviceUpdaterInterface from "./device/updater/deviceUpdaterInterface.js"; +import UuidFactory from "./factory/uuidFactory.js"; +import DateFactory from "./factory/dateFactory.js"; +import Settings from "./settings/settings.js"; +import SettingsManager from "./settings/settingsManager.js"; +import ScriptRuntime from "./automation/scriptRuntime.js"; +import ConnectedDeviceRepository from "./repository/connectedDeviceRepository.js"; +import AutomationScriptRepository from "./repository/automationScriptRepository.js"; +import DeviceProviderLoader from "./device/provider/deviceProviderLoader.js"; +import DeviceUpdateHandler from "./socket/deviceUpdateHandler.js"; +import HealthController from "./controller/healthController.js"; +import GetDevicesController from "./controller/getDevicesController.js"; +import GetDeviceController from "./controller/getDeviceController.js"; +import PatchDeviceController from "./controller/patchDeviceController.js"; +import GetScriptsController from "./controller/automation/getScriptsController.js"; +import GetScriptController from "./controller/automation/getScriptController.js"; +import CreateScriptController from "./controller/automation/createScriptController.js"; +import DeleteScriptController from "./controller/automation/deleteScriptController.js"; +import GetLogController from "./controller/automation/getLogController.js"; +import RunScriptController from "./controller/automation/runScriptController.js"; +import StopScriptController from "./controller/automation/stopScriptController.js"; +import StatusScriptController from "./controller/automation/statusScriptController.js"; + +/* eslint-disable @typescript-eslint/naming-convention */ +type ServiceMap = { + /* serializerServiceProvider */ + 'serializer.classToPlain': ClassToPlainSerializer, + 'serializer.plainToClass': PlainToClassSerializer, + + /* loggerServiceProvider */ + 'logger.default': Logger, + + /* serverServiceProvider */ + 'server.websocket': Server, + + /* deviceServiceProvider */ + 'device.manager': DeviceManager, + 'device.serial.transport.factory': SerialDeviceTransportFactory, + 'device.provider.factory.slvCtrlPlusSerial': DeviceProviderFactory, + 'device.serial.factory.slvCtrlPlus': SlvCtrlPlusDeviceFactory, + 'device.provider.factory.buttplugIoWebsocket': DeviceProviderFactory, + 'device.serial.factory.buttplugIo': ButtplugIoDeviceFactory, + 'device.uniqueNameGenerator': DeviceNameGenerator, + 'device.updater': DeviceUpdaterInterface, + + /* factoryServiceProvider */ + 'factory.uuid': UuidFactory, + 'factory.date': DateFactory, + + /* settingsServiceProvider */ + 'settings': Settings, + 'settings.manager': SettingsManager, + + /* automationServiceProvider */ + 'automation.scriptRuntime': ScriptRuntime, + + /* repositoryServiceProvider */ + 'repository.connectedDevices': ConnectedDeviceRepository, + 'repository.automationScript': AutomationScriptRepository, + + 'device.provider.loader': DeviceProviderLoader, + 'socket.deviceUpdateHandler': DeviceUpdateHandler, + + /* controllerServiceProvider */ + 'controller.health': HealthController, + 'controller.getDevices': GetDevicesController, + 'controller.getDevice': GetDeviceController, + 'controller.patchDevice': PatchDeviceController, + 'controller.automation.getScripts': GetScriptsController, + 'controller.automation.getScript': GetScriptController, + 'controller.automation.createScript': CreateScriptController, + 'controller.automation.deleteScript': DeleteScriptController, + 'controller.automation.getLog': GetLogController, + 'controller.automation.runScript': RunScriptController, + 'controller.automation.stopScript': StopScriptController, + 'controller.automation.statusScript': StatusScriptController, +} + +export default ServiceMap; diff --git a/src/serviceProvider/automationServiceProvider.ts b/src/serviceProvider/automationServiceProvider.ts index bc6fa47b..b3c400a0 100644 --- a/src/serviceProvider/automationServiceProvider.ts +++ b/src/serviceProvider/automationServiceProvider.ts @@ -1,13 +1,13 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; -import ConnectedDeviceRepository from "../repository/connectedDeviceRepository.js"; import ScriptRuntime from "../automation/scriptRuntime.js"; import os from "os"; import fs from "fs"; import EventEmitter from "events"; +import ServiceMap from "../serviceMap.js"; -export default class AutomationServiceProvider implements ServiceProvider +export default class AutomationServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('automation.scriptRuntime', () => { const logPath = `${os.homedir()}/.slvctrlplus/`; @@ -16,9 +16,11 @@ export default class AutomationServiceProvider implements ServiceProvider } return new ScriptRuntime( - container.get('repository.connectedDevices') as ConnectedDeviceRepository, + container.get('repository.connectedDevices'), logPath, - new EventEmitter() + new EventEmitter(), + container.get('logger.default'), + container.get('serializer.classToPlain') ); }); } diff --git a/src/serviceProvider/controllerServiceProvider.ts b/src/serviceProvider/controllerServiceProvider.ts index 4c5c6115..7dbf11d9 100644 --- a/src/serviceProvider/controllerServiceProvider.ts +++ b/src/serviceProvider/controllerServiceProvider.ts @@ -2,96 +2,92 @@ import GetDevicesController from '../controller/getDevicesController.js'; import { Pimple, ServiceProvider } from '@timesplinter/pimple'; import GetDeviceController from "../controller/getDeviceController.js"; import PatchDeviceController from "../controller/patchDeviceController.js"; -import ClassToPlainSerializer from "../serialization/classToPlainSerializer.js"; -import ConnectedDeviceRepository from "../repository/connectedDeviceRepository.js"; -import DeviceUpdaterInterface from "../device/updater/deviceUpdaterInterface.js"; import HealthController from "../controller/healthController.js"; import GetScriptsController from "../controller/automation/getScriptsController.js"; -import AutomationScriptRepositoryInterface from "../repository/automationScriptRepositoryInterface.js"; import GetScriptController from "../controller/automation/getScriptController.js"; import CreateScriptController from "../controller/automation/createScriptController.js"; import RunScriptController from "../controller/automation/runScriptController.js"; -import ScriptRuntime from "../automation/scriptRuntime.js"; import StopScriptController from "../controller/automation/stopScriptController.js"; import DeleteScriptController from "../controller/automation/deleteScriptController.js"; import GetLogController from "../controller/automation/getLogController.js"; import StatusScriptController from "../controller/automation/statusScriptController.js"; +import ServiceMap from "../serviceMap.js"; -export default class ControllerServiceProvider implements ServiceProvider +export default class ControllerServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('controller.health', () => { return new HealthController(); }); container.set('controller.getDevices', () => { return new GetDevicesController( - container.get('repository.connectedDevices') as ConnectedDeviceRepository, - container.get('serializer.classToPlain') as ClassToPlainSerializer, + container.get('repository.connectedDevices'), + container.get('serializer.classToPlain'), ); }); container.set('controller.getDevice', () => { return new GetDeviceController( - container.get('repository.connectedDevices') as ConnectedDeviceRepository, - container.get('serializer.classToPlain') as ClassToPlainSerializer, + container.get('repository.connectedDevices'), + container.get('serializer.classToPlain'), ); }); container.set('controller.patchDevice', () => { return new PatchDeviceController( - container.get('repository.connectedDevices') as ConnectedDeviceRepository, - container.get('device.updater') as DeviceUpdaterInterface, + container.get('repository.connectedDevices'), + container.get('device.updater'), ); }); // Automation container.set('controller.automation.getScripts', () => { return new GetScriptsController( - container.get('repository.automationScript') as AutomationScriptRepositoryInterface, - container.get('serializer.classToPlain') as ClassToPlainSerializer, + container.get('repository.automationScript'), + container.get('serializer.classToPlain'), ); }); container.set('controller.automation.getScript', () => { return new GetScriptController( - container.get('repository.automationScript') as AutomationScriptRepositoryInterface, + container.get('repository.automationScript'), ); }); container.set('controller.automation.createScript', () => { return new CreateScriptController( - container.get('repository.automationScript') as AutomationScriptRepositoryInterface, + container.get('repository.automationScript'), ); }); container.set('controller.automation.deleteScript', () => { return new DeleteScriptController( - container.get('repository.automationScript') as AutomationScriptRepositoryInterface, + container.get('repository.automationScript'), ); }); container.set('controller.automation.runScript', () => { return new RunScriptController( - container.get('automation.scriptRuntime') as ScriptRuntime, + container.get('automation.scriptRuntime'), ); }); container.set('controller.automation.stopScript', () => { return new StopScriptController( - container.get('automation.scriptRuntime') as ScriptRuntime, + container.get('automation.scriptRuntime'), ); }); container.set('controller.automation.statusScript', () => { return new StatusScriptController( - container.get('automation.scriptRuntime') as ScriptRuntime, + container.get('automation.scriptRuntime'), ); }); container.set('controller.automation.getLog', () => { return new GetLogController( - container.get('automation.scriptRuntime') as ScriptRuntime, + container.get('automation.scriptRuntime'), ); }); } diff --git a/src/serviceProvider/deviceServiceProvider.ts b/src/serviceProvider/deviceServiceProvider.ts index 33430ba0..50d53f91 100644 --- a/src/serviceProvider/deviceServiceProvider.ts +++ b/src/serviceProvider/deviceServiceProvider.ts @@ -2,57 +2,51 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; import DeviceManager from "../device/deviceManager.js"; import SlvCtrlPlusDeviceFactory from "../device/protocol/slvCtrlPlus/slvCtrlPlusDeviceFactory.js"; import DelegateDeviceUpdater from "../device/updater/delegateDeviceUpdater.js"; -import PlainToClassSerializer from "../serialization/plainToClassSerializer.js"; -import UuidFactory from "../factory/uuidFactory.js"; -import Settings from "../settings/settings.js"; import {adjectives, Config} from "unique-names-generator"; import DeviceNameGenerator from "../device/deviceNameGenerator.js"; -import DeviceUpdaterInterface from "../device/updater/deviceUpdaterInterface.js"; import {starWarsNouns} from "../util/dictionary.js"; import BufferedDeviceUpdater from "../device/updater/bufferedDeviceUpdater.js"; import GenericDeviceUpdater from "../device/protocol/slvCtrlPlus/genericDeviceUpdater.js"; import GenericSlvCtrlPlusDevice from "../device/protocol/slvCtrlPlus/genericSlvCtrlPlusDevice.js"; import EventEmitter from "events"; import SerialDeviceTransportFactory from "../device/transport/serialDeviceTransportFactory.js"; -import DateFactory from "../factory/dateFactory.js"; import Device from "../device/device.js"; import SlvCtrlPlusSerialDeviceProviderFactory from "../device/protocol/slvCtrlPlus/slvCtrlPlusSerialDeviceProviderFactory.js"; -import DeviceProviderFactory from "../device/provider/deviceProviderFactory.js"; import DeviceProviderLoader from "../device/provider/deviceProviderLoader.js"; import SlvCtrlPlusSerialDeviceProvider from "../device/protocol/slvCtrlPlus/slvCtrlPlusSerialDeviceProvider.js"; -import Logger from "../logging/Logger.js"; import ButtplugIoWebsocketDeviceProvider from "../device/protocol/buttplugIo/buttplugIoWebsocketDeviceProvider.js"; import ButtplugIoWebsocketDeviceProviderFactory from "../device/protocol/buttplugIo/buttplugIoWebsocketDeviceProviderFactory.js"; import ButtplugIoDeviceFactory from "../device/protocol/buttplugIo/buttplugIoDeviceFactory.js"; import ButtplugIoDevice from "../device/protocol/buttplugIo/buttplugIoDevice.js"; import ButtplugIoDeviceUpdater from "../device/protocol/buttplugIo/buttplugIoDeviceUpdater.js"; +import ServiceMap from "../serviceMap.js"; -export default class DeviceServiceProvider implements ServiceProvider +export default class DeviceServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set( 'device.serial.transport.factory', - (): SerialDeviceTransportFactory => new SerialDeviceTransportFactory() + () => new SerialDeviceTransportFactory() ); container.set( 'device.provider.factory.slvCtrlPlusSerial', - (): DeviceProviderFactory => new SlvCtrlPlusSerialDeviceProviderFactory( + () => new SlvCtrlPlusSerialDeviceProviderFactory( new EventEmitter(), - container.get('device.serial.factory.slvCtrlPlus') as SlvCtrlPlusDeviceFactory, - container.get('device.serial.transport.factory') as SerialDeviceTransportFactory, - container.get('logger.default') as Logger + container.get('device.serial.factory.slvCtrlPlus'), + container.get('device.serial.transport.factory'), + container.get('logger.default'), ) ); container.set( 'device.provider.factory.buttplugIoWebsocket', - (): DeviceProviderFactory => new ButtplugIoWebsocketDeviceProviderFactory( + () => new ButtplugIoWebsocketDeviceProviderFactory( new EventEmitter(), - container.get('device.serial.factory.buttplugIo') as ButtplugIoDeviceFactory, - container.get('logger.default') as Logger + container.get('device.serial.factory.buttplugIo'), + container.get('logger.default'), ) ); @@ -60,7 +54,7 @@ export default class DeviceServiceProvider implements ServiceProvider return new DeviceManager(new EventEmitter(), new Map()); }); - container.set('device.uniqueNameGenerator', (): DeviceNameGenerator => { + container.set('device.uniqueNameGenerator', () => { const config: Config = { dictionaries: [adjectives, starWarsNouns], length: 2, @@ -72,24 +66,24 @@ export default class DeviceServiceProvider implements ServiceProvider }) container.set('device.serial.factory.slvCtrlPlus', () => new SlvCtrlPlusDeviceFactory( - container.get('factory.uuid') as UuidFactory, - container.get('factory.date') as DateFactory, - container.get('settings') as Settings, - container.get('device.uniqueNameGenerator') as DeviceNameGenerator, - container.get('logger.default') as Logger, + container.get('factory.uuid'), + container.get('factory.date'), + container.get('settings'), + container.get('device.uniqueNameGenerator'), + container.get('logger.default'), )); container.set('device.serial.factory.buttplugIo', () => new ButtplugIoDeviceFactory( - container.get('factory.uuid') as UuidFactory, - container.get('factory.date') as DateFactory, - container.get('settings') as Settings, - container.get('logger.default') as Logger, + container.get('factory.uuid'), + container.get('factory.date'), + container.get('settings'), + container.get('logger.default'), )); - container.set('device.updater', (): DeviceUpdaterInterface => { - const plainToClass = container.get('serializer.plainToClass') as PlainToClassSerializer; + container.set('device.updater', () => { + const plainToClass = container.get('serializer.plainToClass'); const deviceUpdater = new DelegateDeviceUpdater(); - const logger = container.get('logger.default') as Logger; + const logger = container.get('logger.default'); deviceUpdater.add(GenericSlvCtrlPlusDevice, new GenericDeviceUpdater(plainToClass, logger)); deviceUpdater.add(ButtplugIoDevice, new ButtplugIoDeviceUpdater(plainToClass, logger)); @@ -99,19 +93,19 @@ export default class DeviceServiceProvider implements ServiceProvider container.set('device.provider.loader', (): DeviceProviderLoader => { return new DeviceProviderLoader( - container.get('device.manager') as DeviceManager, - container.get('settings') as Settings, + container.get('device.manager'), + container.get('settings'), new Map([ [ SlvCtrlPlusSerialDeviceProvider.name, - container.get('device.provider.factory.slvCtrlPlusSerial') as DeviceProviderFactory + container.get('device.provider.factory.slvCtrlPlusSerial') ], [ ButtplugIoWebsocketDeviceProvider.name, - container.get('device.provider.factory.buttplugIoWebsocket') as DeviceProviderFactory + container.get('device.provider.factory.buttplugIoWebsocket') ], ]), - container.get('logger.default') as Logger, + container.get('logger.default'), ); }); } diff --git a/src/serviceProvider/factoryServiceProvider.ts b/src/serviceProvider/factoryServiceProvider.ts index ee746398..922f13fe 100644 --- a/src/serviceProvider/factoryServiceProvider.ts +++ b/src/serviceProvider/factoryServiceProvider.ts @@ -1,10 +1,11 @@ import { Pimple, ServiceProvider } from "@timesplinter/pimple"; import UuidFactory from "../factory/uuidFactory.js"; import DateFactory from "../factory/dateFactory.js"; +import ServiceMap from "../serviceMap.js"; -export default class FactoryServiceProvider implements ServiceProvider +export default class FactoryServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('factory.uuid', () => new UuidFactory()); container.set('factory.date', () => new DateFactory()); } diff --git a/src/serviceProvider/loggerServiceProvider.ts b/src/serviceProvider/loggerServiceProvider.ts index 3a37255d..e1114973 100644 --- a/src/serviceProvider/loggerServiceProvider.ts +++ b/src/serviceProvider/loggerServiceProvider.ts @@ -2,10 +2,11 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; import { default as Pino } from 'pino'; import Logger from "../logging/Logger.js"; import PinoLogger from "../logging/PinoLogger.js"; +import ServiceMap from "../serviceMap.js"; -export default class LoggerServiceProvider implements ServiceProvider +export default class LoggerServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('logger.default', (): Logger => { const LOG_LEVEL = process.env.LOG_LEVEL; diff --git a/src/serviceProvider/repositoryServiceProvider.ts b/src/serviceProvider/repositoryServiceProvider.ts index 77fcbf7a..8022a933 100644 --- a/src/serviceProvider/repositoryServiceProvider.ts +++ b/src/serviceProvider/repositoryServiceProvider.ts @@ -1,16 +1,16 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; import ConnectedDeviceRepository from "../repository/connectedDeviceRepository.js"; import AutomationScriptRepository from "../repository/automationScriptRepository.js"; -import DeviceManager from "../device/deviceManager.js"; import os from "os"; import fs from "fs"; +import ServiceMap from "../serviceMap.js"; -export default class RepositoryServiceProvider implements ServiceProvider +export default class RepositoryServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('repository.connectedDevices', () => { return new ConnectedDeviceRepository( - container.get('device.manager') as DeviceManager, + container.get('device.manager'), ); }); diff --git a/src/serviceProvider/serializationServiceProvider.ts b/src/serviceProvider/serializationServiceProvider.ts index 263988f8..f9498e4e 100644 --- a/src/serviceProvider/serializationServiceProvider.ts +++ b/src/serviceProvider/serializationServiceProvider.ts @@ -1,10 +1,11 @@ import { Pimple, ServiceProvider } from "@timesplinter/pimple"; import ClassToPlainSerializer from "../serialization/classToPlainSerializer.js"; import PlainToClassSerializer from "../serialization/plainToClassSerializer.js"; +import ServiceMap from "../serviceMap.js"; -export default class SerializationServiceProvider implements ServiceProvider +export default class SerializationServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('serializer.plainToClass', () => { return new PlainToClassSerializer({ excludeExtraneousValues: true }); }); diff --git a/src/serviceProvider/serverServiceProvider.ts b/src/serviceProvider/serverServiceProvider.ts index 871646a8..85e1c5cf 100644 --- a/src/serviceProvider/serverServiceProvider.ts +++ b/src/serviceProvider/serverServiceProvider.ts @@ -1,8 +1,9 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; import * as http from 'http' import {Server} from "socket.io"; +import ServiceMap from "../serviceMap.js"; -export default class ServerServiceProvider implements ServiceProvider +export default class ServerServiceProvider implements ServiceProvider { private readonly httpServer: http.Server; @@ -10,7 +11,7 @@ export default class ServerServiceProvider implements ServiceProvider this.httpServer = server; } - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('server.websocket', () => { return new Server(this.httpServer, { cors: { diff --git a/src/serviceProvider/settingsServiceProvider.ts b/src/serviceProvider/settingsServiceProvider.ts index 51589478..63eef4e8 100644 --- a/src/serviceProvider/settingsServiceProvider.ts +++ b/src/serviceProvider/settingsServiceProvider.ts @@ -1,14 +1,12 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; -import PlainToClassSerializer from "../serialization/plainToClassSerializer.js"; import SettingsManager from "../settings/settingsManager.js"; -import ClassToPlainSerializer from "../serialization/classToPlainSerializer.js"; import os from 'os'; import fs from "fs"; -import Logger from "../logging/Logger.js"; +import ServiceMap from "../serviceMap.js"; -export default class SettingsServiceProvider implements ServiceProvider +export default class SettingsServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('settings.manager', () => { const settingsPath = `${os.homedir()}/.slvctrlplus/`; @@ -18,9 +16,9 @@ export default class SettingsServiceProvider implements ServiceProvider const settingsManager = new SettingsManager( `${settingsPath}settings.json`, - container.get('serializer.plainToClass') as PlainToClassSerializer, - container.get('serializer.classToPlain') as ClassToPlainSerializer, - container.get('logger.default') as Logger, + container.get('serializer.plainToClass'), + container.get('serializer.classToPlain'), + container.get('logger.default'), ); settingsManager.load(); @@ -29,7 +27,7 @@ export default class SettingsServiceProvider implements ServiceProvider }); container.set('settings', () => { - return (container.get('settings.manager') as SettingsManager).load(); + return container.get('settings.manager').load(); }) } } diff --git a/src/serviceProvider/socketServiceProvider.ts b/src/serviceProvider/socketServiceProvider.ts index 3968cc5b..d489f15f 100644 --- a/src/serviceProvider/socketServiceProvider.ts +++ b/src/serviceProvider/socketServiceProvider.ts @@ -1,17 +1,15 @@ import { Pimple, ServiceProvider } from '@timesplinter/pimple'; -import ConnectedDeviceRepository from "../repository/connectedDeviceRepository.js"; -import DeviceUpdaterInterface from "../device/updater/deviceUpdaterInterface.js"; import DeviceUpdateHandler from "../socket/deviceUpdateHandler.js"; -import Logger from "../logging/Logger.js"; +import ServiceMap from "../serviceMap.js"; -export default class SocketServiceProvider implements ServiceProvider +export default class SocketServiceProvider implements ServiceProvider { - public register(container: Pimple): void { + public register(container: Pimple): void { container.set('socket.deviceUpdateHandler', () => { return new DeviceUpdateHandler( - container.get('repository.connectedDevices') as ConnectedDeviceRepository, - container.get('device.updater') as DeviceUpdaterInterface, - container.get('logger.default') as Logger, + container.get('repository.connectedDevices'), + container.get('device.updater'), + container.get('logger.default'), ); }); } diff --git a/yarn.lock b/yarn.lock index b4af0129..262571d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1481,10 +1481,10 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== -"@timesplinter/pimple@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@timesplinter/pimple/-/pimple-1.1.1.tgz#f63d762c1c525a8cce89c9a8f644f91185b11a0c" - integrity sha512-h0I/G9+/14SAEK6ITTA5/5kmLTeLJRAy82iercr7nNnuMO0XFBXZs3NRawzSUEXYZub4q696G3SgNXvohlSmqA== +"@timesplinter/pimple@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@timesplinter/pimple/-/pimple-2.0.0.tgz#36ca45bf39826e3bbd9f48bf58b50711e23d4d92" + integrity sha512-H/6VXYWw7Gxx2KVc1B+v2ERZDoyLKKcEuiB0y5N80lE6Z5YmmHWdMtBQSj9WyETK2B5d2+kfQZBTtlv/KSFTsQ== "@tsconfig/node10@^1.0.7": version "1.0.9" @@ -1856,12 +1856,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1, acorn-walk@^8.2.0: +acorn-walk@^8.1.1: version "8.3.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== -acorn@^8.4.1, acorn@^8.7.0, acorn@^8.9.0: +acorn@^8.4.1, acorn@^8.9.0: version "8.11.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== @@ -2098,6 +2098,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -2167,6 +2176,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -2261,6 +2278,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2451,11 +2473,23 @@ debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, dependencies: ms "2.1.2" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -2494,6 +2528,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -2553,7 +2592,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -2841,6 +2880,11 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -3039,6 +3083,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3107,6 +3156,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3278,7 +3332,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3322,11 +3376,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" @@ -3517,6 +3576,13 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isolated-vm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isolated-vm/-/isolated-vm-5.0.0.tgz#aba44e7193cb6d28ff9eab74881cf3f4188d5f73" + integrity sha512-rIMTrIUuwOZ57wK1V3/dmgyXMc1oX4YbGgALAiAH59xHrWoEwOtCQjjvuPZGZwllkMgYlOoNk6hW0+Mg04gJEw== + dependencies: + prebuild-install "^7.1.1" + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -4168,6 +4234,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -4189,11 +4260,16 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4218,6 +4294,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4228,6 +4309,13 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +node-abi@^3.3.0: + version "3.54.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.54.0.tgz#f6386f7548817acac6434c6cba02999c9aebcc69" + integrity sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA== + dependencies: + semver "^7.3.5" + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" @@ -4561,6 +4649,24 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4656,6 +4762,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -4668,6 +4784,15 @@ read-last-lines@^1.8.0: dependencies: mz "^2.7.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^4.0.0: version "4.5.1" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.1.tgz#3f2e4e66eab45606ac8f31597b9edb80c13b12ab" @@ -4813,7 +4938,7 @@ safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4852,7 +4977,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4: +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -4970,6 +5095,20 @@ signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -5127,7 +5266,7 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.3.0: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -5156,6 +5295,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5182,6 +5326,27 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -5289,6 +5454,13 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5431,6 +5603,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -5467,14 +5644,6 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vm2@^3.9.14: - version "3.9.19" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" - integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"