diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..e495129 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + extends: './node_modules/@companion-module/tools/eslint/main.cjs', + overrides: [ + { + files: ['*.ts'], + rules: { + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/camelcase': 'off', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'prettier/prettier': ['warn', { endOfLine: 'auto' }], + }, + }, + ], +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..94f480d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2e799be..acc452d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ node_modules/ +dist/ package-lock.json +.DS_STORE + +.idea /pkg /pkg.tgz -DEBUG-* +DEBUG-PACKAGED diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..860cc50 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v18.17.1 diff --git a/.prettierignore b/.prettierignore index f54ff83..4d209e8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ package.json -/LICENSE.md \ No newline at end of file +pkg +/LICENSE.md +node_modules/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3f2b0f1 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "printWidth": 120, + "semi": false, + "singleQuote": true, + "useTabs": true, + "endOfLine": "auto" +} diff --git a/How to connect to computer software and companion.pdf b/How to connect to computer software and companion.pdf new file mode 100644 index 0000000..eca1a26 Binary files /dev/null and b/How to connect to computer software and companion.pdf differ diff --git a/LICENSE b/LICENSE index 0f6be20..067635e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Bitfocus AS - Open Source +Copyright (c) 2024 Bitfocus AS - Open Source Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6746243..d3ad4e8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ -# companion-module-[replace with module name] +# companion-module-getontime-ontime -See [HELP.md](./companion/HELP.md) and [LICENSE](./LICENSE) +This module is created for use with GoStream Devices. + +- [Read the docs](./How%20to%20connect%20to%20computer%20software%20and%20companion.pdf) +- [Follow on github](https://github.com/bitfocus/companion-module-osee-gostream) + +## Help + +See [HELP.md](./companion/HELP.md) + +## License + +[MIT License](./LICENSE) diff --git a/actions.js b/actions.js deleted file mode 100644 index b9da0f7..0000000 --- a/actions.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function (self) { - self.setActionDefinitions({ - sample_action: { - name: 'My First Action', - options: [ - { - id: 'num', - type: 'number', - label: 'Test', - default: 5, - min: 0, - max: 100, - }, - ], - callback: async (event) => { - console.log('Hello world!', event.options.num) - }, - }, - }) -} diff --git a/companion/HELP.md b/companion/HELP.md index e77197b..76eed70 100644 --- a/companion/HELP.md +++ b/companion/HELP.md @@ -1,3 +1,52 @@ -## Your module +## GoStreamDeck -Write some help for your users here! +Should work with all models of GoStreamDeck. + +Firmware versions 7.5.2 and later are known to work, other versions may experience problems. +Firmware versions after 9.2 are not verified to be working at the time of writing, but they likely will work fine. + +Devices must be controlled over a network, USB control is NOT supported. + +**Available commands for GoStreamDeck** + +- Set input on Program +- Set input on Preview +- Set inputs on Upstream KEY +- Set inputs on Downstream KEY +- Set AUX bus +- Set Upstream KEY OnAir +- Auto DSK Transition +- Tie DSK to transition +- Set Downstream Key On Air +- CUT operation +- AUTO transition operation +- Change transition type +- Change transition selection +- Change transition selection component +- Change transition rate +- Set fade to black rate +- Execute fade to/from black +- Run MACRO +- Continue MACRO +- Stop MACROS +- Set SuperSource +- Change media player source +- Cycle media player source +- recording control +- streaming control +- Classic audio inputs control +- Fairlight audio inputs control + +## Common issues + +### Macros not showing as running + +Companion is not always able to detect that a macro has been run. This happens when the macro has zero length. +You can resolve this by giving the macro a pause/sleep of 1 frame. + +### Diagnosing connection issues + +The most common cause of Companion not being able to connect to your GoStreamDeck is misconfiguration of the networking. Due to how the discovery protocol works, it will see GoStreamDeck that you may not be able to connect to. +A good way to rule out Companion as being at fault, is to disconnect the USB to your GoStreamDeck, and use the GoStreamDeck software. If that is unable to connect then it is most likely a network configuration issue. + +To be able to connect to your GoStreamDeck, both the GoStreamDeck and your Companion machine must be connected to the same network (ideally cabled, but wifi should work). They must also be of the same IP address range. For example, your network could be `192.168.0.x`, where each machine has a different number instead of the `x`. In most cases the subnet mask should be 255.255.255.0, unless your network is setup to use something else. diff --git a/companion/manifest.json b/companion/manifest.json index ad77bef..a1a6089 100644 --- a/companion/manifest.json +++ b/companion/manifest.json @@ -1,26 +1,29 @@ { - "id": "your-module-name", - "name": "your-module-name", - "shortname": "module-shortname", - "description": "A short one line description of your module", - "version": "0.0.0", + "id": "osee-gostreamdeck", + "name": "osee-gostreamdeck", + "shortname": "gostreamdeck", + "description": "Companion module for GoStreamDeck", + "version": "1.0.1", "license": "MIT", - "repository": "git+https://github.com/bitfocus/companion-module-your-module-name.git", - "bugs": "https://github.com/bitfocus/companion-module-your-module-name/issues", + "repository": "git+https://github.com/bitfocus/companion-module-osee-gostream.git", + "bugs": "https://github.com/bitfocus/companion-module-osee-gostream/issues", "maintainers": [ { - "name": "Your name", - "email": "Your email" + "name": "Carlos Valente", + "email": "mail@ontime.no" + }, + { + "name": "Fabian Posenau" } ], + "legacyIds": [], "runtime": { "type": "node18", "api": "nodejs-ipc", "apiVersion": "0.0.0", - "entrypoint": "../main.js" + "entrypoint": "../dist/index.js" }, - "legacyIds": [], - "manufacturer": "Your company", - "products": ["Your product"], - "keywords": [] + "manufacturer": "OSEE", + "products": ["GoStreamDeck"], + "keywords": ["GoStreamDeck", "companion"] } diff --git a/feedbacks.js b/feedbacks.js deleted file mode 100644 index 1f331c7..0000000 --- a/feedbacks.js +++ /dev/null @@ -1,33 +0,0 @@ -const { combineRgb } = require('@companion-module/base') - -module.exports = async function (self) { - self.setFeedbackDefinitions({ - ChannelState: { - name: 'Example Feedback', - type: 'boolean', - label: 'Channel State', - defaultStyle: { - bgcolor: combineRgb(255, 0, 0), - color: combineRgb(0, 0, 0), - }, - options: [ - { - id: 'num', - type: 'number', - label: 'Test', - default: 5, - min: 0, - max: 10, - }, - ], - callback: (feedback) => { - console.log('Hello world!', feedback.options.num) - if (feedback.options.num > 5) { - return true - } else { - return false - } - }, - }, - }) -} diff --git a/main.js b/main.js deleted file mode 100644 index 42485cc..0000000 --- a/main.js +++ /dev/null @@ -1,63 +0,0 @@ -const { InstanceBase, Regex, runEntrypoint, InstanceStatus } = require('@companion-module/base') -const UpgradeScripts = require('./upgrades') -const UpdateActions = require('./actions') -const UpdateFeedbacks = require('./feedbacks') -const UpdateVariableDefinitions = require('./variables') - -class ModuleInstance extends InstanceBase { - constructor(internal) { - super(internal) - } - - async init(config) { - this.config = config - - this.updateStatus(InstanceStatus.Ok) - - this.updateActions() // export actions - this.updateFeedbacks() // export feedbacks - this.updateVariableDefinitions() // export variable definitions - } - // When module gets deleted - async destroy() { - this.log('debug', 'destroy') - } - - async configUpdated(config) { - this.config = config - } - - // Return config fields for web config - getConfigFields() { - return [ - { - type: 'textinput', - id: 'host', - label: 'Target IP', - width: 8, - regex: Regex.IP, - }, - { - type: 'textinput', - id: 'port', - label: 'Target Port', - width: 4, - regex: Regex.PORT, - }, - ] - } - - updateActions() { - UpdateActions(this) - } - - updateFeedbacks() { - UpdateFeedbacks(this) - } - - updateVariableDefinitions() { - UpdateVariableDefinitions(this) - } -} - -runEntrypoint(ModuleInstance, UpgradeScripts) diff --git a/package.json b/package.json index 386f045..aa61755 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,49 @@ { - "name": "your-module-name", - "version": "0.1.0", - "main": "main.js", - "scripts": { - "format": "prettier -w .", - "package": "companion-module-build" - }, + "name": "osee-gostreamdeck", + "version": "1.0.1", + "main": "/dist/index.js", "license": "MIT", + "prettier": "@companion-module/tools/.prettierrc.json", "repository": { "type": "git", - "url": "git+https://github.com/bitfocus/companion-module-your-module-name.git" + "url": "git+https://github.com/bitfocus/companion-module-osee-gostream.git" + }, + "scripts": { + "prepare": "husky install", + "dev": "yarn build:watch", + "build": "rimraf dist && yarn build:main", + "build:main": "tsc -p tsconfig.build.json", + "build:watch": "tsc -p tsconfig.build.json --watch", + "lint": "eslint ./src --ext .ts", + "lint:raw": "eslint --ext .ts --ext .js --ignore-pattern dist --ignore-pattern pkg", + "format": "prettier -w .", + "postinstall": "yarn build" + }, + "engines": { + "node": ">=18.12.0" }, "dependencies": { - "@companion-module/base": "~1.7.0" + "@companion-module/base": "~1.2.1", + "socket.io-client": "^4.5.1" }, "devDependencies": { - "@companion-module/tools": "^1.4.2" + "@companion-module/tools": "^1.1.0", + "@types/node": "^18.14.0", + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", + "eslint": "^8.34.0", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.4", + "lint-staged": "^13.1.2", + "prettier": "^2.8.4", + "typescript": "~4.9.5" }, - "prettier": "@companion-module/tools/.prettierrc.json" + "lint-staged": { + "*.{js,json,md}": [ + "prettier --write" + ], + "*.ts": [ + "yarn lint --fix" + ] + } } diff --git a/src/GoSteamDeckV1.ts b/src/GoSteamDeckV1.ts new file mode 100644 index 0000000..019597e --- /dev/null +++ b/src/GoSteamDeckV1.ts @@ -0,0 +1,46 @@ +import { + CompanionActionDefinitions, + CompanionFeedbackDefinitions, + CompanionPresetDefinitions, +} from '@companion-module/base' +import { GoSteamDeckInstance, GoSteamDeckClient } from '.' + +import { actions } from './actions' +import { feedbacks } from './feedback' +import { presets } from './presets' +import { variables } from './variables' +import { connect, disconnectSocket } from './connection' +import { Create } from './state' + +export class GoSteamDeckV1 implements GoSteamDeckClient { + instance: GoSteamDeckInstance + + constructor(instance: GoSteamDeckInstance) { + this.instance = instance; + this.instance.states=Create(); + } + + getVariables(): void { + variables(this.instance) + } + + getActions(): CompanionActionDefinitions { + return actions(this.instance) + } + + getFeedbacks(): CompanionFeedbackDefinitions { + return feedbacks(this.instance) + } + + getPresets(): CompanionPresetDefinitions { + return presets(this.instance) + } + + connect(): void { + connect(this.instance) + } + + disconnectSocket(): void { + disconnectSocket() + } +} diff --git a/src/actions.ts b/src/actions.ts new file mode 100644 index 0000000..24c7ae6 --- /dev/null +++ b/src/actions.ts @@ -0,0 +1,2751 @@ +import { GoSteamDeckInstance } from './index' +import { CompanionActionDefinition, CompanionActionDefinitions, CompanionActionEvent, } from '@companion-module/base' +import { sendCommand } from './connection' +import { SourcesToChoices, getChoices, getChoicesByMacro } from './choices' +import { ActionId, ActionType, SourceType, ReqType, TransitionStyle } from './enums' +import { + ColorSwitchChoices, + KeySwitchChoices, + SuperSourceBorderChoices, + SuperSourceMaskChoices, + SuperSourceStyleChoices, + SwitchChoices, + TransitionStyleChoice, + UpStreamKeyTypeChoices, + WipeDirectionChoices, + KeyResizeSizeChoices, + AudioSourcesChoices, + AudioSourcesEnableChoices, + AudioMicChoices, + StreamingChoices, + SettingsUMDSrcChoices, + SettingsMvMeterChoices, + SettingsMvLayoutChoices, + SettingsMicInputChoices, + SourceModels, + SettingsColorChoices, + SettingsAuxSourceChoices, + SettingsOutFormatChoices, + SettingsOutSourceParamChoices +} from './model' +import { TransitionKeyeState } from './state' + +/** + * Returns all implemented actions. + * @param self reference to the BaseInstance + * @constructor + * @returns CompanionActions + */ +export function actions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.PgmIndex]: { + name: 'Set PGM Source', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'Source', + default: SourceType.Input1, + choices: getChoices(ActionType.Program), + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PgmIndex, ReqType.Set, [getOptNumber(action, 'Source')]); + }, + }, + [ActionId.PvwIndex]: { + name: 'Set PVW Source', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'Source', + default: SourceType.Input1, + choices: getChoices(ActionType.Program), + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PvwIndex, ReqType.Set, [getOptNumber(action, 'Source')]) + }, + }, + //Transition Style + ...TransitionActions(_self), + ...DSKActions(_self), + ...ColorBackActions(_self), + ...SuperSourceActions(_self), + ...UpStreamKeyActions(_self), + ...AudioMixerActions(_self), + ...StillGeneratorActions(_self), + ...MacroActions(_self), + ...StreamingActions(_self), + ...SettingsActions(_self), + ...RecordActions(_self), + ...LiveActions(_self), + } + return actions +} + +function TransitionActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.CutTransition]: { + name: 'Perform CUT transition', + options: [], + callback: async () => { + await sendCommand(_self, ActionId.CutTransition, ReqType.Set); + //_self.states. + await sendCommand(_self, ActionId.PgmIndex, ReqType.Get); + await sendCommand(_self, ActionId.PvwIndex, ReqType.Get); + }, + }, + [ActionId.AutoTransition]: { + name: 'Perform AUTO transition', + options: [], + callback: async () => { + await sendCommand(_self, ActionId.AutoTransition, ReqType.Set); + await sendCommand(_self, ActionId.PgmIndex, ReqType.Get); + await sendCommand(_self, ActionId.PvwIndex, ReqType.Get); + }, + }, + [ActionId.FTB]: { + name: 'Perform FTB Transition', + options: [], + callback: async () => { + await sendCommand(_self, ActionId.FTB, ReqType.Set); + await sendCommand(_self, ActionId.FTB, ReqType.Get); + }, + }, + [ActionId.FtbAudioAFV]: { + name: 'Perform FTB Transition,Audio follows video and pops in', + options: [ + { + type: 'dropdown', + label: 'FTB Audio AFV', + id: 'FtbAudioAFV', + default: 0, + choices: SwitchChoices, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.FtbAudioAFV, ReqType.Set, [getOptNumber(action, 'FtbAudioAFV')]); + }, + }, + [ActionId.FtbRate]: { + name: 'Fade to black: Change rate', + options: [ + { + type: 'number', + label: 'FTB Rate', + id: 'FtbRate', + default: 2, + min: 0.5, + max: 8.0, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.FtbRate, ReqType.Set, [getOptNumber(action, 'FtbRate')]); + }, + }, + [ActionId.Prev]: { + name: 'Preview switch', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'prevEnable', + default: 0, + choices: SwitchChoices, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.Prev, ReqType.Set, [getOptNumber(action, 'prevEnable')]); + }, + }, + [ActionId.TransitionIndex]: { + name: 'Transition: Set style/pattern', + options: [ + { + type: 'dropdown', + label: 'Transition Style', + id: 'TransitionStyle', + default: TransitionStyle.MIX, + choices: TransitionStyleChoice, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionIndex, ReqType.Set, [getOptNumber(action, 'TransitionStyle')]); + sendCommand(_self, ActionId.TransitionIndex, ReqType.Get); + }, + }, + [ActionId.TransitionRate]: { + name: 'Transition: Change rate', + options: [ + { + type: 'dropdown', + label: 'Transition Style', + id: 'TransitionStyle', + default: TransitionStyle.MIX, + choices: TransitionStyleChoice, + }, + { + type: 'number', + label: 'Transition Rate', + id: 'TransitionRate', + default: 2, + min: 0.5, + max: 8.0, + step: 0.5, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionRate, ReqType.Set, [getOptNumber(action, 'TransitionStyle'), getOptNumber(action, 'TransitionRate')]); + }, + }, + [ActionId.TransitionDipSource]: { + name: 'Transition:Change Dip Source', + options: [ + { + type: 'dropdown', + label: 'Change Dip Source', + id: 'TransitionDipSource', + default: 0, + choices: getChoices(ActionType.TransitionDipSource), + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionDipSource, ReqType.Set, [getOptNumber(action, 'TransitionDipSource')]); + }, + }, + [ActionId.TransitionWipeXPosition]: { + name: 'Transition:Change Wipe X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'XPosition', + default: 0, + min: -16.0, + max: 16.0, + step: 0.2, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeXPosition, ReqType.Set, [getOptNumber(action, 'XPosition')]); + }, + }, + [ActionId.TransitionWipeYPosition]: { + name: 'Transition:Change Wipe Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'YPosition', + default: 0, + min: -9.0, + max: 9.0, + step: 0.2, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeYPosition, ReqType.Set, [getOptNumber(action, 'YPosition')]); + }, + }, + [ActionId.TransitionWipeDirection]: { + name: 'Transition:Change Wipe Style Direction', + options: [ + { + type: 'dropdown', + label: 'Change Wipe Style Direction', + id: 'WipeDirection', + default: 0, + choices: WipeDirectionChoices, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeDirection, ReqType.Set, [getOptNumber(action, 'WipeDirection')]); + }, + }, + [ActionId.TransitionWipeSymmetry]: { + name: 'Transition:Change Wipe Style Symmetry', + options: [ + { + type: 'number', + label: 'Symmetry', + id: 'WipeSymmetry', + default: 50, + min: 0, + max: 100, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeSymmetry, ReqType.Set, [getOptNumber(action, 'WipeSymmetry')]); + }, + }, + [ActionId.TransitionWipeSoftness]: { + name: 'Transition:Change Wipe Style Softness', + options: [ + { + type: 'number', + label: 'Symmetry', + id: 'WipeSoftness', + default: 0, + min: 0, + max: 100, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeSoftness, ReqType.Set, [getOptNumber(action, 'WipeSoftness')]); + }, + }, + [ActionId.TransitionWipeBorder]: { + name: 'Transition:Change Wipe Style Border', + options: [ + { + type: 'number', + label: 'Symmetry', + id: 'WipeBorder', + default: 0, + min: 0, + max: 100, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeBorder, ReqType.Set, [getOptNumber(action, 'WipeBorder')]); + }, + }, + [ActionId.TransitionWipeFillSource]: { + name: 'Transition:Change Wipe Style Fill Source', + options: [ + { + type: 'dropdown', + label: 'Fill Source', + id: 'WipeFillSource', + default: 0, + choices: getChoices(ActionType.TransitionWipeFillSource), + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionWipeFillSource, ReqType.Set, [getOptNumber(action, 'WipeFillSource')]); + }, + }, + [ActionId.TransitionPosition]: { + name: 'Transition:Change push bar position', + options: [ + { + type: 'number', + label: 'Position', + id: 'BarPosition', + default: 0, + min: 0, + max: 256, + range: true, + } + ], + callback: (action) => { + sendCommand(_self, ActionId.TransitionPosition, ReqType.Set, [getOptNumber(action, 'BarPosition')]); + }, + }, + } + return actions; +} + +function DSKActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.TransitionSource]: { + name: 'Next Transition:Set Transition Key Switch', + options: [ + { + type: 'multidropdown', + label: 'Switch', + id: 'KeySwitch', + choices: KeySwitchChoices, + minSelection: 1, + default: ["2"], + } + ], + callback: async (action) => { + let seleOptions = action.options.KeySwitch; + if (seleOptions && Array.isArray(seleOptions)) { + let arratOptions = Array.from(seleOptions); + const newProps: TransitionKeyeState = { M_Key: false, DSK: false, BKGD: false }; + let num = 0; + if (arratOptions.includes('0')) { + newProps.M_Key = true; + num += 1; + } + if (arratOptions.includes('1')) { + newProps.DSK = true; + num += (1 << 1); + } + if (arratOptions.includes('2')) { + newProps.BKGD = true; + num += (1 << 2); + } + _self.states.TKeyeState = newProps; + await sendCommand(_self, ActionId.TransitionSource, ReqType.Set, [num]); + } + }, + }, + [ActionId.KeyOnAir]: { + name: 'Next Transition:Set KeyOnAir', + options: [ + { + type: 'dropdown', + label: 'Key OnAir', + id: 'KeyOnAir', + choices: SwitchChoices, + default: 0, + } + ], + callback: async (action) => { + _self.states.keyOnAir = true; + await sendCommand(_self, ActionId.TransitionSource, ReqType.Set, [getOptNumber(action, 'KeyOnAir')]); + }, + }, + [ActionId.DskOnAir]: { + name: 'Next Transition:Set DSKOnAir', + options: [ + { + type: 'dropdown', + label: 'DSK OnAir', + id: 'DSKOnAir', + choices: SwitchChoices, + default: 0, + } + ], + callback: async (action) => { + _self.states.dskOnAir = true; + await sendCommand(_self, ActionId.TransitionSource, ReqType.Set, [getOptNumber(action, 'DSKOnAir')]); + }, + }, + [ActionId.DskSourceFill]: { + name: 'DSK:Set Source', + options: [ + { + type: 'dropdown', + label: 'DSK Fill', + id: 'DSKFill', + choices: getChoices(ActionType.DskSourceFill), + default: 0, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskSourceFill, ReqType.Set, [getOptNumber(action, 'DSKFill')]); + }, + }, + [ActionId.DskSourceKey]: { + name: 'DSK:Set Source', + options: [ + { + type: 'dropdown', + label: 'DSK Key', + id: 'DSKKey', + choices: getChoices(ActionType.DskSourceFill), + default: 0, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskSourceKey, ReqType.Set, [getOptNumber(action, 'DSKKey')]); + }, + }, + + [ActionId.DskMaskEnable]: { + name: 'DSK:Set Mask', + options: [ + { + type: 'dropdown', + label: 'Dsk Mask Enable', + id: 'DskMaskEnable', + default: 0, + choices: SwitchChoices, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskMaskEnable, ReqType.Set, [getOptNumber(action, 'DSKFill')]); + + }, + }, + [ActionId.DskMaskHStart]: { + name: 'DSK:Set Mask H Start', + options: [ + { + type: 'number', + label: 'H Start', + id: 'HStart', + default: 0, + min: 0, + max: 100, + }, + ], + callback: async (action) => { + //_self.states.dskOnAir=true; + await sendCommand(_self, ActionId.DskMaskHStart, ReqType.Set, [getOptNumber(action, 'HStart')]); + + }, + }, + [ActionId.DskMaskVStart]: { + name: 'DSK:Set Mask V Start', + options: [ + { + type: 'number', + label: 'V Start', + id: 'VStart', + default: 0, + min: 0, + max: 100, + }, + ], + callback: async (action) => { + //_self.states.dskOnAir=true; + await sendCommand(_self, ActionId.DskMaskVStart, ReqType.Set, [getOptNumber(action, 'VStart')]); + + }, + }, + [ActionId.DskMaskHEnd]: { + name: 'DSK:Set Mask H End', + options: [ + { + type: 'number', + label: 'H End', + id: 'HEnd', + default: 100, + min: 1, + max: 100, + }, + ], + callback: async (action) => { + //_self.states.dskOnAir=true; + await sendCommand(_self, ActionId.DskMaskHEnd, ReqType.Set, [getOptNumber(action, 'HEnd')]); + + }, + }, + [ActionId.DskMaskVEnd]: { + name: 'DSK:Set Mask', + options: [ + { + type: 'number', + label: 'V End', + id: 'VEnd', + default: 100, + min: 1, + max: 100, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskMaskVEnd, ReqType.Set, [getOptNumber(action, 'VEnd')]); + }, + }, + + [ActionId.DskControlShapedKey]: { + name: 'DSK:Set Control Shaped Key', + options: [ + { + type: 'dropdown', + label: 'Shaped Key', + id: 'ShapedKey', + default: 0, + choices: SwitchChoices, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskControlShapedKey, ReqType.Set, [getOptNumber(action, 'ShapedKey')]); + }, + }, + [ActionId.DskControlClip]: { + name: 'DSK:Set Control Clip', + options: [ + { + type: 'number', + label: 'Clip', + id: 'Clip', + default: 15, + min: 0, + max: 100, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskControlClip, ReqType.Set, [getOptNumber(action, 'Clip')]); + }, + }, + [ActionId.DskControlGain]: { + name: 'DSK:Set Control Gain', + options: [ + { + type: 'number', + label: 'Gain', + id: 'Gain', + default: 50, + min: 0, + max: 100, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskControlGain, ReqType.Set, [getOptNumber(action, 'Gain')]); + }, + }, + [ActionId.DskControlInvert]: { + name: 'DSK:Set Control Invert', + options: [ + { + type: 'dropdown', + label: 'Invert', + id: 'Invert', + default: 0, + choices: SwitchChoices + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskControlInvert, ReqType.Set, [getOptNumber(action, 'Invert')]); + }, + }, + [ActionId.DskRate]: { + name: 'DSK:Set Control Rate', + options: [ + { + type: 'number', + label: 'dskRate', + id: 'dskRate', + default: 0, + min: 0.5, + max: 8.0, + range: true, + step: 0.5, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.DskRate, ReqType.Set, [getOptNumber(action, 'dskRate')]); + }, + }, + } + return actions; +} +function ColorBackActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.ColorHue]: { + name: 'Color Back:Set Color Hue', + options: [ + { + type: 'dropdown', + label: 'Color:', + id: 'ColorHub1', + choices: ColorSwitchChoices, + default: 0, + }, + { + type: 'number', + label: 'Hue', + id: 'ColorHub2', + default: 82, + min: 0, + max: 359, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ColorHue, ReqType.Set, [getOptNumber(action, 'ColorHub1'), getOptNumber(action, 'ColorHub2')]); + }, + }, + [ActionId.ColorSaturation]: { + name: 'Color Back:Set Color Saturation', + options: [ + { + type: 'dropdown', + label: 'Color:', + id: 'ColorSaturation1', + choices: ColorSwitchChoices, + default: 0, + }, + { + type: 'number', + label: 'Saturation', + id: 'ColorSaturation2', + default: 100, + min: 0, + max: 100, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ColorSaturation, ReqType.Set, [getOptNumber(action, 'ColorSaturation1'), getOptNumber(action, 'ColorSaturation2')]); + }, + }, + [ActionId.ColorBrightness]: { + name: 'Color Back:Set Color Brightness', + options: [ + { + type: 'dropdown', + label: 'Color:', + id: 'ColorBrightness1', + choices: ColorSwitchChoices, + default: 0, + }, + { + type: 'number', + label: 'Brightness', + id: 'ColorBrightness2', + default: 70, + min: 0, + max: 100, + } + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ColorSaturation, ReqType.Set, [getOptNumber(action, 'ColorBrightness1'), getOptNumber(action, 'ColorBrightness2')]); + }, + }, + } + return actions; +} + +function SuperSourceActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.SuperSourceEnable]: { + name: 'Super Source:Super Source Enable', + options: [ + { + type: 'dropdown', + label: 'Enable:', + id: 'SuperSourceEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceEnable, ReqType.Set, [getOptNumber(action, 'SuperSourceEnable')]); + }, + }, + [ActionId.SuperSourceSource1]: { + name: 'Super Source:Super Source Source1', + options: [ + { + type: 'dropdown', + label: 'SuperSource Source1:', + id: 'SuperSourceSource1', + choices: getChoices(ActionType.SuperSourceSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceSource1, ReqType.Set, [getOptNumber(action, 'SuperSourceSource1')]); + }, + }, + [ActionId.SuperSourceSource2]: { + name: 'Super Source:Super Source Source2', + options: [ + { + type: 'dropdown', + label: 'SuperSource Source2:', + id: 'SuperSourceSource2', + choices: getChoices(ActionType.SuperSourceSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceSource2, ReqType.Set, [getOptNumber(action, 'SuperSourceSource2')]); + }, + }, + [ActionId.SuperSourceBackground]: { + name: 'Super Source:Super Source Background', + options: [ + { + type: 'dropdown', + label: 'SuperSource Background:', + id: 'SuperSourceBackground', + choices: getChoices(ActionType.SuperSourceSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceBackground, ReqType.Set, [getOptNumber(action, 'SuperSourceBackground')]); + }, + }, + [ActionId.SuperSourceControlStyle]: { + name: 'Super Source:Super Source Background', + options: [ + { + type: 'dropdown', + label: 'SuperSource Style:', + id: 'SuperSourceStyle', + choices: SuperSourceStyleChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceControlStyle, ReqType.Set, [getOptNumber(action, 'SuperSourceStyle')]); + }, + }, + [ActionId.SuperSourceControlYPosition]: { + name: 'Super Source:Super Source Y Position', + options: [ + { + type: 'number', + label: 'Y Position:', + id: 'SuperSourceYPosition', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceControlYPosition, ReqType.Set, [getOptNumber(action, 'SuperSourceYPosition')]); + }, + }, + [ActionId.SuperSourceMaskEnable]: { + name: 'Super Source:Super Source Mask Enable', + options: [ + { + type: 'dropdown', + label: 'Mask', + id: 'SuperSourceMask', + choices: SuperSourceMaskChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Mask Enable', + id: 'SuperSourceMaskEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceMaskEnable, ReqType.Set, [getOptNumber(action, 'SuperSourceMask'), getOptNumber(action, 'SuperSourceMaskEnable')]); + }, + }, + [ActionId.SuperSourceMaskHStart]: { + name: 'Super Source:Super Source H Start', + options: [ + { + type: 'dropdown', + label: 'Mask', + id: 'SuperSourceMask', + choices: SuperSourceMaskChoices, + default: 0, + }, + { + type: 'number', + label: 'H Start', + id: 'SuperSourceMaskHStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceMaskHStart, ReqType.Set, [getOptNumber(action, 'SuperSourceMask'), getOptNumber(action, 'SuperSourceMaskHStart')]); + }, + }, + [ActionId.SuperSourceMaskVStart]: { + name: 'Super Source:Super Source V Start', + options: [ + { + type: 'dropdown', + label: 'Mask', + id: 'SuperSourceMask', + choices: SuperSourceMaskChoices, + default: 0, + }, + { + type: 'number', + label: 'V Start', + id: 'SuperSourceMaskVStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceMaskVStart, ReqType.Set, [getOptNumber(action, 'SuperSourceMask'), getOptNumber(action, 'SuperSourceMaskVStart')]); + }, + }, + [ActionId.SuperSourceMaskHEnd]: { + name: 'Super Source:Super Source H End', + options: [ + { + type: 'dropdown', + label: 'Mask', + id: 'SuperSourceMask', + choices: SuperSourceMaskChoices, + default: 0, + }, + { + type: 'number', + label: 'H End', + id: 'SuperSourceMaskHEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceMaskHEnd, ReqType.Set, [getOptNumber(action, 'SuperSourceMask'), getOptNumber(action, 'SuperSourceMaskHEnd')]); + }, + }, + [ActionId.SuperSourceMaskVEnd]: { + name: 'Super Source:Super Source V End', + options: [ + { + type: 'dropdown', + label: 'Mask', + id: 'SuperSourceMask', + choices: SuperSourceMaskChoices, + default: 0, + }, + { + type: 'number', + label: 'V End', + id: 'SuperSourceMaskVEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceMaskVEnd, ReqType.Set, [getOptNumber(action, 'SuperSourceMask'), getOptNumber(action, 'SuperSourceMaskVEnd')]); + }, + }, + [ActionId.SuperSourceBorderWidth]: { + name: 'Super Source:Super Source Border Width', + options: [ + { + type: 'dropdown', + label: 'Border', + id: 'SuperSourceBorder', + choices: SuperSourceBorderChoices, + default: 0, + }, + { + type: 'number', + label: 'Border Width', + id: 'SuperSourceBorderWidth', + min: 0, + max: 10, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceBorderWidth, ReqType.Set, [getOptNumber(action, 'SuperSourceBorder'), getOptNumber(action, 'SuperSourceBorderWidth')]); + }, + }, + [ActionId.SuperSourceBorderHue]: { + name: 'Super Source:Super Source Border Hue', + options: [ + { + type: 'dropdown', + label: 'Border', + id: 'SuperSourceBorder', + choices: SuperSourceBorderChoices, + default: 0, + }, + { + type: 'number', + label: 'Border Hue', + id: 'SuperSourceBorderHue', + min: 0, + max: 359, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceBorderHue, ReqType.Set, [getOptNumber(action, 'SuperSourceBorder'), getOptNumber(action, 'SuperSourceBorderHue')]); + }, + }, + [ActionId.SuperSourceBorderSaturation]: { + name: 'Super Source:Super Source Border Saturation', + options: [ + { + type: 'dropdown', + label: 'Border', + id: 'SuperSourceBorder', + choices: SuperSourceBorderChoices, + default: 0, + }, + { + type: 'number', + label: 'Border Saturation', + id: 'SuperSourceBorderSaturation', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceBorderSaturation, ReqType.Set, [getOptNumber(action, 'SuperSourceBorder'), getOptNumber(action, 'SuperSourceBorderSaturation')]); + }, + }, + [ActionId.SuperSourceBorderBrightness]: { + name: 'Super Source:Super Source Border Brightness', + options: [ + { + type: 'dropdown', + label: 'Border', + id: 'SuperSourceBorder', + choices: SuperSourceBorderChoices, + default: 0, + }, + { + type: 'number', + label: 'Border Saturation', + id: 'SuperSourceBorderSaturation', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SuperSourceBorderSaturation, ReqType.Set, [getOptNumber(action, 'SuperSourceBorder'), getOptNumber(action, 'SuperSourceBorderSaturation')]); + }, + }, + } + return actions; +} + +function UpStreamKeyActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.UpStreamKeyType]: { + name: 'UpStream Key:Set Key Type', + options: [ + { + type: 'dropdown', + label: 'Key Type:', + id: 'USKType', + choices: UpStreamKeyTypeChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.UpStreamKeyType, ReqType.Set, [getOptNumber(action, 'USKType')]); + }, + }, + ...LumaKeyActions(_self), + ...ChromaKeyActions(_self), + ...KeyPatternActions(_self), + ...PIPActions(_self), + } + return actions; +} + +function LumaKeyActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.LumaKeySourceFill]: { + name: 'UpStream Key:Set Luma Key Source Fill', + options: [ + { + type: 'dropdown', + label: 'Source Fill', + id: 'KeyFill', + choices: getChoices(ActionType.LumaKeySourceKey), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeySourceFill, ReqType.Set, [getOptNumber(action, 'KeyFill')]); + }, + }, + [ActionId.LumaKeySourceKey]: { + name: 'UpStream Key:Set Luma Key Source Key', + options: [ + { + type: 'dropdown', + label: 'Key', + id: 'LumaKeySourceKey', + choices: getChoices(ActionType.LumaKeySourceKey), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeySourceKey, ReqType.Set, [getOptNumber(action, 'LumaKeySourceKey')]); + }, + }, + [ActionId.LumaKeyMaskEnable]: { + name: 'UpStream Key:Set Luma Key Mask Enable', + options: [ + { + type: 'dropdown', + label: 'Mask Enable', + id: 'LumaKeyMaskEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyMaskEnable, ReqType.Set, [getOptNumber(action, 'LumaKeyMaskEnable')]); + }, + }, + [ActionId.LumaKeyMaskHStart]: { + name: 'UpStream Key:Set Luma Key Mask H Start', + options: [ + { + type: 'number', + label: 'H Start', + id: 'LumaKeyMaskHStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyMaskHStart, ReqType.Set, [getOptNumber(action, 'LumaKeyMaskHStart')]); + }, + }, + [ActionId.LumaKeyMaskVStart]: { + name: 'UpStream Key:Set Luma Key Mask V Start', + options: [ + { + type: 'number', + label: 'V Start', + id: 'LumaKeyMaskVStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyMaskVStart, ReqType.Set, [getOptNumber(action, 'LumaKeyMaskVStart')]); + }, + }, + [ActionId.LumaKeyMaskHEnd]: { + name: 'UpStream Key:Set Luma Key Mask H End', + options: [ + { + type: 'number', + label: 'H End', + id: 'LumaKeyMaskHEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyMaskHEnd, ReqType.Set, [getOptNumber(action, 'LumaKeyMaskHEnd')]); + }, + }, + [ActionId.LumaKeyMaskVEnd]: { + name: 'UpStream Key:Set Luma Key Mask V End', + options: [ + { + type: 'number', + label: 'V End', + id: 'LumaKeyMaskVEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyMaskVEnd, ReqType.Set, [getOptNumber(action, 'LumaKeyMaskVEnd')]); + }, + }, + [ActionId.LumaKeyControlShapedKey]: { + name: 'UpStream Key:Set Luma Key Control ShapedKey', + options: [ + { + type: 'dropdown', + label: 'ShapedKey', + id: 'LumaKeyControlShapedKey', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyControlShapedKey, ReqType.Set, [getOptNumber(action, 'LumaKeyControlShapedKey')]); + }, + }, + [ActionId.LumaKeyControlClip]: { + name: 'UpStream Key:Set Luma Key Control Clip', + options: [ + { + type: 'number', + label: 'Clip', + id: 'LumaKeyControlClip', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyControlClip, ReqType.Set, [getOptNumber(action, 'LumaKeyControlClip')]); + }, + }, + [ActionId.LumaKeyControlGain]: { + name: 'UpStream Key:Set Luma Key Control Gain', + options: [ + { + type: 'number', + label: 'Gain', + id: 'LumaKeyControlGain', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyControlGain, ReqType.Set, [getOptNumber(action, 'LumaKeyControlGain')]); + }, + }, + [ActionId.LumaKeyControlInvert]: { + name: 'UpStream Key:Set Luma Key Control Invert', + options: [ + { + type: 'dropdown', + label: 'Invert', + id: 'LumaKeyControlInvert', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyControlInvert, ReqType.Set, [getOptNumber(action, 'LumaKeyControlInvert')]); + }, + }, + [ActionId.LumaKeyResizeEnable]: { + name: 'UpStream Key:Set Luma Key Resize Enable', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'LumaKeyResizeEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyResizeEnable, ReqType.Set, [getOptNumber(action, 'LumaKeyResizeEnable')]); + }, + }, + [ActionId.LumaKeyResizeSize]: { + name: 'UpStream Key:Set Luma Key Resize Size', + options: [ + { + type: 'dropdown', + label: 'Size', + id: 'LumaKeyResizeSize', + choices: KeyResizeSizeChoices, + default: 0, + }, + ], + callback: async (action) => { + let value = 0.25; + let info = KeyResizeSizeChoices.find(s => s.id === action.options.LumaKeyResizeSize); + if (info !== null && info !== undefined) { + value = Number(info.label); + } + await sendCommand(_self, ActionId.LumaKeyResizeSize, ReqType.Set, [value]); + }, + }, + [ActionId.LumaKeyResizeXPosition]: { + name: 'UpStream Key:Set Luma Key X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'LumaKeyResizeXPosition', + min: -16, + max: 16, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyResizeXPosition, ReqType.Set, [getOptNumber(action, 'LumaKeyResizeXPosition')]); + }, + }, + [ActionId.LumaKeyResizeYPosition]: { + name: 'UpStream Key:Set Luma Key Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'LumaKeyResizeYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.LumaKeyResizeYPosition, ReqType.Set, [getOptNumber(action, 'LumaKeyResizeYPosition')]); + }, + }, + } + return actions; +} + +function ChromaKeyActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.ChromaKeyFill]: { + name: 'UpStream Key:Set Chroma Key Source Fill', + options: [ + { + type: 'dropdown', + label: 'Source Fill', + id: 'KeyFill', + choices: getChoices(ActionType.ChromaKeySourceKey), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyFill, ReqType.Set, [getOptNumber(action, 'KeyFill')]); + }, + }, + [ActionId.ChromaKeyMaskEnable]: { + name: 'UpStream Key:Set Chroma Key Mask Enable', + options: [ + { + type: 'dropdown', + label: 'Mask Enable', + id: 'ChromaKeyMaskEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyMaskEnable, ReqType.Set, [getOptNumber(action, 'ChromaKeyMaskEnable')]); + }, + }, + [ActionId.ChromaKeyMaskHStart]: { + name: 'UpStream Key:Set Chroma Key Mask H Start', + options: [ + { + type: 'number', + label: 'H Start', + id: 'ChromaKeyMaskHStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyMaskHStart, ReqType.Set, [getOptNumber(action, 'ChromaKeyMaskHStart')]); + }, + }, + [ActionId.ChromaKeyMaskVStart]: { + name: 'UpStream Key:Set Chroma Key Mask V Start', + options: [ + { + type: 'number', + label: 'V Start', + id: 'ChromaKeyMaskVStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyMaskVStart, ReqType.Set, [getOptNumber(action, 'ChromaKeyMaskVStart')]); + }, + }, + [ActionId.ChromaKeyMaskHEnd]: { + name: 'UpStream Key:Set Chroma Key Mask H End', + options: [ + { + type: 'number', + label: 'H End', + id: 'ChromaKeyMaskHEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyMaskHEnd, ReqType.Set, [getOptNumber(action, 'ChromaKeyMaskHEnd')]); + }, + }, + [ActionId.ChromaKeyMaskVEnd]: { + name: 'UpStream Key:Set Chroma Key Mask V End', + options: [ + { + type: 'number', + label: 'V End', + id: 'ChromaKeyMaskVEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyMaskVEnd, ReqType.Set, [getOptNumber(action, 'ChromaKeyMaskVEnd')]); + }, + }, + [ActionId.ChromaKeyResizeEnable]: { + name: 'UpStream Key:Set Chroma Key Resize Enable', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'ChromaKeyResizeEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyResizeEnable, ReqType.Set, [getOptNumber(action, 'ChromaKeyResizeEnable')]); + }, + }, + [ActionId.ChromaKeyResizeSize]: { + name: 'UpStream Key:Set Chroma Key Resize Size', + options: [ + { + type: 'dropdown', + label: 'Size', + id: 'ChromaKeyResizeSize', + choices: KeyResizeSizeChoices, + default: 0, + }, + ], + callback: async (action) => { + let value = 0.25; + let info = KeyResizeSizeChoices.find(s => s.id === action.options.ChromaKeyResizeSize); + if (info !== null && info !== undefined) { + value = Number(info.label); + } + await sendCommand(_self, ActionId.ChromaKeyResizeSize, ReqType.Set, [value]); + }, + }, + [ActionId.ChromaKeyResizeXPosition]: { + name: 'UpStream Key:Set Chroma Key X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'ChromaKeyResizeXPosition', + min: -16, + max: 16, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyResizeXPosition, ReqType.Set, [getOptNumber(action, 'ChromaKeyResizeXPosition')]); + }, + }, + [ActionId.ChromaKeyResizeYPosition]: { + name: 'UpStream Key:Set Chroma Key Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'ChromaKeyResizeYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyResizeYPosition, ReqType.Set, [getOptNumber(action, 'ChromaKeyResizeYPosition')]); + }, + }, + [ActionId.ChromaKeyControlSMPXPosition]: { + name: 'UpStream Key:Set Chroma Key SMP X Position', + options: [ + { + type: 'number', + label: 'SMP X Position', + id: 'ChromaKeyControlSMPXPosition', + min: -16.0, + max: 16.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlSMPXPosition, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlSMPXPosition')]); + }, + }, + [ActionId.ChromaKeyControlSMPYPosition]: { + name: 'UpStream Key:Set Chroma Key SMP Y Position', + options: [ + { + type: 'number', + label: 'SMP Y Position', + id: 'ChromaKeyControlSMPYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlSMPYPosition, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlSMPYPosition')]); + }, + }, + [ActionId.ChromaKeyControlSample]: { + name: 'UpStream Key:Set Chroma Key Control Sample Enable', + options: [ + { + type: 'dropdown', + label: 'Sample Enable', + id: 'ChromaKeyControlSample', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlSample, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlSample')]); + }, + }, + [ActionId.ChromaKeyControlColor]: { + name: 'UpStream Key:Set Chroma Key Control Color', + options: [ + { + type: 'colorpicker', + label: 'Control Color', + id: 'ChromaKeyControlColor', + default: 0, + }, + ], + /* callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlSample, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlSample')]); + }, */ + callback: async () => { + //await sendCommand(_self, ActionId.ChromaKeyControlSample, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlSample')]); + }, + }, + [ActionId.ChromaKeyControlForeground]: { + name: 'UpStream Key:Set Chroma Key Foreground', + options: [ + { + type: 'number', + label: 'Foreground', + id: 'ChromaKeyControlForeground', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlForeground, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlForeground')]); + }, + }, + [ActionId.ChromaKeyControlBackground]: { + name: 'UpStream Key:Set Chroma Key Background', + options: [ + { + type: 'number', + label: 'Background', + id: 'ChromaKeyControlBackground', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlBackground, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlBackground')]); + }, + }, + [ActionId.ChromaKeyControlKeyEdge]: { + name: 'UpStream Key:Set Chroma Key Background', + options: [ + { + type: 'number', + label: 'Key Background', + id: 'ChromaKeyControlKeyEdge', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.ChromaKeyControlKeyEdge, ReqType.Set, [getOptNumber(action, 'ChromaKeyControlKeyEdge')]); + }, + }, + } + return actions; +} + +function KeyPatternActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.KeyPatternSourceFill]: { + name: 'UpStream Key:Set Key Pattern Source Fill', + options: [ + { + type: 'dropdown', + label: 'Source Fill', + id: 'KeyFill', + choices: getChoices(ActionType.KeyPatternSourceKey), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternSourceFill, ReqType.Set, [getOptNumber(action, 'KeyFill')]); + }, + }, + [ActionId.KeyPatternWipePattern]: { + name: 'UpStream Key:Set Key Pattern Wipe Pattern', + options: [ + { + type: 'number', + label: 'Wipe Pattern', + id: 'KeyPatternWipePattern', + min: 0, + max: 17, + default: 0, + range: true, + step: 1, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipePattern, ReqType.Set, [getOptNumber(action, 'KeyPatternWipePattern')]); + }, + }, + [ActionId.KeyPatternWipeSize]: { + name: 'UpStream Key:Set Key Pattern Wipe Size', + options: [ + { + type: 'number', + label: 'Wipe Size', + id: 'KeyPatternWipeSize', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipeSize, ReqType.Set, [getOptNumber(action, 'KeyPatternWipeSize')]); + }, + }, + [ActionId.KeyPatternWipeXPosition]: { + name: 'UpStream Key:Set Key Pattern X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'KeyPatternWipeXPosition', + min: -16.0, + max: 16.0, + step: 0.2, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipeXPosition, ReqType.Set, [getOptNumber(action, 'KeyPatternWipeXPosition')]); + }, + }, + [ActionId.KeyPatternWipeYPosition]: { + name: 'UpStream Key:Set Key Pattern Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'KeyPatternWipeYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipeYPosition, ReqType.Set, [getOptNumber(action, 'KeyPatternWipeYPosition')]); + }, + }, + [ActionId.KeyPatternWipeSymmetry]: { + name: 'UpStream Key:Set Key Pattern Symmetry', + options: [ + { + type: 'number', + label: 'Symmetry', + id: 'KeyPatternWipeSymmetry', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipeSymmetry, ReqType.Set, [getOptNumber(action, 'KeyPatternWipeSymmetry')]); + }, + }, + [ActionId.KeyPatternWipeSoftness]: { + name: 'UpStream Key:Set Key Pattern Softness', + options: [ + { + type: 'number', + label: 'Softness', + id: 'KeyPatternWipeSoftness', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternWipeSoftness, ReqType.Set, [getOptNumber(action, 'KeyPatternWipeSoftness')]); + }, + }, + [ActionId.KeyPatternMaskEnable]: { + name: 'UpStream Key:Set KeyPattern Mask Enable', + options: [ + { + type: 'dropdown', + label: 'Mask Enable', + id: 'KeyPatternMaskEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternMaskEnable, ReqType.Set, [getOptNumber(action, 'KeyPatternMaskEnable')]); + }, + }, + [ActionId.KeyPatternMaskHStart]: { + name: 'UpStream Key:Set Key Pattern Mask H Start', + options: [ + { + type: 'number', + label: 'H Start', + id: 'KeyPatternMaskHStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternMaskHStart, ReqType.Set, [getOptNumber(action, 'KeyPatternMaskHStart')]); + }, + }, + [ActionId.KeyPatternMaskVStart]: { + name: 'UpStream Key:Set Key Pattern Mask V Start', + options: [ + { + type: 'number', + label: 'V Start', + id: 'KeyPatternMaskVStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternMaskVStart, ReqType.Set, [getOptNumber(action, 'KeyPatternMaskVStart')]); + }, + }, + [ActionId.KeyPatternMaskHEnd]: { + name: 'UpStream Key:Set Key Pattern Mask H End', + options: [ + { + type: 'number', + label: 'H End', + id: 'KeyPatternMaskHEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternMaskHEnd, ReqType.Set, [getOptNumber(action, 'KeyPatternMaskHEnd')]); + }, + }, + [ActionId.KeyPatternMaskVEnd]: { + name: 'UpStream Key:Set Key Pattern Mask V End', + options: [ + { + type: 'number', + label: 'V End', + id: 'KeyPatternMaskVEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternMaskVEnd, ReqType.Set, [getOptNumber(action, 'KeyPatternMaskVEnd')]); + }, + }, + [ActionId.KeyPatternResizeEnable]: { + name: 'UpStream Key:Set Key Pattern Resize Enable', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'KeyPatternResizeEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternResizeEnable, ReqType.Set, [getOptNumber(action, 'KeyPatternResizeEnable')]); + }, + }, + [ActionId.KeyPatternResizeSize]: { + name: 'UpStream Key:Set Key Pattern Resize Size', + options: [ + { + type: 'dropdown', + label: 'Size', + id: 'KeyPatternResizeSize', + choices: KeyResizeSizeChoices, + default: 0, + }, + ], + callback: async (action) => { + let value = 0.25; + let info = KeyResizeSizeChoices.find(s => s.id === action.options.KeyPatternResizeSize); + if (info !== null && info !== undefined) { + value = Number(info.label); + } + await sendCommand(_self, ActionId.KeyPatternResizeSize, ReqType.Set, [value]); + }, + }, + [ActionId.KeyPatternResizeXPosition]: { + name: 'UpStream Key:Set Key Pattern X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'KeyPatternResizeXPosition', + min: -16, + max: 16, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternResizeXPosition, ReqType.Set, [getOptNumber(action, 'KeyPatternResizeXPosition')]); + }, + }, + [ActionId.KeyPatternResizeYPosition]: { + name: 'UpStream Key:Set Key Pattern Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'KeyPatternResizeYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.KeyPatternResizeYPosition, ReqType.Set, [getOptNumber(action, 'KeyPatternResizeYPosition')]); + }, + }, + } + return actions; +} + +function PIPActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.PipSource]: { + name: 'UpStream Key:Set Pip Source', + options: [ + { + type: 'dropdown', + label: 'PIP Source', + id: 'KeyFill', + choices: getChoices(ActionType.PipSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipSource, ReqType.Set, [getOptNumber(action, 'KeyFill')]); + }, + }, + [ActionId.PipSize]: { + name: 'UpStream Key:Set PIP Size', + options: [ + { + type: 'dropdown', + label: 'Size', + id: 'PipSize', + choices: KeyResizeSizeChoices, + default: 0, + }, + ], + callback: async (action) => { + let value = 0.25; + let info = KeyResizeSizeChoices.find(s => s.id === action.options.PipSize); + if (info !== null && info !== undefined) { + value = Number(info.label); + } + await sendCommand(_self, ActionId.PipSize, ReqType.Set, [value]); + }, + }, + [ActionId.PipXPosition]: { + name: 'UpStream Key:Set PIP X Position', + options: [ + { + type: 'number', + label: 'X Position', + id: 'PipXPosition', + min: -16, + max: 16, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipXPosition, ReqType.Set, [getOptNumber(action, 'PipXPosition')]); + }, + }, + [ActionId.PipYPosition]: { + name: 'UpStream Key:Set PIP Y Position', + options: [ + { + type: 'number', + label: 'Y Position', + id: 'PipYPosition', + min: -9.0, + max: 9.0, + step: 0.2, + default: 0, + range: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipYPosition, ReqType.Set, [getOptNumber(action, 'PipYPosition')]); + }, + }, + [ActionId.PipMaskEnable]: { + name: 'UpStream Key:Set PIP Mask Enable', + options: [ + { + type: 'dropdown', + label: 'Mask Enable', + id: 'PipMaskEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipMaskEnable, ReqType.Set, [getOptNumber(action, 'PipMaskEnable')]); + }, + }, + [ActionId.PipMaskHStart]: { + name: 'UpStream Key:Set PIP Mask H Start', + options: [ + { + type: 'number', + label: 'H Start', + id: 'PipMaskHStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipMaskHStart, ReqType.Set, [getOptNumber(action, 'PipMaskHStart')]); + }, + }, + [ActionId.PipMaskVStart]: { + name: 'UpStream Key:Set Pip Mask V Start', + options: [ + { + type: 'number', + label: 'V Start', + id: 'PipMaskVStart', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipMaskVStart, ReqType.Set, [getOptNumber(action, 'PipMaskVStart')]); + }, + }, + [ActionId.PipMaskHEnd]: { + name: 'UpStream Key:Set Pip Mask H End', + options: [ + { + type: 'number', + label: 'H End', + id: 'PipMaskHEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipMaskHEnd, ReqType.Set, [getOptNumber(action, 'PipMaskHEnd')]); + }, + }, + [ActionId.PipMaskVEnd]: { + name: 'UpStream Key:Set Pip Mask V End', + options: [ + { + type: 'number', + label: 'V End', + id: 'PipMaskVEnd', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipMaskVEnd, ReqType.Set, [getOptNumber(action, 'PipMaskVEnd')]); + }, + }, + [ActionId.PipBorderEnable]: { + name: 'UpStream Key:Set Pip Border Enable', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'KeyPatternResizeEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipBorderEnable, ReqType.Set, [getOptNumber(action, 'PipBorderEnable')]); + }, + }, + [ActionId.PipBorderWidth]: { + name: 'UpStream Key:Set Pip Border Width', + options: [ + { + type: 'number', + label: 'Width', + id: 'PipBorderWidth', + min: 0, + max: 31, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipBorderWidth, ReqType.Set, [getOptNumber(action, 'PipBorderWidth')]); + }, + }, + [ActionId.PipBorderHue]: { + name: 'UpStream Key:Set Pip Color Hue', + options: [ + { + type: 'number', + label: 'Hue', + id: 'PipBorderHue', + min: 0, + max: 359, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipBorderHue, ReqType.Set, [getOptNumber(action, 'PipBorderHue')]); + }, + }, + [ActionId.PipBorderSaturation]: { + name: 'UpStream Key:Set Pip Color Saturation', + options: [ + { + type: 'number', + label: 'Saturation', + id: 'PipBorderSaturation', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipBorderSaturation, ReqType.Set, [getOptNumber(action, 'PipBorderSaturation')]); + }, + }, + [ActionId.PipBorderBrightness]: { + name: 'UpStream Key:Set Pip Color Brightness', + options: [ + { + type: 'number', + label: 'Brightness', + id: 'PipBorderBrightness', + min: 0, + max: 100, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.PipBorderBrightness, ReqType.Set, [getOptNumber(action, 'PipBorderBrightness')]); + }, + }, + } + return actions; +} + +function AudioMixerActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.AudioFader]: { + name: 'Audio Mixer:Set Audio Fader', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'ASource', + choices: getChoices(ActionType.AudioFader), + default: 0, + }, + { + type: 'number', + label: 'Fader', + id: 'AudioFader', + min: -75.0, + max: 10.0, + step: 0.5, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioFader, ReqType.Set, [getOptNumber(action, 'ASource'), getOptNumber(action, 'AudioFader')]); + }, + }, + [ActionId.AudioBalance]: { + name: 'Audio Mixer:Set Audio Balance', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'ASource', + choices: AudioSourcesChoices, + default: 0, + }, + { + type: 'number', + label: 'Balance', + id: 'AudioBalance', + min: -40.0, + max: 40.0, + step: 0.5, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioFader, ReqType.Set, [getOptNumber(action, 'ASource'), getOptNumber(action, 'AudioBalance')]); + }, + }, + [ActionId.AudioInput]: { + name: 'Audio Mixer:Set Audio Input', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'ASource', + choices: AudioSourcesChoices, + default: 0, + }, + { + type: 'number', + label: 'Input', + id: 'AudioInput', + min: -75.0, + max: 6.0, + step: 0.5, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioFader, ReqType.Set, [getOptNumber(action, 'ASource'), getOptNumber(action, 'AudioInput')]); + }, + }, + [ActionId.AudioEnable]: { + name: 'Audio Mixer:Set Audio Input', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'ASource', + choices: AudioSourcesChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Enable', + id: 'AudioEnable', + choices: AudioSourcesEnableChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioEnable, ReqType.Set, [getOptNumber(action, 'ASource'), getOptNumber(action, 'AudioEnable')]); + }, + }, + [ActionId.AudioDelay]: { + name: 'Audio Mixer:Set Audio Delay', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'ASource', + choices: AudioMicChoices, + default: 0, + }, + { + type: 'number', + label: 'Delay', + id: 'AudioDelay', + min: 0, + max: 170, + step: 10, + range: true, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioDelay, ReqType.Set, [getOptNumber(action, 'ASource'), getOptNumber(action, 'AudioDelay')]); + }, + }, + [ActionId.AudioMonitorLevel]: { + name: 'Audio Mixer:Set Monitor Level', + options: [ + { + type: 'number', + label: 'Level', + id: 'AudioLevel', + min: -31, + max: 0, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioMonitorLevel, ReqType.Set, [getOptNumber(action, 'AudioLevel')]); + }, + }, + [ActionId.AudioMonitorSource]: { + name: 'Audio Mixer:Set Monitor Source', + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'AudioSource', + choices: getChoices(ActionType.AudioMonitorSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AudioMonitorSource, ReqType.Set, [getOptNumber(action, 'AudioSource')]); + }, + }, + } + return actions; +} + +function StillGeneratorActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + + } + return actions; +} +function MacroActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.MacroStartRecord]: { + name: 'Macro:Set Start Record', + options: [ + { + type: 'dropdown', + label: 'Macro', + id: 'MacroIndex', + choices: getChoicesByMacro(), + default: 0, + }, + { + type: 'textinput', + label: 'Name', + id: 'MacroName', + default: '', + required: true, + }, + { + type: 'textinput', + label: 'Remark', + id: 'MacroRemark', + default: '', + required: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroStartRecord, ReqType.Set, [getOptNumber(action, 'MacroIndex'), getOptString(action, 'MacroName'), getOptString(action, 'MacroRemark')]); + }, + }, + [ActionId.MacroStopRecord]: { + name: 'Macro:Set Stop Record', + options: [], + callback: async () => { + await sendCommand(_self, ActionId.MacroStopRecord, ReqType.Set); + }, + }, + [ActionId.MacroChangeDetail]: { + name: 'Macro:Change Detail', + options: [ + { + type: 'dropdown', + label: 'Macro', + id: 'MacroIndex', + choices: getChoicesByMacro(), + default: 0, + }, + { + type: 'textinput', + label: 'Name', + id: 'MacroName', + default: '', + required: true, + }, + { + type: 'textinput', + label: 'Remark', + id: 'MacroRemark', + default: '', + required: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroChangeDetail, ReqType.Set, [getOptNumber(action, 'MacroIndex'), getOptString(action, 'MacroName'), getOptString(action, 'MacroRemark')]); + }, + }, + + [ActionId.MacroDelete]: { + name: 'Macro:Delete Macro', + options: [ + { + type: 'dropdown', + label: 'Macro', + id: 'MacroIndex', + choices: getChoicesByMacro(), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroDelete, ReqType.Set, [getOptNumber(action, 'MacroIndex')]); + }, + }, + + [ActionId.MacroLocationSwap]: { + name: 'Macro:Location Swap', + options: [ + { + type: 'dropdown', + label: 'Src Location', + id: 'MacroIndex1', + choices: getChoicesByMacro(), + default: 0, + }, + { + type: 'dropdown', + label: 'Dst Location', + id: 'MacroIndex2', + choices: getChoicesByMacro(), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroLocationSwap, ReqType.Set, [getOptNumber(action, 'MacroIndex1'), getOptNumber(action, 'MacroIndex2')]); + }, + }, + + [ActionId.MacroStartRun]: { + name: 'Macro:Start Run', + options: [ + { + type: 'dropdown', + label: 'Src Location', + id: 'MacroIndex', + choices: getChoicesByMacro(), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroStartRun, ReqType.Set, [getOptNumber(action, 'MacroIndex')]); + }, + }, + + [ActionId.MacroStopRun]: { + name: 'Macro:Stop Run', + options: [], + callback: async () => { + await sendCommand(_self, ActionId.MacroStopRun, ReqType.Set); + }, + }, + [ActionId.MacroLoop]: { + name: 'Macro:Loop', + options: [ + { + type: 'dropdown', + label: 'Enable', + id: 'MacroLoopEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MacroStopRun, ReqType.Set, [getOptNumber(action, 'MacroLoopEnable')]); + }, + }, + } + return actions; +} +function StreamingActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.StreamOutput]: { + name: 'Streaming:Set Output', + options: [ + { + type: 'dropdown', + label: 'Stream', + id: 'StreamID', + choices: StreamingChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Output', + id: 'Output', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.StreamOutput, ReqType.Set, [getOptNumber(action, 'StreamID'), getOptNumber(action, 'Output')]); + }, + }, + [ActionId.StreamUrl]: { + name: 'Streaming:Set Stream Url', + options: [ + { + type: 'dropdown', + label: 'Stream', + id: 'StreamID', + choices: StreamingChoices, + default: 0, + }, + { + type: 'textinput', + label: 'Url', + id: 'StreamUrl', + default: '', + required: true, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.StreamOutput, ReqType.Set, [getOptNumber(action, 'StreamID'), getOptString(action, 'StreamUrl')]); + }, + }, + } + return actions; +} + +function SettingsActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.SrcName]: { + name: 'Settings:Set SrcName', + options: [ + { + type: 'dropdown', + label: 'Src', + id: 'SrcID', + choices: SettingsUMDSrcChoices, + default: 0, + }, + { + type: 'textinput', + label: 'Src Name', + id: 'SrcName', + required: true, + default: '', + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SrcName, ReqType.Set, [getOptNumber(action, 'SrcID'), getOptString(action, 'SrcName')]); + }, + }, + [ActionId.MvMeter]: { + name: 'Settings:Set Mv Meter', + options: [ + { + type: 'dropdown', + label: 'Src', + id: 'SrcID', + choices: SettingsMvMeterChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Mv Meter Enable', + id: 'MvMeterEnable', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SrcName, ReqType.Set, [getOptNumber(action, 'SrcID'), getOptNumber(action, 'MvMeterEnable')]); + }, + }, + [ActionId.MvLayout]: { + name: 'Settings:Set Mv Layout', + options: [ + { + type: 'dropdown', + label: 'Layout', + id: 'MvLayout', + choices: SettingsMvLayoutChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MvLayout, ReqType.Set, [getOptNumber(action, 'MvLayout')]); + }, + }, + [ActionId.Marker]: { + name: 'Settings:Set Marker', + options: [ + { + type: 'dropdown', + label: 'marker', + id: 'Marker', + choices: SwitchChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.Marker, ReqType.Set, [getOptNumber(action, 'Marker')]); + }, + }, + [ActionId.MicInput]: { + name: 'Settings:Mic Input', + options: [ + { + type: 'dropdown', + label: 'mic', + id: 'micid', + choices: AudioMicChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Mic Input', + id: 'MicInput', + choices: SettingsMicInputChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.MicInput, ReqType.Set, [getOptNumber(action, 'micid'), getOptNumber(action, 'MicInput')]); + }, + }, + [ActionId.RecordFileName]: { + name: 'Settings:Record FileName', + options: [ + { + type: 'textinput', + label: 'FileName', + id: 'RecordFileName', + required: true, + default: '', + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.RecordFileName, ReqType.Set, [getOptString(action, 'RecordFileName')]); + }, + }, + [ActionId.SrcSelection]: { + name: 'Settings:Src Selection', + options: [ + { + type: 'dropdown', + label: 'Src', + id: 'Srcid', + choices: SourcesToChoices(SourceModels), + default: 0, + }, + { + type: 'dropdown', + label: 'Selection', + id: 'SrcSelection', + choices: SettingsColorChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.SrcSelection, ReqType.Set, [getOptNumber(action, 'Srcid'), getOptNumber(action, 'SrcSelection')]); + }, + }, + [ActionId.AuxSource]: { + name: 'Settings:Aux Source', + options: [ + { + type: 'dropdown', + label: 'Aux Source', + id: 'auxSourceID', + choices: SettingsAuxSourceChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.AuxSource, ReqType.Set, [getOptNumber(action, 'auxSourceID')]); + }, + }, + [ActionId.OutFormat]: { + name: 'Settings:OutFormat', + options: [ + { + type: 'dropdown', + label: 'OutFormat', + id: 'OutFormat', + choices: SettingsOutFormatChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.OutFormat, ReqType.Set, [getOptNumber(action, 'OutFormat')]); + }, + }, + [ActionId.OutputColorSpace]: { + name: 'Settings:Output ColorSpace', + options: [ + { + type: 'dropdown', + label: 'Out', + id: 'OutId', + choices: [ + { id: '0', label: 'out1' }, + { id: '1', label: 'out2' } + ], + default: 0, + }, + { + type: 'dropdown', + label: 'ColorSpace', + id: 'OutputColorSpace', + choices: SettingsColorChoices, + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.OutputColorSpace, ReqType.Set, [getOptNumber(action, 'OutId'), getOptNumber(action, 'OutputColorSpace')]); + }, + }, + [ActionId.OutSource]: { + name: 'Settings:Out Source', + options: [ + { + type: 'dropdown', + label: 'Out', + id: 'OutId', + choices: SettingsOutSourceParamChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'OutSource', + id: 'OutSource', + choices: getChoices(ActionType.SettingsoutSource), + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.OutSource, ReqType.Set, [getOptNumber(action, 'OutId'), getOptNumber(action, 'OutSource')]); + }, + }, + [ActionId.Quality]: { + name: 'Settings:Quality', + options: [ + { + type: 'dropdown', + label: 'Type', + id: 'TypeID', + choices: [ + { id: '0', label: 'recording' }, + { id: '1', label: 'streaming' } + ], + default: 0, + }, + { + type: 'dropdown', + label: 'Quality', + id: 'Quality', + choices: [ + { id: '0', label: 'hight' }, + { id: '1', label: 'mid' }, + { id: '2', label: 'low' } + ], + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.Quality, ReqType.Set, [getOptNumber(action, 'TypeID'), getOptNumber(action, 'Quality')]); + }, + } + } + return actions; +} + +function RecordActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.Record]: { + name: 'Record:Set Start or Stop Record', + options: [ + { + type: 'dropdown', + label: 'Record', + id: 'Record', + choices: [ + { id: '0', label: 'Stop' }, + { id: '1', label: 'Start' }, + ], + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.Record, ReqType.Set, [getOptNumber(action, 'Record')]); + }, + }, + + } + return actions; +} + +function LiveActions(_self: GoSteamDeckInstance): CompanionActionDefinitions { + const actions: { [id: string]: CompanionActionDefinition | undefined } = { + [ActionId.Live]: { + name: 'Live:Set Start or Stop Live', + options: [ + { + type: 'dropdown', + label: 'Live Enable', + id: 'LiveEnable', + choices: [ + { id: '0', label: 'Stop' }, + { id: '1', label: 'Start' }, + ], + default: 0, + }, + ], + callback: async (action) => { + await sendCommand(_self, ActionId.Live, ReqType.Set, [getOptNumber(action, 'LiveEnable')]); + }, + }, + } + return actions; +} + + + +function getOptNumber(action: CompanionActionEvent, key: string, defVal?: number): number { + const rawVal = action.options[key] + if (defVal !== undefined && rawVal === undefined) return defVal + const val = Number(rawVal) + if (isNaN(val)) { + throw new Error(`Invalid option '${key}'`) + } + return val +} + +function getOptString(action: CompanionActionEvent, key: string, defVal?: string): string { + const rawVal = action.options[key] + if (defVal !== undefined && rawVal === undefined) return defVal + const val = String(rawVal) + if (typeof (rawVal) !== 'string') { + throw new Error(`Invalid option '${key}'`) + } + return val +} diff --git a/src/choices.ts b/src/choices.ts new file mode 100644 index 0000000..e2f4dc5 --- /dev/null +++ b/src/choices.ts @@ -0,0 +1,86 @@ +import { DropdownChoice } from '@companion-module/base' +import { + SourceModels, + OtherSourceModels, + OtherDipSourceModels, + OtherDSKSourceModels, + AudioSourcesChoices, + OtherAudioSourcesChoices, + AudioSourcesEnableChoices, + OtherAudioSourcesEnableChoices, + SettingsOutSourceChoices, +} from './model' +import { ActionType } from './enums' +import { InputChannel } from './state'; + +export function getChoices(type: ActionType): DropdownChoice[] { + switch (type) { + default: + case ActionType.Program: + case ActionType.Preview: + let sources = SourceModels; + let others = OtherSourceModels; + let f_sources = sources.concat(others); + return SourcesToChoices(f_sources); + case ActionType.TransitionDipSource: + case ActionType.TransitionWipeFillSource: + let sources1 = SourceModels; + let others1 = OtherDipSourceModels; + let dip_sources = sources1.concat(others1); + return SourcesToChoices(dip_sources); + case ActionType.DskSourceFill: + case ActionType.SuperSourceSource: + case ActionType.LumaKeySourceKey: + case ActionType.ChromaKeySourceKey: + case ActionType.KeyPatternSourceKey: + case ActionType.PipSource: + let sources2 = SourceModels; + let others2 = OtherDSKSourceModels; + let dsk_sources = sources2.concat(others2); + return SourcesToChoices(dsk_sources); + case ActionType.AudioFader: + case ActionType.AudioMonitorSource: + let a_sources = AudioSourcesChoices; + let o_sources = OtherAudioSourcesChoices; + let audio_sources = a_sources.concat(o_sources); + return audio_sources; + case ActionType.SettingsoutSource: + let i_sources = SourcesToChoices(SourceModels); + let src_source = i_sources.concat(SettingsOutSourceChoices) + return src_source; + } +} + +export function getChoicesByAudioSourceType(value: Number): DropdownChoice[] { + let sources = AudioSourcesEnableChoices; + switch (value) { + case 0: + case 1: + return sources; + case 2: + case 3: + case 4: + case 5: + case 6: + let o_sources = OtherAudioSourcesEnableChoices; + let e_sources = sources.concat(o_sources); + return e_sources; + default: + return AudioSourcesEnableChoices; + } +} + +export function getChoicesByMacro(): DropdownChoice[] { + let Source: DropdownChoice[] = []; + for (var i = 0; i < 100; i++) { + Source.push({ id: i.toString(), label: 'Macro' + (i + 1).toString() }) + } + return Source; +} + +export function SourcesToChoices(sources: InputChannel[]): DropdownChoice[] { + return sources.map((s) => ({ + id: s.inputId, + label: s.longName, + })) +} \ No newline at end of file diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..76b127b --- /dev/null +++ b/src/config.ts @@ -0,0 +1,62 @@ +import { SomeCompanionConfigField, Regex } from '@companion-module/base' + +export interface GoSteamDeckConfig { + host: string + port: number + reconnect: boolean + reconnectInterval: number +} + +export const portDefault = 19010 + +export function GetConfigFields(): SomeCompanionConfigField[] { + return [ + { + label: 'Information', + id: 'info', + type: 'static-text', + value: 'This module controls GoSteamDeck over IP protocol', + width: 12, + }, + { + label: 'GoSteamDeck target IP', + id: 'host', + type: 'textinput', + default: '192.168.1.80', + width: 6, + required: true, + regex:Regex.IP, + tooltip: 'GoSteamDeck address', + }, + { + label: 'GoSteamDeck target port ', + id: 'port', + type: 'number', + default: portDefault, + width: 6, + min: 1, + max: 0xffff, + step: 1, + tooltip: 'Usually 19010 by default', + }, + { + label: 'Reconnect', + id: 'reconnect', + type: 'checkbox', + default: true, + width: 4, + tooltip: 'Chose if you want Companion to try to reconnect to GoSteamDeck when the connection is lost.', + }, + { + label: 'Reconnect interval (seconds)', + id: 'reconnectInterval', + type: 'number', + min: 1, + max: 60, + default: 5, + width: 4, + isVisible: (config) => config.reconnect === true, + tooltip: 'The interval in seconds between each reconnect attempt.', + }, + ] +} diff --git a/src/connection.ts b/src/connection.ts new file mode 100644 index 0000000..c4f7569 --- /dev/null +++ b/src/connection.ts @@ -0,0 +1,115 @@ +import { InstanceStatus, TCPHelper, TCPHelperOptions } from '@companion-module/base' +import { GoSteamDeckInstance } from '.' +import { portDefault } from './config'; +import { ActionId, ActionType, ReqType } from './enums'; +import { getChoices } from './choices'; + +let tcp: TCPHelper | null = null; + +export function connect(self: GoSteamDeckInstance): void { + if (tcp !== null) { + tcp.destroy(); + } + + self.updateStatus(InstanceStatus.Connecting) + + let host = self.config.host + const port = self.config.port + + var option: TCPHelperOptions = { + reconnect_interval: self.config.reconnectInterval, + reconnect: self.config.reconnect, + }; + tcp = new TCPHelper(host, port || portDefault, option) + tcp.on('status_change', (state, message) => { + self.updateStatus(state, message) + self.log('debug', 'Socket reconnected') + }) + + tcp.on('connect', () => { + self.updateStatus(InstanceStatus.Ok) + self.log('debug', 'Socket connected') + }) + + tcp.on('error', () => { + self.updateStatus(InstanceStatus.ConnectionFailure, 'Connection error') + self.log('debug', 'Socket connect error') + }) + tcp.on('end', () => { + self.updateStatus(InstanceStatus.Disconnected, 'Disconnecting') + self.log('debug', 'Socket Disconnecting') + }) + tcp.on('data', (msg) => { + let jsonStr = msg.toString("utf8"); + var json = JSON.parse(jsonStr); + if (json.result === "0" && json.data !== "" && json.data !== null && json.data.type === ReqType.Get) { + switch (json.data.id) { + case ActionId.PvwIndex: + var select = getChoices(ActionType.Preview).find(s => s.id === json.data.value[0]); + self.states.selectPrevInput = select; + break; + case ActionId.PgmIndex: + var select = getChoices(ActionType.Program).find(s => s.id === json.data.value[0]); + self.states.selectPgmInput = select; + break; + case ActionId.TransitionSource: + let intstate=Number(json.data.value[0]); + if((intstate&1)===1){ + self.states.TKeyeState.M_Key=true; + } + if(((intstate>>1)&1)===1){ + self.states.TKeyeState.DSK=true; + } + if(((intstate>>2)&1)===1){ + self.states.TKeyeState.BKGD=true; + } + break; + case ActionId.DskOnAir: + if(json.data.value[0]=='1'){ + self.states.dskOnAir=true; + } + break; + case ActionId.KeyOnAir: + if(json.data.value[0]=='1'){ + self.states.keyOnAir=true; + } + break; + } + } + else if (json.result === "0") { + + } + else { + self.log('error',json.error_info); + } + }) + ReqStateData(self) +} + +export function ReqStateData(self: GoSteamDeckInstance): void { + sendCommand(self, ActionId.PgmIndex, ReqType.Get) + sendCommand(self, ActionId.PvwIndex, ReqType.Get) + sendCommand(self, ActionId.FTB, ReqType.Get) + sendCommand(self, ActionId.TransitionIndex, ReqType.Get) + + sendCommand(self, ActionId.TransitionSource, ReqType.Get) + sendCommand(self, ActionId.DskOnAir, ReqType.Get) + sendCommand(self, ActionId.KeyOnAir, ReqType.Get) +} + +export function disconnectSocket(): void { + if (tcp !== null) { + tcp.destroy(); + } +} + +export async function sendCommand(self: GoSteamDeckInstance, id: string, type?: string, value?: Array): Promise { + if (tcp !== null) { + let obj = { id: id, type: type, value: value }; + let json = JSON.stringify(obj); + self.log('debug', json); + let bufs = Buffer.from(json, "utf-8"); + return await tcp.send(bufs); + } + return false; +} diff --git a/src/enums.ts b/src/enums.ts new file mode 100644 index 0000000..0c4f2a2 --- /dev/null +++ b/src/enums.ts @@ -0,0 +1,279 @@ +export enum ActionId { + PgmIndex = 'pgmIndex', + PvwIndex = 'pvwIndex', + //Transition + CutTransition = 'cutTransition', + AutoTransition = 'autoTransition', + FTB = 'ftb', + FtbAudioAFV = 'ftbAudioAFV', + FtbRate = 'ftbRate', + Prev = 'prev', + TransitionIndex = 'transitionIndex', + TransitionRate = 'transitionRate', + TransitionDipSource = 'transitionDipSource', + //TransitionWipePattern='transitionWipePattern', + TransitionWipeXPosition = 'transitionWipeXPosition', + TransitionWipeYPosition = 'transitionWipeYPosition', + TransitionWipeDirection = 'transitionWipeDirection', + TransitionWipeSymmetry = 'transitionWipeSymmetry', + TransitionWipeSoftness = 'transitionWipeSoftness', + TransitionWipeBorder = 'transitionWipeBorder', + TransitionWipeFillSource = 'transitionWipeFillSource', + TransitionPosition = 'transitionPosition', + + //DSK + TransitionSource = 'transitionSource', + KeyOnAir = 'keyOnAir', + DskOnAir = 'dskOnAir', + + DskSourceFill = 'dskSourceFill', + DskSourceKey = 'dskSourceKey', + + DskMaskEnable = 'dskMaskEnable', + DskMaskHStart = 'dskMaskHStart', + DskMaskVStart = 'dskMaskVStart', + DskMaskHEnd = 'dskMaskHEnd', + DskMaskVEnd = 'dskMaskVEnd', + + DskControlShapedKey = 'dskControlShapedKey', + DskControlClip = 'dskControlClip', + DskControlGain = 'dskControlGain', + DskControlInvert = 'dskControlInvert', + DskRate = 'dskRate', + + ColorHue = 'colorHue', + ColorSaturation = 'colorSaturation', + ColorBrightness = 'colorBrightness', + + //Super Source + SuperSourceEnable = 'superSourceEnable', + SuperSourceSource1 = 'superSourceSource1', + SuperSourceSource2 = 'superSourceSource2', + SuperSourceBackground = 'superSourceBackground', + SuperSourceControlStyle = 'superSourceControlStyle', + SuperSourceControlYPosition = 'superSourceControlYPosition', + SuperSourceMaskEnable = 'superSourceMaskEnable', + SuperSourceMaskHStart = 'superSourceMaskHStart', + SuperSourceMaskVStart = 'superSourceMaskVStart', + SuperSourceMaskHEnd = 'superSourceMaskHEnd', + SuperSourceMaskVEnd = 'superSourceMaskVEnd', + SuperSourceBorderWidth = 'superSourceBorderWidth', + SuperSourceBorderHue = 'superSourceBorderHue', + SuperSourceBorderSaturation = 'superSourceBorderSaturation', + SuperSourceBorderBrightness = 'superSourceBorderBrightness', + + //UpStream Key + UpStreamKeyType='upStreamKeyType', + LumaKeySourceFill='lumaKeySourceFill', + LumaKeySourceKey='lumaKeySourceKey', + LumaKeyMaskEnable='lumaKeyMaskEnable', + LumaKeyMaskHStart='lumaKeyMaskHStart', + LumaKeyMaskVStart='lumaKeyMaskVStart', + LumaKeyMaskHEnd='lumaKeyMaskHEnd', + LumaKeyMaskVEnd='lumaKeyMaskVEnd', + LumaKeyControlShapedKey='lumaKeyControlShapedKey', + LumaKeyControlClip='lumaKeyControlClip', + LumaKeyControlGain='lumaKeyControlGain', + LumaKeyControlInvert='lumaKeyControlInvert', + LumaKeyResizeEnable='lumaKeyResizeEnable', + LumaKeyResizeSize='lumaKeyResizeSize', + LumaKeyResizeXPosition='lumaKeyResizeXPosition', + LumaKeyResizeYPosition='lumaKeyResizeYPosition', + ChromaKeyFill='chromaKeyFill', + ChromaKeyMaskEnable='chromaKeyMaskEnable', + ChromaKeyMaskHStart='chromaKeyMaskHStart', + ChromaKeyMaskVStart='chromaKeyMaskVStart', + ChromaKeyMaskHEnd='chromaKeyMaskHEnd', + ChromaKeyMaskVEnd='chromaKeyMaskVEnd', + ChromaKeyResizeEnable='chromaKeyResizeEnable', + ChromaKeyResizeSize='chromaKeyResizeSize', + ChromaKeyResizeXPosition='chromaKeyResizeXPosition', + ChromaKeyResizeYPosition='chromaKeyResizeYPosition', + ChromaKeyControlSMPXPosition='chromaKeyControlSMPXPosition', + ChromaKeyControlSMPYPosition='chromaKeyControlSMPYPosition', + ChromaKeyControlSample='chromaKeyControlSample', + ChromaKeyControlColor='chromaKeyControlColor', + ChromaKeyControlForeground='chromaKeyControlForeground', + ChromaKeyControlBackground='chromaKeyControlBackground', + ChromaKeyControlKeyEdge='chromaKeyControlKeyEdge', + KeyPatternSourceFill='keyPatternSourceFill', + KeyPatternWipePattern='keyPatternWipePattern', + KeyPatternWipeSize='keyPatternWipeSize', + KeyPatternWipeXPosition='keyPatternWipeXPosition', + KeyPatternWipeYPosition='keyPatternWipeYPosition', + KeyPatternWipeSymmetry='keyPatternWipeSymmetry', + KeyPatternWipeSoftness='keyPatternWipeSoftness', + KeyPatternMaskEnable='keyPatternMaskEnable', + KeyPatternMaskHStart='keyPatternMaskHStart', + KeyPatternMaskVStart='keyPatternMaskVStart', + KeyPatternMaskHEnd='keyPatternMaskHEnd', + KeyPatternMaskVEnd='keyPatternMaskVEnd', + KeyPatternResizeEnable='keyPatternResizeEnable', + KeyPatternResizeSize='keyPatternResizeSize', + KeyPatternResizeXPosition='keyPatternResizeXPosition', + KeyPatternResizeYPosition='keyPatternResizeYPosition', + PipSource='pipSource', + PipSize='pipSize', + PipXPosition='pipXPosition', + PipYPosition='pipYPosition', + PipMaskEnable='pipMaskEnable', + PipMaskHStart='pipMaskHStart', + PipMaskVStart='pipMaskVStart', + PipMaskHEnd='pipMaskHEnd', + PipMaskVEnd='pipMaskVEnd', + PipBorderEnable='pipBorderEnable', + PipBorderWidth='pipBorderWidth', + PipBorderHue='pipBorderHue', + PipBorderSaturation='pipBorderSaturation', + PipBorderBrightness='pipBorderBrightness', + + //Audio Mixer + AudioFader='audioFader', + AudioBalance='audioBalance', + AudioInput='audioInput', + AudioEnable='audioEnable', + AudioDelay='audioDelay', + AudioMonitorLevel='audioMonitorLevel', + AudioMonitorSource='audioMonitorSource', + + //Still Generator + StillSelection='stillSelection', + StillRemove='stillRemove', + StillLoadIndex='stillLoadIndex', + StillLoadImage='stillLoadImage', + + //Macro + MacroStartRecord='macroStartRecord', + MacroStopRecord='macroStopRecord', + MacroChangeDetail='macroChangeDetail', + MacroDelete='macroDelete', + MacroLocationSwap='macroLocationSwap', + MacroStartRun='macroStartRun', + MacroStopRun='macroStopRun', + MacroLoop='macroLoop', + + //Streaming + StreamOutput='streamOutput', + StreamPlatform='streamPlatform', + StreamServer='streamServer', + StreamUrl='streamUrl', + + //Settings + SrcName='srcName', + MvMeter='mvMeter', + MvLayout='mvLayout', + Marker='marker', + MicInput='micInput', + RecordFileName='recordFileName', + SrcSelection='srcSelection', + AuxSource='auxSource', + OutFormat='outFormat', + OutputColorSpace='outputColorSpace', + OutSource='outSource', + NetworkProtocol='networkProtocol', + NetworkIpAddress='networkIpAddress', + NetworkSubnetMask='networkSubnetMask', + NetworkGateway='networkGateway', + NetworkPrimaryDNS='networkPrimaryDNS', + NetworkSecondaryDNS='networkSecondaryDNS', + Quality='quality', + Panel='panel', + SdFormat='sdFormat', + SystemReset='systemReset', + + Record='record', + RecordStatus='recordStatus', + RecordTime='recordTime', + SdCardStatus='sdCardStatus', + SdFree='sdFree', + Live='live', + LiveStatus='liveStatus', + LiveInfo='liveInfo', +} + +export enum ReqType { + Get = "get", + Set = "set", +} + +export enum ActionType { + Unknown = 0, + Heart = 1, + Program = 2, + Preview = 3, + TransitionStyle = 4, + TransitionDipSource = '5', + TransitionWipeFillSource = '6', + DskSourceFill = '7', + SuperSourceSource = '8', + LumaKeySourceKey = '9', + ChromaKeySourceKey = '10', + KeyPatternSourceKey = '11', + PipSource='12', + AudioFader='13', + AudioMonitorSource='14', + SettingsoutSource='15', +} + +export enum feedbackId { + PreviewBG = 'preview_bg', + PreviewBG2 = 'preview_bg_2', + PreviewBG3 = 'preview_bg_3', + PreviewBG4 = 'preview_bg_4', + ProgramBG = 'program_bg', + ProgramBG2 = 'program_bg_2', + ProgramBG3 = 'program_bg_3', + ProgramBG4 = 'program_bg_4', + TransitionStyle = 'TransitionStyle', + InTransition = 'inTransition', + TransitionRate='transitionRate', + TransitionKeySwitch = 'transitionKeySwitch', + KeyOnAir = 'keyOnAir', + DskOnAir = 'dskOnAir', + SettingOutSource='settingOutSource', + Macro='macro', + FadeToBlackIsBlack='fadeToBlackIsBlack', + FadeToBlackRate='fadeToBlackRate', + AuxBG='auxBG', + UpStreamKeyType='upStreamKeyType', + KeySourceFill='keySourceFill', +} + +export enum variableId { + PlayState = 'playState', + Clock = 'clock', + TimerStart = 'timer_start', + TimerFinish = 'timer_finish', + TimerDelay = 'timer_delay', + Time = 'time', + TimeHM = 'time_hm', + TimeH = 'time_h', + TimeM = 'time_m', + TimeS = 'time_s', + TitleNow = 'titleNow', + SubtitleNow = 'subtitleNow', + SpeakerNow = 'speakerNow', + NoteNow = 'noteNow', + TitleNext = 'titleNext', + SubtitleNext = 'subtitleNext', + SpeakerNext = 'speakerNext', + NoteNext = 'noteNext', + OnAir = 'onAir', + SpeakerMessage = 'speakerMessage', + PublicMessage = 'publicMessage', + LowerMessage = 'lowerMessage', +} + +export enum SourceType { + Input1 = '0', + Input2 = '1', + Input3 = '2', + Input4 = '3', + Aux = '4', +} + +export enum TransitionStyle { + MIX = '0', + DIP = '1', + WIPE = '2', +} diff --git a/src/feedback.ts b/src/feedback.ts new file mode 100644 index 0000000..3fd4ed7 --- /dev/null +++ b/src/feedback.ts @@ -0,0 +1,509 @@ +import { CompanionFeedbackDefinition, CompanionFeedbackDefinitions, combineRgb } from '@companion-module/base' +import { GoSteamDeckInstance } from './index' +import { ActionType, SourceType, TransitionStyle, feedbackId } from './enums' +import { getChoices, getChoicesByMacro } from './choices' +import { KeySwitchChoices, SettingsAuxSourceChoices, SettingsOutSourceParamChoices, SwitchChoices, TransitionStyleChoice, UpStreamKeyTypeChoices } from './model' + +export function feedbacks(self: GoSteamDeckInstance): CompanionFeedbackDefinitions { + const feedbacks: { [id: string]: CompanionFeedbackDefinition | undefined } = {} + + feedbacks[feedbackId.PreviewBG] = { + type: 'boolean', + name: 'preview source', + description: 'If the input specified is selected in preview, change style of the bank', + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(0, 255, 0), + }, + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'Source', + default: SourceType.Input1, + choices: getChoices(ActionType.Preview), + } + ], + callback: (_feedback) => { + if (self.states.selectPrevInput?.id === _feedback.options.Source) { + return true + } else { + return false + } + }, + }, + feedbacks[feedbackId.ProgramBG] = { + type: 'boolean', + name: 'program source', + description: 'If the input specified is selected in program, change style of the bank', + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(0, 255, 0), + }, + options: [ + { + type: 'dropdown', + label: 'Source', + id: 'Source', + default: SourceType.Input1, + choices: getChoices(ActionType.Program), + } + ], + callback: (_feedback) => { + if (self.states.selectPgmInput?.id === _feedback.options.Source) { + return true + } else { + return false + } + }, + }, + feedbacks[feedbackId.InTransition] = { + type: 'boolean', + name: 'Transition: Active/Running', + description: 'If the specified transition is active, change style of the bank', + options: [], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + return true; + }, + }, + feedbacks[feedbackId.TransitionRate] = { + type: 'boolean', + name: 'Transition: Rate', + description: 'If the specified transition rate is active, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'Transition Style', + id: 'TransitionStyle', + default: TransitionStyle.MIX, + choices: TransitionStyleChoice, + }, + { + type: 'number', + label: 'Transition Rate', + id: 'TransitionRate', + default: 2, + min: 0.5, + max: 8.0, + step: 0.5, + range: true, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + const me = self.states.selectTransitionStyle; + if (me?.style.id === _feedback.options.TransitionStyle) { + const style = Number(_feedback.options.TransitionStyle); + const rate = Number(_feedback.options.TransitionRate); + switch (style) { + case 0: + return me?.mixrate === rate + case 1: + return me?.diprate === rate + case 2: + return me?.wiperate === rate + default: + return false; + break + } + } + return false + }, + learn: (_feedback) => { + const me = self.states.selectTransitionStyle; + if (me?.style === _feedback.options.TransitionStyle) { + const style = Number(_feedback.options.TransitionStyle); + switch (style) { + case 0: + return { + ..._feedback.options, + TransitionRate: me?.mixrate, + } + case 1: + return { + ..._feedback.options, + TransitionRate: me?.diprate, + } + case 2: + return { + ..._feedback.options, + TransitionRate: me?.wiperate, + } + default: + return undefined + } + } else { + return undefined + } + }, + } + feedbacks[feedbackId.TransitionStyle] = { + type: 'boolean', + name: 'Transition: Style', + description: 'If the specified transition style is active, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'TransitionStyle', + id: 'TransitionStyle', + default: TransitionStyle.MIX, + choices: TransitionStyleChoice, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + if (self.states.selectTransitionStyle?.style.id === _feedback.options.TransitionStyle) { + return true + } else { + return false + } + }, + }, + feedbacks[feedbackId.TransitionKeySwitch] = { + type: 'boolean', + name: 'Next Transition:Key Switch', + description: 'Set the special effect Transition key switch', + options: [ + { + type: 'multidropdown', + label: 'Switch', + id: 'KeySwitch', + choices: KeySwitchChoices, + minSelection: 1, + default: ["2"], + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + let seleOptions = _feedback.options.KeySwitch; + if (seleOptions && Array.isArray(seleOptions)) { + let arratOptions = Array.from(seleOptions); + if (arratOptions.includes('0') && self.states.TKeyeState.M_Key) { + return true; + } + if (arratOptions.includes('1') && self.states.TKeyeState.DSK) { + return true; + } + if (arratOptions.includes('2') && self.states.TKeyeState.BKGD) { + return true; + } + return false; + } + else + return false; + }, + }, + feedbacks[feedbackId.DskOnAir] = { + type: 'boolean', + name: 'Next Transition:DSK OnAir', + description: 'Set the special effect Transition DSK OnAir', + options: [ + { + type: 'dropdown', + label: 'DSK OnAir', + id: 'DSKOnAir', + choices: SwitchChoices, + default: 0, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + if (self.states.dskOnAir && _feedback.options.DSKOnAir === '1') { + return true + } else { + return false + } + } + + }, + feedbacks[feedbackId.KeyOnAir] = { + type: 'boolean', + name: 'Next Transition:Key OnAir Switch', + description: 'Set the special effect Transition key switch', + options: [ + { + type: 'dropdown', + label: 'Key OnAir', + id: 'KeyOnAir', + choices: SwitchChoices, + default: 0, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + if (self.states.keyOnAir && _feedback.options.KeyOnAir === '1') { + return true + } else { + return false + } + } + } + + feedbacks[feedbackId.UpStreamKeyType]={ + type: 'boolean', + name: 'UpStreamKey:UpStream Key Type', + description: 'Set the special effect UpStream Key Type', + options: [ + { + type: 'dropdown', + label: 'Key Type:', + id: 'USKType', + choices: UpStreamKeyTypeChoices, + default: 0, + }, + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + return self.states.upStreamKeyType===_feedback.options.USKType; + } + } + + feedbacks[feedbackId.KeySourceFill]={ + type: 'boolean', + name: 'UpStreamKey:UpStream Key Source Fill', + description: 'Set the special effect UpStream Key Source Fill', + options: [ + { + type: 'dropdown', + label: 'Key Type:', + id: 'USKKeyType', + choices: UpStreamKeyTypeChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'Source Fill:', + id: 'USKSourceFill', + choices: getChoices(ActionType.KeyPatternSourceKey), + default: 0, + }, + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + let typeId=Number(_feedback.options.USKKeyType); + return self.states.arrayKeySourceFill[typeId]===Number(_feedback.options.USKSourceFill); + } + } + + feedbacks[feedbackId.SettingOutSource] = + { + type: 'boolean', + name: 'Aux/Output: Source', + description: 'If the input specified is selected in the aux bus specified, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'Out', + id: 'OutId', + choices: SettingsOutSourceParamChoices, + default: 0, + }, + { + type: 'dropdown', + label: 'OutSource', + id: 'OutSource', + choices: getChoices(ActionType.SettingsoutSource), + default: 0, + }, + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + var outSources = self.states.OutPutInfos; + for (const source of outSources) { + if (source.OutPutType === Number(_feedback.options.OutId)) { + return source.OutPutSource?.id === Number(_feedback.options.OutSource) + } + } + return false; + }, + learn: (_feedback) => { + var outSources = self.states.OutPutInfos; + + if (outSources !== undefined) { + for (const source of outSources) { + if (source.OutPutType === Number(_feedback.options.OutId)) { + return { + ..._feedback.options, + OutId: source.OutPutType, + OutSource: source.OutPutSource?.id, + } + } + } + return undefined + + } else { + return undefined + } + }, + } + + feedbacks[feedbackId.Macro]={ + type: 'boolean', + name: 'Macro: State', + description: 'If the specified macro is running, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'Macro Number (1-100)', + id: 'MacroIndex', + default: 1, + choices: getChoicesByMacro(), + } + ], + defaultStyle: { + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(238, 238, 0), + }, + callback: (_feedback): boolean => { + let macroIndex = Number(_feedback.options.MacroIndex) + if (!isNaN(macroIndex)) { + macroIndex -= 1 + } + return false + }, + } + + feedbacks[feedbackId.FadeToBlackRate]={ + type: 'boolean', + name: 'Fade to black: Rate', + description: 'If the specified fade to black rate matches, change style of the bank', + options: [ + { + type: 'number', + label: 'FTB Rate', + id: 'FtbRate', + default: 2, + min: 0.5, + max: 8.0, + range: true, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + const rate = Number(_feedback.options.rate) + return self.states.fadeToBlack?.rate === rate + }, + learn: (feedback) => { + if (self.states.fadeToBlack) { + return { + ...feedback.options, + FtbRate: self.states.fadeToBlack?.rate, + } + } else { + return undefined + } + }, + } + + feedbacks[feedbackId.FadeToBlackIsBlack]={ + type: 'boolean', + name: 'Fade to black: Active', + description: 'If the specified fade to black is active, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'State', + id: 'state', + default: 'on', + choices: [ + { + id: 'on', + label: 'On', + }, + { + id: 'off', + label: 'Off', + }, + { + id: 'fading', + label: 'Fading', + }, + ], + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + if (self.states.fadeToBlack) { + switch (_feedback.options.state) { + case 'off': + return !self.states.fadeToBlack.isFullyBlack && !self.states.fadeToBlack.inTransition + case 'fading': + return self.states.fadeToBlack.inTransition + default: + // on + return !self.states.fadeToBlack.inTransition && self.states.fadeToBlack.isFullyBlack + } + } + return false + }, + } + + feedbacks[feedbackId.AuxBG]={ + type: 'boolean', + name: 'Aux: Source', + description: 'If the input specified is selected in the aux bus specified, change style of the bank', + options: [ + { + type: 'dropdown', + label: 'Aux Source', + id: 'auxSourceID', + choices: SettingsAuxSourceChoices, + default: 0, + } + ], + defaultStyle: { + color: combineRgb(0, 0, 0), + bgcolor: combineRgb(255, 255, 0), + }, + callback: (_feedback): boolean => { + return self.states.auxSource===Number(_feedback.options.aux); + }, + learn: (feedback) => { + const auxSource = self.states.auxSource; + + if (auxSource !== undefined) { + return { + ...feedback.options, + auxSourceID: auxSource, + } + } else { + return undefined + } + }, + } + return feedbacks +} diff --git a/src/icons.ts b/src/icons.ts new file mode 100644 index 0000000..ea7db6a --- /dev/null +++ b/src/icons.ts @@ -0,0 +1,22 @@ +export const PlaybackPause = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACbSURBVHgB7dhBDcMwEETRdQk0EAIhEAIhUAuhEAIhEFIE7p6t2tJUU/WQ/y6WNqv4nx0B4FpKiGqtax5zMz5LKY/O/pbH1Iz33N/jV/LSqfatH/a3wf6k3H0Lzejns7h/D4Ea+jeEuhHqRqgboW6EuhHqRqgboW6EuhHqRqgboW5q6Cl+Owb7rxB880i25LE0Y/WR7Mj9ZwBA1xvuI1StPRVgBwAAAABJRU5ErkJggg==' +export const PlaybackStart = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEdSURBVHgB7ZjRDYJADIaLcQBHYATdwFEYQTZxA9iAEXAD3YARZIN6F4+ABLgDer2a3Jf0hfThS/8GSAEikQgviHjSBVJRcqmqGnsK/QykYcTGNKoykIKJe4lGxHRN7C4UQYVXiHbTvUEIVooOhc9AzAHoSVU9Wddh40T514FAdCi8ax18RD9FCj7XgXCi4+nSroMn0aGw8zpwRT9FCv06WH92Qop2ZKoqW5MEUc3VNlUpolakiJZJkrRLDRJES1W5rekI4XipytUkHy7NISaqI9aCF1dJDfdES/hKtkAJ4ZdJv9iv4AsC0Tf+wW9egVx3gI2ifmMmEOWJeafoHUOee9B+gKjZY54Df+9O4WOew8RfiYnZBko/O0YiETc+wxQ2rR+3zSsAAAAASUVORK5CYII=' +export const PlaybackPrevious = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFMSURBVHgB7ZjRbcJAEETHUf6TEpIKknRAOkgJpIIoHdABlAAVUAIlQAe4A6CCY1echCUO7LNn1z/3pJWRbI6nnbWNDigUCj6EEP6kNlJvICLrvWqBgcqFKzMQiILzxrrrwU1gi8Z0DuGWTdt3n+CAiEyizEIqFfekbQyeYUj88bnUtMPlL1LHeyfNOqoxy2GPbpKt0DuqMePSxU8QoYlmxpwNJXp2zCkGddQq5hS9RK1jTpEdvUfMKXI6+iGSWzjEnCJH9Acj4vIKZVBE2RRRNjmiK6kaI5EjWldV9S7Hf4wgnB29yOq/9G9cOuxGrxkVWe3uVD5+wam7g24mkd15jQPlrvcYB9rjyXoc6M9Rq3Ewe+Czx8H0zdQYB+1w3XL56dFJl1doFFbZX6SFl3L+iL4YbZLpmsvmvlNg7BSqIGXH7XZd3rZjoVDozhl6iN12Uss4EQAAAABJRU5ErkJggg==' +export const PlaybackNext = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFISURBVHgB7Zj/TcMwEIVfEAOwAR4BRugmYQOYADaADcgGsEGzATBBVugG5qzaEFVu7cTvnH/8SadI/XH5dO+kKAYajUZdrLU3rkBE+hmpD6lnlOKb7e0/7+4zEJA+L7O+tyjBi50ySfUohCbq477EVDLdJaJXiV6pnTRSE3MdzpESzaWX2ovsI5RgiTqM1KtfhzuQYYoGjNQXex00RAM9iOugKeowIK2DtmjAoHAdaokGeqxch9qiDgO/DnLNfhptIRowOE44iy1FF9FE2TRRNluKfkt95v54C9GD1FPXdfdy/cn90zXqMuAoecBCaom6mJ3giJVoR/8Xc4mkQ3OiA1bGHENDtDjmGMzoaTHHYE10ADHmGKmJpm48Su1E8EFT0nFR1N98jHwVYt5pxLyK2Ylb4M2STvUs85Bs1lTr2JH2St1oNDL4BUn9GkhJu2j0AAAAAElFTkSuQmCC' +export const PlaybackReload = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAInSURBVHgB7ZjhdcIgEMcvfR3AEdig7QTNCG6gG9QNkk5gN9ANaifQTtB2At1AN7jeCfQRPBNIiM2H/N679zRw8M9BgANgZCQtiDiBhGTQESNoSvZMlpNNjFlOZN/GPrIs28EtIYE52TvZEePYk72QqZj+MkEARyOnN9+ALJDLC7KFUHwg23nPFNkjVKNs675SP2tog3ljphDKHp1yy5Zs0TQnje9a8F9hm/nsNVI4z2fCEObQAvIrhbZUTBu+0LNYsqn37A06wsKwGt19VGRRxv1gSkgECyP7ctrexjjXUUJiBLGLUMc6CugBMw2OzuipEKcm+hI7d/pYhTiE0JfYrdPHpKlyKMnFot7tLGVT5RjCJn64UP6w7FytrAB3Qv0ThJP2hJRl3PfO/M3d4b8X6j+BPgWFNLyG9HyCPo0xCvSpa3hg9eu3gsWh/28Ozu+/oR+iUJEhCvWzgzNDFKqc3wcYKqjTmzOhDss+FvWAfsUFv87BHr2OmDj1relzHr3rYTVdKOEGYPXEr0Kd3H2396hi7DHPc3ajuoSewMv8ScX426i6DfRxtPNTkRLagDofP/YhFrskd1cadOdPErEop8sKuiKI5YanLdrhKBbeKKUR6XRy7Upn3tQR6jTDF8jwTtS4okRfOxpBJdlMKOZD7gGqWcL50g0uswGuw5dknW9dajFzbI3xcERLjFyXU1zkKtARY3sAfcXoYi9yf8g2N7/IHRm5Eb/Ktnjp/UmNnwAAAABJRU5ErkJggg==' +export const PlaybackStop = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACMSURBVHgB7djLCYAwEEXRiRVZgpZkCVamHcSOxogbP1koPIyBeyAEhkDuesyACrl7l87k34vb328iS7vFhkxoTFdrZc0hhP44yIW6/UAKPbU1VglC1QhVI1SNUDVC1QhVI1SNUDVC1QhVI1SNUDVC1XKhs5W3XAe50NHKGx698n1HGv17kz9d5AI/swL4g4zsxjFdIQAAAABJRU5ErkJggg==' +export const PlaybackRoll = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJGSURBVHgB7ZjRccIwDIZFr++wQb0BbNB0gtIJygaFCcoG0AloJ0iZIHQDmAA6AXQCV7rYV6MKHDvBx0O+O11ysaWIP8aWDdDSct10oAZaa4WXIdo92gBNsS5rtAPaEu2z0+nsICWYYIZW6HAKtBFEEKQovoRUm6FlrIlU20GpoKVnLBNCUd+HiyiMSb4ICuVG3Z7Hl/q8C/6v0CQYcCYkqCAQ8hESbiZZCuQE3fvGmPkRi3MqUwwTyzKDBpPc+lTE9qHTP/P0VSamZQyRSSqmpKrgM6qaqPMOV9nBqb43Z+IUzv3kEv9QE3PiPAobAkyZRaRfFuCXx/iRY+E4qgC/2ETdYVbEOFVWs06ixtdV9Y63S2N06Nx/QDrenPsn3igl+mhvcLCvIB22gCEy3iglaifqFSQERbH1AtHn7VKidi77gfRszFXxhnPz6B6uiBu4HIU+zVZ7Ki5O04nuKvZTaF3hefeUwy3IL1PwN1YrQ7MEKkVLYt/TdYN9v4XnVuU1+HAm3n3o56nLudVJ+vRf5kpJBqsaC1vJllUc3CU0h0TostgOqy90ZFESS1RRYhyzlKoyNUchvlzVZ7gQ+rji2kIo6DRwAlTaikS8g29FFMSAjmP31zaZrP6/uZtCHTDAnCk7gprQUGJKTqEJKJA+ZqHjDyByFmsOTSIkaxPOPH49Xc4iueBfeS8fekimoNxGK6F5BWWFfnCe2aPIntCXtuD+Nb0OupxSCh1OoQM3fZamDnJpnyXVBjsoKyGqH9If5La0JOQXsDS9WDSXD0kAAAAASUVORK5CYII=' +export const OnAir = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHOSURBVHgB7ZjtTcMwEIbfIP7TDZoRugFmAzZomQBG6AaECdoN6AbxBmknaJgAmODwtY56sahiOx+tII90iuX64tf2+WoHGBn5BxBRauzV2J5OcHnFv+EaMELmxj7pPPzbHJfECJiRPwqXwlnqJva4BDxDFI5CJDeIRyGcGSJpI3SCcGJ8DgwtNJo2QgdlFNo1t74NTWrhHSvjcopwpm6KSpJEoyvo+J/dFxsfDb5Ln6I/7nwahcbo1tiTNY1wNsL/K8QxeDOZmFqzmeIO4eyEf69C5WYK6qgtvkI/7HNigr8SqxGOFuXUPr/hga/QrX2yyMPBwqaVEv6UVSpyUpRGV1D9SPd+pr6JhfBbifroE9U5sbl4uRL1Sw+RS9E+FfU5usaZvT2dYrXqPP9FYO4MakL1W8Ej+sC8OBOdFOTcMK0QHtBMDkQMphD+GfrCCimcmV14+ClnJgt3IE0kCMR2wLElN0Fp7A3H7FDautTYPY5XFiXacpsHkwGGycPkt4lc+lvuBrEcd2tq/gCR0RV9MVFWdAXPuMI1whtLCFXokPHO1DXB6anCpqln1E//XFa2rFE/tPAJLBssLVVQXHp6QSRtll4jDJ7JEiMjf5QfNy9cX3/Jd2AAAAAASUVORK5CYII=' +export const MessagePublic = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAsCAYAAAATmipGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMJSURBVHgB7VjRcdswDIVyGUAbVBvEmSDKBHU30AbJBrEncDKB3QncTiB3ArsTSBs4nQAFLNCGWVISJTr9iN8dThQJQk8gSIIEuOKTIoEIQMSUHplIKtXvIrskSd7hf4HI5SQLkgq7sRXdHD4K9LGCpMThqNgGBKL30JPxCT0WJLnVVJNsSH5L2QyzCYcHkomU7X6PFBY1xAKRfLK8sid5DRlKCZWVw8PPEANk6MUyvCbJYCC4r4PwC4yBRXI/JLZabD+LzXFkLZKVxGhUsE08XzW8YZB4DGT0qOSVJ8e9CXppK6EdtfTjCfaD+u58iuIAtmfW3/s2fbuz/svCasswHCW2xDU2S57BFnqS1J2WjvYhRBlVB1k9wQroQbRqMzyCKKNs+W6Kp8lVdZGcKqNLj46LaCn1LBOxs/aQzVu+P+ujx4pLpZiFEPXolg5d78yWnzR41W03lm4uz12kre3NUXfnU5bZbmb8V912JIqnVI3xC+JgSHpnvp0JpwO0R/WCXkMcZI66P9COnau/Jpp6lAdBvPHSQcQFPQpH592qyhSGI7Um35TkCdwe3UA7nOFyC3HAf1710HsbOkn10Os/ySA+eCXpk3tmqlybgiaqYydmpsQOmJM89tTPrL4HHIeeh4TijBs4Vu8gDObEqd/5xzl7WgWeQh+MDW8WZW17qUen984UCmz2e6dNe2f6qcpxzjJhmKryd68Wnmcwe5dXL+zRCj25xplHJZbM/swkP8yr2OSgmbyuOpexLq9ewqNi0+tNhh2jxqtzeWWSBVwenPtmUp67vHnj6Th6r+8LbBL03HyXSM5cej6ievZt4AKQEGOShVTVJN8gBNjcvjH67N/BwOZ6R8dkhaG3L9ZkWTo+wDccMxxwa4LNUWNpTcRwkmKsUEamMkRMrsR/wavCWvpMHLZSIefrzxdtw9JLPN9GtxiOSokPJY691EX/Je3xqhEbL4Ve6O7HEEwcRHk3WqiqDTS71caVBWEzdDk0qeEXOK2HJqPiDOpwuox+l688NuZ4csUVMfAXO6aOl6UD9cMAAAAASUVORK5CYII=' +export const MessageLower = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAsCAYAAAATmipGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKPSURBVHgB7ViLcdswDIU8gTYoN6g3iDpBPYI3qDeIO4HTCeROkHYCqRM4nYDewN4ABStQhhlSMiVGSi55dzjRIgg+ATA/APjAO0UGCYCIOT0US86vzyxPWZadYS4QuYJkR6KxHwfWLWAq0GRrkgqHQxsbEImbQ0/Gl/TYkRRO15GkJvnLbRtmmw53JEtuu+O+UFocIRWI5DfHKyeSh5hQcqrsPR7eQAqQoXvH8COJgoEwYz2E72EMHJKnIbnVYXvDNseRdUhqztGkMDbxetWISwMOj/SkCuhoR0qIBJOVnr3dIc5XrqH/YywqGABsljyLw5BBZYdeMqJsb9/nHHeAZmWNHf/uFyCaixTQbv/CUV7BZWGuky7GPeDzwA/+aZxQyP6Fo/9VtL/D9Pgl2quglgh7b0KnDr2we/CFfyEU7N5s8Afmg51bMaf/kKGX69cR5sOTaCvbkETzgPLUkIfs1nkhonPCextYwBuBJCq/RMF8UKJ9tA1JVOZl8pNSBJRot85rifIuZDs+w3y44+eZOLXOc3O05mch17CpwHMW/PNq5XGJ/hbtNHeZOMht82dQyznBnLq8+hJbKF6fg5Xsu/Koc4IxJCfzKp9BFf/c957cbvVqwKM3IWBLh7zZRXYjBm0mIFqJ7q1vvtDONNlej811p7DzUsi3MYMfxBcuAzqjPIpNipXitcbYwgYGDq+pgE15R48lKT1VeiYw+bvFAVUTbO7wpePgeJJsbC2MrDhEhlyFz2FWhUces/TYyplcaLxJsWE7IE9sccB4aCEhVDi2qIvhIm1basTGS7EF3dMYgpmHqFk3d+JVDc1uVftq8Xg5SJjQf4LL7mJr+KbAa5a79LV84bHXcj35wPvFP/pYW0uGRwmTAAAAAElFTkSuQmCC' +export const MessageSpeaker = + 'iVBORw0KGgoAAAANSUhEUgAAACoAAAAsCAYAAAATmipGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM2SURBVHgB7Vj/ldowDBY3QTaouwEbNDdBrxM0naBscGwAnSDXCWgnCJ3g6AShE4QNVBkroPjJP5Lw2j+O7z09ApHkz7KwZAPc8UaxgBsAEQv6MCwF/3xiOSwWixP8LxC5kmRD0mIar6xbwr8CDVaRNDgdrfUBI5G99OR8SR8bktJ7dSTZk/zm536Z+3T4QLLkZ9/ukdLiCLcCkfzqRaUj2Y5ZSk6VFyXCK7gFyNGz53hHYmAirK1C+BnmwCPZTcmtiO8V+5xH1iPZco6mbAqOmMmJuvWJw11jXBrwQDKSBuLk7KQa1GG3phoD+cxkZWSTAZHGrTCsInp+RFJotUmj2/IuE4NMktKojugZLxJZRCP+XnKCIw3a2OyFXh0g07GtNokq4q8QNm2K5BPmRbMIkCw9PRv1vpLFB3f665AvX7EWiiaiVyok6wSJAtJEl8LfVr578HRL/jxMKG1/Yi9zOijSOdix+etH+e5CFK+tmsUviEMb9DPOqFgC/dhGroKMqNy/jhABz9wna0ganF+9Dp7PMyTRIqAcwjflN0NS48RWjiEDcAleiGgSFNU1uPZOg4HphNVcfoAZILKPoEe2hwFHuM7518cgiZ68AbJAZG0j8QnieV2By98cskY8H/sHSVTmZX5jAGeyP0je0+MXCBO2PnNaOSOe9S1NlLAGZoCrUYs6ioRtw3pdTGmX6zCDrAmQfYrYyNI8CJb/Z/opnmedZbiyaX+0WADkJL4HtXDYwXShqKKr9QYSQHfcGBPRVuiZlHPZwawTOg26fDSKTmjpTcBnVh8sDZJR9SbT45WJN/ysoQmMaUZFUxjKJVtlEk0hePbC4XlrremEKlNOrR8Dux+qtyLolrnsx+XSnAd0tyA9lgGdvnOPnZtajr6WPjbFak/XwBjgNceSxwfWt515KWSJkX2Yddq5JOWZvlYGWHGUKhgJnkCtRN3AWOBwm3jiJVqhfsFgl33HNkvFV8HkQvZbnFoBcVhGQ9tMDK2QEBqce6mL4auZy1UjuihVOO5Ct5tDcKEQtfvmRvy0B1ez99pJEt3SleDauHdwbdP6O3x7wXs+Xd78Ll9EbFYHdccdN8BfbmMAyfxQu/oAAAAASUVORK5CYII=' diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..a088a15 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,106 @@ +import { + runEntrypoint, + InstanceBase, + InstanceStatus, + SomeCompanionConfigField, + CompanionActionDefinitions, + CompanionPresetDefinitions, + CompanionFeedbackDefinitions, +} from '@companion-module/base' +import { GoSteamDeckConfig, GetConfigFields } from './config' +import { GoSteamDeckV1 } from './GoSteamDeckV1' +import { GoStreamDeckState } from './state' +export interface GoSteamDeckClient { + instance: GoSteamDeckInstance + + connect(): void + disconnectSocket(): void + + getVariables(self: GoSteamDeckInstance): void + getActions(self: GoSteamDeckInstance): CompanionActionDefinitions + getFeedbacks(self: GoSteamDeckInstance): CompanionFeedbackDefinitions + getPresets(): CompanionPresetDefinitions +} +export class GoSteamDeckInstance extends InstanceBase { + public config!: GoSteamDeckConfig + public gostreamdeck!: GoSteamDeckClient + public states!: GoStreamDeckState + + async init(config: GoSteamDeckConfig): Promise { + this.config = config + + this.log('debug', 'Initializing module') + this.updateStatus(InstanceStatus.Disconnected) + + // this.config.reconnect = true + // this.config.reconnectInterval = 5 + this.saveConfig(this.config) + + this.gostreamdeck = new GoSteamDeckV1(this); + + this.initConnection() + this.init_variables() + this.init_actions() + this.init_feedbacks() + this.init_presets() + this.checkFeedbacks() + } + + async destroy(): Promise { + this.gostreamdeck.disconnectSocket() + this.updateStatus(InstanceStatus.Disconnected) + this.log('debug', 'destroy ' + this.id) + } + + getConfigFields(): SomeCompanionConfigField[] { + return GetConfigFields() + } + + async configUpdated(config: GoSteamDeckConfig): Promise { + this.config = config + this.gostreamdeck.disconnectSocket() + this.updateStatus(InstanceStatus.Disconnected) + + /* if (this.config.version === 'v1') { + this.ontime = new OntimeV1(this) + } else if (this.config.version === 'v2') { + // this.ontime = new OntimeV2(this) + } */ + this.gostreamdeck = new GoSteamDeckV1(this) + + this.initConnection() + this.init_variables() + this.init_actions() + this.init_feedbacks() + this.init_presets() + this.checkFeedbacks() + } + + initConnection(): void { + this.log('debug', 'Initializing connection') + this.gostreamdeck.connect() + } + + init_variables(): void { + this.log('debug', 'Initializing variables') + this.gostreamdeck.getVariables(this); + //this.setVariableDefinitions() + } + + init_actions(): void { + this.log('debug', 'Initializing actions') + this.setActionDefinitions(this.gostreamdeck.getActions(this)) + } + + init_feedbacks(): void { + this.log('debug', 'Initializing feedbacks') + this.setFeedbackDefinitions(this.gostreamdeck.getFeedbacks(this)) + } + + init_presets(): void { + this.log('debug', 'Initializing presets') + this.setPresetDefinitions(this.gostreamdeck.getPresets()) + } +} + +runEntrypoint(GoSteamDeckInstance, []) diff --git a/src/input.ts b/src/input.ts new file mode 100644 index 0000000..d248e91 --- /dev/null +++ b/src/input.ts @@ -0,0 +1,20 @@ +import { CompanionInputFieldDropdown } from '@companion-module/base' +import { NumberComparitor } from './util' + +export function NumberComparitorPicker(): CompanionInputFieldDropdown { + const options = [ + { id: NumberComparitor.Equal, label: 'Equal' }, + { id: NumberComparitor.NotEqual, label: 'Not Equal' }, + { id: NumberComparitor.GreaterThan, label: 'Greater than' }, + { id: NumberComparitor.GreaterThanEqual, label: 'Greater than or equal' }, + { id: NumberComparitor.LessThan, label: 'Less than' }, + { id: NumberComparitor.LessThanEqual, label: 'Less than or equal' }, + ] + return { + type: 'dropdown', + label: 'Comparitor', + id: 'comparitor', + default: NumberComparitor.Equal, + choices: options, + } +} \ No newline at end of file diff --git a/src/model.ts b/src/model.ts new file mode 100644 index 0000000..eec6ef7 --- /dev/null +++ b/src/model.ts @@ -0,0 +1,192 @@ +import { DropdownChoice } from '@companion-module/base' +import { TransitionStyle } from './enums' +import { InputChannel } from './state' + +export const SourceModels: InputChannel[] = [ + { inputId: 0, longName: 'Input1', shortName: 'In1' }, + { inputId: 1, longName: 'Input2' , shortName: 'In2'}, + { inputId: 2, longName: 'Input3', shortName: 'In3' }, + { inputId: 3, longName: 'Input4' , shortName: 'In4'}, +] + +export const OtherSourceModels: InputChannel[] = [ + { inputId: 4, longName: 'Aux', shortName: 'Aux' }, + { inputId: 5, longName: 'Still1' , shortName: 'STL1'}, + { inputId: 6, longName: 'Still2' , shortName: 'STL2'}, + { inputId: 7, longName: 'Black' , shortName: 'BLK'}, +] + +export const OtherDSKSourceModels: InputChannel[] = [ + { inputId: 4, longName: 'Aux' , shortName: 'Aux'}, + { inputId: 5, longName: 'Still1' , shortName: 'STL1'}, + { inputId: 6, longName: 'Still1 Key' , shortName: 'STL1 Key'}, + { inputId: 7, longName: 'Still2' , shortName: 'STL2'}, + { inputId: 8, longName: 'Still2 Key', shortName: 'STL2 Key' }, + { inputId: 9, longName: 'Color1' , shortName: 'Col1'}, + { inputId: 10, longName: 'Color2' , shortName: 'Col2'}, + { inputId: 11, longName: 'Color Bar' , shortName: 'Bar'}, + { inputId: 10, longName: 'Black' , shortName: 'BLK'}, +] +export const OtherDipSourceModels: InputChannel[] = [ + { inputId: 4, longName: 'Aux', shortName: 'Aux' }, + { inputId: 5, longName: 'Black' , shortName: 'BLK'}, + { inputId: 6, longName: 'Still1' , shortName: 'STL1'}, + { inputId: 7, longName: 'Still2', shortName: 'STL2' }, + { inputId: 8, longName: 'Color1' , shortName: 'Col1'}, + { inputId: 9, longName: 'Color2' , shortName: 'Col2'}, + { inputId: 10, longName: 'Color Bar', shortName: 'Bar' }, +] + +export const TransitionStyleChoice: DropdownChoice[] = [ + { id: TransitionStyle.MIX, label: 'MIX' }, + { id: TransitionStyle.DIP, label: 'DIP' }, + { id: TransitionStyle.WIPE, label: 'WIPE' } +] + +export const SwitchChoices: DropdownChoice[] = [ + { id: '0', label: 'Close' }, + { id: '1', label: 'Open' } +] + +export const WipeDirectionChoices: DropdownChoice[] = [ + { id: '0', label: 'Normal' }, + { id: '1', label: 'Inverse' } +] + +export const KeySwitchChoices: DropdownChoice[] = [ + { id: '0', label: 'Key' }, + { id: '1', label: 'DSK' }, + { id: '2', label: 'BKGD' } +] + +export const ColorSwitchChoices: DropdownChoice[] = [ + { id: '0', label: 'Color1' }, + { id: '1', label: 'Color2' }, +] + +export const SuperSourceStyleChoices: DropdownChoice[] = [ + { id: '0', label: 'zoom in' }, + { id: '1', label: 'crop-zoom in' }, + { id: '2', label: 'crop' }, +] +export const SuperSourceMaskChoices: DropdownChoice[] = [ + { id: '0', label: 'mask1' }, + { id: '1', label: 'mask2' }, +] +export const SuperSourceBorderChoices: DropdownChoice[] = [ + { id: '0', label: 'border1' }, + { id: '1', label: 'border2' }, +] +export const UpStreamKeyTypeChoices: DropdownChoice[] = [ + { id: '0', label: 'Luma Key' }, + { id: '1', label: 'Chroma Key' }, + { id: '2', label: 'Pattern' }, + { id: '3', label: 'PIP' }, +] +export const KeyResizeSizeChoices: DropdownChoice[] = [ + { id: '0', label: '0.25' }, + { id: '1', label: '0.33' }, + { id: '2', label: '0.50' }, +] + +export const AudioMicChoices: DropdownChoice[] = [ + { id: '0', label: 'mic1' }, + { id: '1', label: 'mic2' }, +] + +export const AudioSourcesChoices: DropdownChoice[] = [ + { id: '0', label: 'mic1' }, + { id: '1', label: 'mic2' }, + { id: '2', label: 'in1' }, + { id: '3', label: 'in2' }, + { id: '4', label: 'in3' }, + { id: '5', label: 'in4' }, + { id: '6', label: 'aux' }, +] +export const OtherAudioSourcesChoices: DropdownChoice[] = [ + { id: '7', label: 'pgm' }, +] + +export const AudioSourcesEnableChoices: DropdownChoice[] = [ + { id: '0', label: 'off' }, + { id: '1', label: 'on' }, +] +export const OtherAudioSourcesEnableChoices: DropdownChoice[] = [ + { id: '2', label: 'afv' }, +] + +export const StreamingChoices: DropdownChoice[] = [ + { id: '0', label: 'Stream1' }, + { id: '1', label: 'Stream2' }, + { id: '1', label: 'Stream3' }, +] + +export const SettingsUMDSrcChoices: DropdownChoice[] = [ + { id: '0', label: 'pgm' }, + { id: '1', label: 'pvw' }, + { id: '2', label: 'in1' }, + { id: '3', label: 'in2' }, + { id: '4', label: 'in3' }, + { id: '5', label: 'in4' }, + { id: '6', label: 'aux' }, + { id: '7', label: 'still 1' }, + { id: '8', label: 'still 2' }, +] +export const SettingsMvMeterChoices: DropdownChoice[] = [ + { id: '0', label: 'pgm' }, + { id: '1', label: 'in1' }, + { id: '2', label: 'in2' }, + { id: '3', label: 'in3' }, + { id: '4', label: 'in4' }, + { id: '5', label: 'aux' }, +] +export const SettingsMvLayoutChoices: DropdownChoice[] = [ + { id: '0', label: 'PGM|PVW' }, + { id: '1', label: 'PVW|PGM' }, +] + +export const SettingsMicInputChoices: DropdownChoice[] = [ + { id: '0', label: 'mic+power' }, + { id: '1', label: 'mic' }, + { id: '2', label: 'line' }, +] +export const SettingsColorChoices: DropdownChoice[] = [ + { id: '0', label: 'auto' }, + { id: '1', label: 'rgb full' }, + { id: '2', label: 'rgb limit' }, + { id: '3', label: 'ycbcr422 full' }, + { id: '4', label: 'ycbcr422 limit' }, + { id: '5', label: 'ycbcr444 full' }, + { id: '6', label: 'ycbcr444 limit' }, +] +export const SettingsAuxSourceChoices: DropdownChoice[] = [ + //0~2,sd card,usb camera,ndi + { id: '0', label: 'sd card' }, + { id: '1', label: 'usb camera' }, + { id: '2', label: 'ndi' }, +] + +export const SettingsOutFormatChoices: DropdownChoice[] = [ + //0~4,1080p24,1080p25,1080p30, + { id: '0', label: '1080p24' }, + { id: '1', label: '1080p25' }, + { id: '2', label: '1080p30' }, + { id: '3', label: '1080p50' }, + { id: '4', label: '1080p60' }, +] + +export const SettingsOutSourceParamChoices: DropdownChoice[] = [ + //0~4,1080p24,1080p25,1080p30, + {id:'0',label:'HDMI1'}, + //{id:'1',label:'HDMI2'}, + {id:'2',label:'UVC'} +] + +export const SettingsOutSourceChoices: DropdownChoice[] = [ + //0~4,1080p24,1080p25,1080p30, + { id: '4', label: 'aux' }, + { id: '5', label: 'pgm' }, + { id: '6', label: 'pvw' }, + { id: '7', label: 'multiview' }, +] + diff --git a/src/presets.ts b/src/presets.ts new file mode 100644 index 0000000..666a3c3 --- /dev/null +++ b/src/presets.ts @@ -0,0 +1,659 @@ +import { CompanionButtonPresetDefinition, CompanionPresetDefinitions, combineRgb } from '@companion-module/base' +import { ActionId, ActionType, feedbackId } from './enums' +import { GoSteamDeckInstance } from './index' +import { getChoices } from './choices' +import { KeySwitchChoices, SettingsAuxSourceChoices, SettingsOutSourceParamChoices, TransitionStyleChoice, UpStreamKeyTypeChoices } from './model' +const rateOptions = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0] + +export function presets(_self: GoSteamDeckInstance): CompanionPresetDefinitions { + const presets: { [id: string]: CompanionButtonPresetDefinition | undefined } = {} + + let MeChoice = getChoices(ActionType.Preview); + + for(const src of MeChoice){ + presets[`Preview_${src.id}`] = { + type: 'button', + category: 'Preview', + name: `Preview button for ${src.label}`, + style: { + pngalignment: 'center:center', + text: `${src.label}`, + alignment: 'center:center', + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + steps: [ + { + down: [ + { + actionId: ActionId.PvwIndex, + options: { + Source:src.id + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { + feedbackId: feedbackId.PreviewBG, + options: { + Source: src.id, + }, + style: { + bgcolor: combineRgb(0, 255, 0), + color: combineRgb(255, 255, 255), + }, + } + ], + } + + presets[`Program_${src.id}`] = { + type: 'button', + category: 'Program', + name: `Program button for ${src.label}`, + style: { + pngalignment: 'center:center', + text: `${src.label}`, + alignment: 'center:center', + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + steps: [ + { + down: [ + { + actionId: ActionId.PgmIndex, + options: { + Source:src.id + }, + }, + ], + up: [], + }, + ], + feedbacks: [ + { + feedbackId: feedbackId.ProgramBG, + options: { + Source: src.id, + }, + style: { + bgcolor: combineRgb(0, 255, 0), + color: combineRgb(255, 255, 255), + }, + } + ], + } + + + } + + presets[`transition_cut`] = { + category: `Transitions`, + name: `CUT`, + type: 'button', + style: { + text: 'CUT', + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.InTransition, + options: {}, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.CutTransition, + options: {}, + }, + ], + up: [], + }, + ], + } + presets[`transition_auto`] = { + category: `Transitions`, + name: `AUTO`, + type: 'button', + style: { + text: 'AUTO', + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.InTransition, + options: {}, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.AutoTransition, + options: {}, + }, + ], + up: [], + }, + ], + } + + let TranChoices= TransitionStyleChoice; + for(const opt of TranChoices){ + presets[`transition_style_${opt.id}`] = { + category: `Transitions`, + name: `Transition style ${opt.label}`, + type: 'button', + style: { + text: opt.label, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.TransitionStyle, + options: { + TransitionStyle: opt.id, + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.TransitionIndex, + options: { + TransitionStyle: opt.id, + }, + }, + ], + up: [], + }, + ], + } + + for (const rate of rateOptions) { + presets[`transition_rate_${opt.id}_${rate}`] = { + category: `Transitions`, + name: `Transition ${opt.label} rate ${rate}`, + type: 'button', + style: { + text: `${opt.label} ${rate}`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.TransitionRate, + options: { + TransitionStyle: opt.id, + TransitionRate:rate, + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.TransitionRate, + options: { + TransitionStyle: opt.id, + TransitionRate:rate, + }, + }, + ], + up: [], + }, + ], + } + } + } + + let Keys=KeySwitchChoices; + for(const key of Keys){ + presets[`keys_Next_${key.id}`] = { + category: 'KEYs Next', + name: `Toggle ${key.label} Switch`, + type: 'button', + style: { + text: `${key.label}`, + size: '24', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.TransitionKeySwitch, + options: { + KeySwitch: [key.id], + }, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.TransitionSource, + options: { + KeySwitch: [key.id], + }, + }, + ], + up: [], + }, + ], + } + if(key.label!="BKGD"){ + presets[`keys_Next_Air_${key.id}`] = { + category: 'KEYs Next', + name: `Toggle upstream KEY ${key.label} Next`, + type: 'button', + style: { + text: `${key.label} On AIR`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId:key.label==="Key"? feedbackId.KeyOnAir:feedbackId.DskOnAir, + options: { + KeyOnAir: "1", + DSKOnAir:"1", + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId:key.label==="Key"? ActionId.KeyOnAir:ActionId.DskOnAir, + options: { + KeyOnAir: "1", + DSKOnAir:"1", + }, + }, + ], + up: [], + }, + ], + } + } + } + + //UpStreamKey + for(const UpKey of UpStreamKeyTypeChoices){ + presets[`UpStreamKey_${UpKey.id}`] = { + category: 'UpStreamKeyType', + name: `Upstream key: Set Key Type ${UpKey.label}`, + type: 'button', + style: { + text: `${UpKey.label}`, + size: '24', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.UpStreamKeyType, + options: { + USKType: UpKey.id, + }, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.UpStreamKeyType, + options: { + USKType: UpKey.id, + }, + }, + ], + up: [], + }, + ], + } + + let _ActionId = ActionId.LumaKeySourceFill; + + switch(UpKey.id){ + case "0": + _ActionId= ActionId.LumaKeySourceFill; + break; + case "1": + _ActionId= ActionId.ChromaKeyFill; + break; + case "2": + _ActionId= ActionId.KeyPatternSourceFill; + break; + case "3": + _ActionId= ActionId.PipSource; + break; + } + var sources= getChoices(ActionType.LumaKeySourceKey); + for(const source of sources){ + presets[`UpStreamKey_${source.id}_${UpKey.id}`] = { + category: `${UpKey.label}`, + name: `Upstream key: Set ${UpKey.label} Source Fill`, + type: 'button', + style: { + text: `${source.label}`, + size: '24', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.KeySourceFill, + options: { + USKKeyType:UpKey.id, + USKSourceFill:source.id, + }, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: _ActionId, + options: { + KeyFill: [source.id], + }, + }, + ], + up: [], + }, + ], + } + } + } + + + for(const param of SettingsOutSourceParamChoices){ + for(const source of getChoices(ActionType.SettingsoutSource)){ + presets[`Setting_Type_${param.id}_OutSource_${source.id}`] = { + category: 'SettingsOutSource', + name: `Settings ${param.label} OutSource ${source.label}`, + type: 'button', + style: { + text: `${source.label}`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.SettingOutSource, + options: { + OutId: param.id, + OutSource:source.id, + }, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.OutSource, + options: { + OutId: param.id, + OutSource:source.id, + }, + }, + ], + up: [], + }, + ], + } + } + } + + for (let macro = 0; macro < 100; macro++) { + presets[`macro_run_${macro}`] = { + category: 'MACROS', + name: `Run button for macro ${macro + 1}`, + type: 'button', + style: { + text: `macro_${macro + 1}`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.Macro, + options: { + macroIndex: macro, + }, + style: { + bgcolor: combineRgb(0, 0, 238), + color: combineRgb(255, 255, 255), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.MacroStartRun, + options: { + MacroIndex: macro, + }, + }, + ], + up: [], + }, + ], + } + } + + presets[`ftb_auto`] = { + category: `Fade to black`, + name: `Auto fade`, + type: 'button', + style: { + text: `FTB Auto`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.FadeToBlackIsBlack, + options: { + state: 'off', + }, + style: { + bgcolor: combineRgb(0, 255, 0), + color: combineRgb(255, 255, 255), + }, + }, + { + feedbackId: feedbackId.FadeToBlackIsBlack, + options: { + state: 'on', + }, + style: { + bgcolor: combineRgb(255, 0, 0), + color: combineRgb(255, 255, 255), + }, + }, + { + feedbackId: feedbackId.FadeToBlackIsBlack, + options: { + state: 'fading', + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.FTB, + options: {}, + }, + ], + up: [], + }, + ], + } + for (const rate of rateOptions) { + presets[`ftb_rate_${rate}`] = { + category: `Fade to black`, + name: `Rate ${rate}`, + type: 'button', + style: { + text: `Rate ${rate}`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.FadeToBlackRate, + options: { + FtbRate:rate, + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.FtbRate, + options: { + FtbRate:rate, + }, + }, + ], + up: [], + }, + ], + } + } + + for(const aux of SettingsAuxSourceChoices){ + presets[`aux_${aux.id}`] = { + category: `AUX`, + name: `AUX ${aux.id} button for ${aux.label}`, + type: 'button', + style: { + text: `${aux.label}`, + size: 'auto', + color: combineRgb(255, 255, 255), + bgcolor: combineRgb(0, 0, 0), + }, + feedbacks: [ + { + feedbackId: feedbackId.AuxBG, + options: { + }, + style: { + bgcolor: combineRgb(255, 255, 0), + color: combineRgb(0, 0, 0), + }, + }, + ], + steps: [ + { + down: [ + { + actionId: ActionId.AuxSource, + options: { + auxSourceID:aux.id, + }, + }, + ], + up: [], + }, + ], + } + } + + /* presets['start_selected_event'] = { + type: 'button', + category: 'Program', + name: 'Starts selected event', + style: { + png64: icons.PlaybackStart, + pngalignment: 'center:top', + text: 'START', + alignment: 'center:bottom', + size: '7', + color: combineRgb(75, 255, 171), + bgcolor: combineRgb(0, 0, 0), + }, + steps: [ + { + down: [ + { + actionId: ActionId.AutoTransition, + options: {}, + }, + ], + up: [], + }, + ], + feedbacks: [], + } */ + return presets +} diff --git a/src/state.ts b/src/state.ts new file mode 100644 index 0000000..832cfa6 --- /dev/null +++ b/src/state.ts @@ -0,0 +1,118 @@ +import { DropdownChoice } from "@companion-module/base" + + + +export interface GoStreamDeckState { + selectPrevInput?:DropdownChoice, + selectPgmInput?: DropdownChoice, + selectOutputs: { [outputId: number]: OutputChannel }, + selectTransitionStyle?:TransitionStyleInfo, + TKeyeState:TransitionKeyeState, + infos: DeviceInfo, + keyOnAir:boolean, + dskOnAir:boolean, + ///输出口 HDMI1和HDMI对应的输出信息 + OutPutInfos:OutPutSource[], + fadeToBlack?:FadeToBlackProperties, + //aux 源 + auxSource:number, + + upStreamKeyType:number, + + arrayKeySourceFill:Array, +} + +export interface FadeToBlackProperties { + readonly isFullyBlack: boolean + readonly inTransition: boolean + readonly remainingFrames: number + rate: number +} +export interface OutPutSource{ + OutPutType:number, + OutPutSource?:DropdownChoice, +} + +export interface TransitionStyleInfo{ + style:DropdownChoice, + + mixrate:number, + diprate:number, + wiperate:number, +} + +export interface TransitionKeyeState { + M_Key: boolean + DSK: boolean + BKGD: boolean +} + +export interface DeviceInfo { + protocolVersion: string + deviceType:number + capabilities?: GostreamDeckCapabilites + macroPool?: MacroPoolInfo + mediaPool?: MediaPoolInfo +} + +export interface InputChannel { + readonly inputId: number + longName: string + shortName: string +} + +export interface OutputChannel { + readonly outputId: number + longName: string + shortName: string +} + +export interface GostreamDeckCapabilites { + readonly mixEffects: number + readonly auxilliaries: number + readonly mixMinusOutputs: number + readonly serialPorts: number + readonly maxHyperdecks: number + readonly superSources: number + readonly downstreamKeyers: number + readonly advancedChromaKeyers: boolean + readonly onlyConfigurableOutputs: boolean +} + +export interface MacroPoolInfo { + readonly macroCount: number +} + +export interface MediaPoolInfo { + readonly stillCount: number + readonly clipCount: number +} + +export function Create(): GoStreamDeckState { + return { + infos: { + protocolVersion: "1.0", + deviceType:0, + }, + TKeyeState:{ + BKGD:true, + DSK:false, + M_Key:false, + }, + selectOutputs:{}, + keyOnAir:false, + dskOnAir:false, + OutPutInfos:[ + { + OutPutType:0, + }, + { + OutPutType:2, + } + ], + auxSource:0, + upStreamKeyType:0, + arrayKeySourceFill:[0,0,0,0], + } +} + diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..d0eed7b --- /dev/null +++ b/src/util.ts @@ -0,0 +1,39 @@ +import { InputValue } from '@companion-module/base' + + +export enum NumberComparitor { + Equal = 'eq', + NotEqual = 'ne', + LessThan = 'lt', + LessThanEqual = 'lte', + GreaterThan = 'gt', + GreaterThanEqual = 'gte', +} + +export function compareNumber( + target: InputValue | undefined, + comparitor: InputValue | undefined, + currentValue: number +): boolean { + const targetValue = Number(target) + if (isNaN(targetValue)) { + return false + } + + switch (comparitor) { + case NumberComparitor.GreaterThan: + return currentValue > targetValue + case NumberComparitor.GreaterThanEqual: + return currentValue >= targetValue + case NumberComparitor.LessThan: + return currentValue < targetValue + case NumberComparitor.LessThanEqual: + return currentValue <= targetValue + case NumberComparitor.NotEqual: + return currentValue != targetValue + default: + return currentValue === targetValue + } +} + + diff --git a/src/variables.ts b/src/variables.ts new file mode 100644 index 0000000..64becac --- /dev/null +++ b/src/variables.ts @@ -0,0 +1,29 @@ +import { CompanionVariableDefinition, CompanionVariableValues } from '@companion-module/base' +import { GoSteamDeckInstance } from '.' +import { ActionType } from './enums' +import { getChoices } from './choices' + +export function variables(_self: GoSteamDeckInstance): void { + const variables: CompanionVariableDefinition[] = [] + + const values: CompanionVariableValues = {} + + variables.push({ + name: 'IP address of GoStreamDeck', + variableId: `device_ip`, + }) + values['device_ip'] = _self.config.host; + + let MeChoice = getChoices(ActionType.Preview); + + for (let i = 0; i < MeChoice.length; i++) { + variables.push({ + name: `Id of input_${i + 1}`, + variableId: `pre${i + 1}_input_id`, + }) + values[`pre${i + 1}_input_id`] = MeChoice[i].label; + } + + _self.setVariableDefinitions(variables); + _self.setVariableValues(values); +} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..44cc894 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "@companion-module/tools/tsconfig/node18/recommended", + "include": ["src/**/*.ts"], + "exclude": ["node_modules/**", "src/**/*spec.ts", "src/**/__tests__/*", "src/**/__mocks__/*"], + "compilerOptions": { + "outDir": "./dist", + "baseUrl": "./", + "paths": { + "*": ["./node_modules/*"] + }, + "noImplicitAny": false, + "module": "commonjs", + "esModuleInterop": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..012a24a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@companion-module/tools/tsconfig/node18/recommended", + "include": ["src/**/*.ts"], + "exclude": ["node_modules/**", "src/**/*spec.ts", "src/**/__tests__/*", "src/**/__mocks__/*"], + "compilerOptions": { + "outDir": "./dist", + "baseUrl": "./", + "paths": { + "*": ["./node_modules/*"] + } + } +} diff --git a/tsconfig.preset.json b/tsconfig.preset.json new file mode 100644 index 0000000..9f9ff11 --- /dev/null +++ b/tsconfig.preset.json @@ -0,0 +1,18 @@ +{ + "extends": "@companion-module/tools/tsconfig/node18/recommended", + "compilerOptions": { + "sourceMap": true, + "paths": { + "*": ["../node_modules/*"] + }, + "declaration": true, + "importHelpers": true, + "types": ["node"], + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": false + }, + "compileOnSave": false +} diff --git a/upgrades.js b/upgrades.js deleted file mode 100644 index d9d6472..0000000 --- a/upgrades.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = [ - /* - * Place your upgrade scripts here - * Remember that once it has been added it cannot be removed! - */ - // function (context, props) { - // return { - // updatedConfig: null, - // updatedActions: [], - // updatedFeedbacks: [], - // } - // }, -] diff --git a/variables.js b/variables.js deleted file mode 100644 index a4c9f8c..0000000 --- a/variables.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function (self) { - self.setVariableDefinitions([ - { variableId: 'variable1', name: 'My first variable' }, - { variableId: 'variable2', name: 'My second variable' }, - { variableId: 'variable3', name: 'Another variable' }, - ]) -} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..285241f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2533 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@companion-module/base@~1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@companion-module/base/-/base-1.2.1.tgz#f935f99c8b0e935939f9a21b81331fd8453485a3" + integrity sha512-6cJJl4oVheMIdF55UrmfoJ6+MCyaRo9uKeCRcfKq3lq0knNj1xkNgiiys/M9Ymm4BLLQ0iKIhwHsyEYMKB7bhA== + dependencies: + "@sentry/node" "^7.36.0" + "@sentry/tracing" "^7.36.0" + ajv "^8.12.0" + debounce-fn "github:julusian/debounce-fn#4.0.0-maxWaithack.0" + ejson "^2.2.3" + eventemitter3 "^4.0.7" + nanoid "^3.3.4" + p-queue "^6.6.2" + p-timeout "^4.1.0" + tslib "^2.5.0" + +"@companion-module/tools@^1.1.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@companion-module/tools/-/tools-1.2.0.tgz" + integrity sha512-F+YaH2/Q3a6rm1ae+QpVOW4p3donRvbyYSbBcasyK919bZo6XLwUgwd/Mr1ZAoDWsqvy/VE3DUXBpZVLXpiV1Q== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.50.0" + "@typescript-eslint/parser" "^5.50.0" + eslint "^8.33.0" + eslint-config-prettier "^8.6.0" + eslint-plugin-node "^11.1.0" + eslint-plugin-prettier "^4.2.1" + find-up "^6.3.0" + parse-author "^2.0.0" + prettier "^2.8.3" + tar "^6.1.13" + webpack "^5.75.0" + webpack-cli "^5.0.1" + zx "^7.1.1" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.37.0": + version "8.37.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz" + integrity sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sentry-internal/tracing@7.46.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.46.0.tgz" + integrity sha512-KYoppa7PPL8Er7bdPoxTNUfIY804JL7hhOEomQHYD22rLynwQ4AaLm3YEY75QWwcGb0B7ZDMV+tSumW7Rxuwuw== + dependencies: + "@sentry/core" "7.46.0" + "@sentry/types" "7.46.0" + "@sentry/utils" "7.46.0" + tslib "^1.9.3" + +"@sentry/core@7.46.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry/core/-/core-7.46.0.tgz" + integrity sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A== + dependencies: + "@sentry/types" "7.46.0" + "@sentry/utils" "7.46.0" + tslib "^1.9.3" + +"@sentry/node@^7.36.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry/node/-/node-7.46.0.tgz" + integrity sha512-+GrgJMCye2WXGarRiU5IJHCK27xg7xbPc2XjGojBKbBoZfqxVAWbXEK4bnBQgRGP1pCmrU/M6ZhVgR3dP580xA== + dependencies: + "@sentry-internal/tracing" "7.46.0" + "@sentry/core" "7.46.0" + "@sentry/types" "7.46.0" + "@sentry/utils" "7.46.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@^7.36.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.46.0.tgz" + integrity sha512-7qBtzmu7CDHclSKp+ZRrxoDcMyrev6/rxD2rSVJgB3o8gd2XGcO5vx9vuUOoYF0xTfOMXscR6Ft6JXE49xovYg== + dependencies: + "@sentry-internal/tracing" "7.46.0" + +"@sentry/types@7.46.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry/types/-/types-7.46.0.tgz" + integrity sha512-2FMEMgt2h6u7AoELhNhu9L54GAh67KKfK2pJ1kEXJHmWxM9FSCkizjLs/t+49xtY7jEXr8qYq8bV967VfDPQ9g== + +"@sentry/utils@7.46.0": + version "7.46.0" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.46.0.tgz" + integrity sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ== + dependencies: + "@sentry/types" "7.46.0" + tslib "^1.9.3" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.37.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + +"@types/minimist@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node@*", "@types/node@^18.14.0", "@types/node@^18.14.2": + version "18.15.11" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@types/ps-tree@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.2.tgz" + integrity sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/which@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz" + integrity sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw== + +"@typescript-eslint/eslint-plugin@^5.50.0", "@typescript-eslint/eslint-plugin@^5.53.0": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz" + integrity sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.57.1" + "@typescript-eslint/type-utils" "5.57.1" + "@typescript-eslint/utils" "5.57.1" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.50.0", "@typescript-eslint/parser@^5.53.0": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz" + integrity sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA== + dependencies: + "@typescript-eslint/scope-manager" "5.57.1" + "@typescript-eslint/types" "5.57.1" + "@typescript-eslint/typescript-estree" "5.57.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz" + integrity sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw== + dependencies: + "@typescript-eslint/types" "5.57.1" + "@typescript-eslint/visitor-keys" "5.57.1" + +"@typescript-eslint/type-utils@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz" + integrity sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw== + dependencies: + "@typescript-eslint/typescript-estree" "5.57.1" + "@typescript-eslint/utils" "5.57.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz" + integrity sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA== + +"@typescript-eslint/typescript-estree@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz" + integrity sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw== + dependencies: + "@typescript-eslint/types" "5.57.1" + "@typescript-eslint/visitor-keys" "5.57.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz" + integrity sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.57.1" + "@typescript-eslint/types" "5.57.1" + "@typescript-eslint/typescript-estree" "5.57.1" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.57.1": + version "5.57.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz" + integrity sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA== + dependencies: + "@typescript-eslint/types" "5.57.1" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz" + integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== + +"@webpack-cli/info@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz" + integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== + +"@webpack-cli/serve@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz" + integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +author-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz" + integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001449: + version "1.0.30001473" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz" + integrity sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg== + +chalk@5.2.0, chalk@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.14, colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +"debounce-fn@github:julusian/debounce-fn#4.0.0-maxWaithack.0": + version "4.0.0-maxWaithack.0" + resolved "https://codeload.github.com/julusian/debounce-fn/tar.gz/3ca54d1526c19f541fe6f103abbceda31554caa9" + dependencies: + mimic-fn "^3.0.0" + +debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ejson@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/ejson/-/ejson-2.2.3.tgz" + integrity sha512-hsFvJp6OpGxFRQfBR3PSxFpaPALdHDY+SB3TRbMpLWNhvu8GzLiZutof5+/DFd2QekZo3KyXau75ngdJqQUSrw== + +electron-to-chromium@^1.4.284: + version "1.4.349" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.349.tgz" + integrity sha512-34LBfVDiL6byWorSmQOPwq4gD5wpN8Mhh5yPGQr67FbcxsfUS0BDJP9y6RykSgeWVUfSkN/2dChywnsrmKVyUg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +engine.io-client@~6.4.0: + version "6.4.0" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.0.3: + version "5.0.6" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.6.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-prettier@^4.0.0, eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^8.33.0, eslint@^8.34.0: + version "8.37.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz" + integrity sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.37.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.4.0" + espree "^9.5.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.1: + version "9.5.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter3@^4.0.4, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +from@~0: + version "0.1.7" + resolved "https://registry.npmjs.org/from/-/from-0.1.7.tgz" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.3: + version "13.1.3" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + 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== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.4: + 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== + dependencies: + isobject "^3.0.1" + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.1: + 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== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lint-staged@^13.1.2: + version "13.2.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.1.tgz#9d30a14e3e42897ef417bc98556fb757f75cae87" + integrity sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw== + dependencies: + chalk "5.2.0" + cli-truncate "^3.1.0" + commander "^10.0.0" + debug "^4.3.4" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.3" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.2.1" + +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.2.5" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@3.2.10: + version "3.2.10" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz" + integrity sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +object-inspect@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-timeout@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz" + integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-author@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz" + integrity sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw== + dependencies: + author-regex "^1.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pkg-dir@^4.2.0: + 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== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.3, prettier@^2.8.4: + version "2.8.7" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + 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== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.10.1, resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver@^6.1.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7: + 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== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +socket.io-client@^4.5.1: + version "4.6.1" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz" + integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.4.0" + socket.io-parser "~4.2.1" + +socket.io-parser@~4.2.1: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split@0.3: + version "0.3.3" + resolved "https://registry.npmjs.org/split/-/split-0.3.3.tgz" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.1.13: + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + +terser@^5.16.5: + version "5.16.8" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz" + integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@2, through@^2.3.8, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@~4.9.5: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +webpack-cli@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz" + integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.0.1" + "@webpack-cli/info" "^2.0.1" + "@webpack-cli/serve" "^2.0.1" + colorette "^2.0.14" + commander "^9.4.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.75.0: + version "5.77.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +webpod@^0: + version "0.0.2" + resolved "https://registry.npmjs.org/webpod/-/webpod-0.0.2.tgz" + integrity sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/which/-/which-3.0.0.tgz" + integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zx@^7.1.1: + version "7.2.1" + resolved "https://registry.npmjs.org/zx/-/zx-7.2.1.tgz" + integrity sha512-TgKwppaMLMNAXHhlhbBh7rMoOSx3/9qqnkv8frmhVlSomEuWkDijh/BCmYntkoS7ZQyemApAUyEi24jIrrS+hA== + dependencies: + "@types/fs-extra" "^11.0.1" + "@types/minimist" "^1.2.2" + "@types/node" "^18.14.2" + "@types/ps-tree" "^1.1.2" + "@types/which" "^2.0.2" + chalk "^5.2.0" + fs-extra "^11.1.0" + globby "^13.1.3" + minimist "^1.2.8" + node-fetch "3.2.10" + ps-tree "^1.2.0" + webpod "^0" + which "^3.0.0" + yaml "^2.2.1"