├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── .ignore ├── .npmignore ├── .prettierrc ├── README.md ├── examples ├── all.js ├── category.js └── get.js ├── package.json ├── rendered ├── count.txt ├── list.json └── list.min.json ├── scratch ├── render-complete-function-list.js ├── scrape-vmix-shortcut-reference-help-page.js └── scraped.html ├── src ├── categories │ ├── 01-general.ts │ ├── 02-audio │ │ ├── audio.ts │ │ ├── busses.ts │ │ ├── index.ts │ │ ├── master.ts │ │ ├── set.ts │ │ └── solo.ts │ ├── 03-transition.ts │ ├── 04-output.ts │ ├── 05-input │ │ ├── index.ts │ │ ├── layers.ts │ │ ├── set-cc.ts │ │ └── zoom.ts │ ├── 05-title.ts │ ├── 06-overlay.ts │ ├── 07-playlist.ts │ ├── 08-scripting.ts │ ├── 09-replay.ts │ ├── 10-ndi.ts │ ├── 11-ptz.ts │ ├── 12-preset.ts │ ├── 13-datasources.ts │ ├── 14-browser.ts │ └── index.ts ├── function-list.ts ├── index.ts └── types │ ├── input.ts │ ├── intermediate │ └── intermediate-vmix-function-definition.ts │ └── vmix-function-definition.ts ├── test └── function-list.test.js ├── tsconfig.json └── yarn.lock /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | # node-version: [12.x, 14.x, 16.x, 18.x] 20 | node-version: [18.x, 20.x] 21 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 22 | 23 | steps: 24 | - uses: actions/checkout@v2 25 | - name: Use Node.js ${{ matrix.node-version }} 26 | uses: actions/setup-node@v2 27 | with: 28 | node-version: ${{ matrix.node-version }} 29 | #cache: 'npm' 30 | - run: yarn install --frozen-lockfile 31 | - run: yarn test 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | *.pid.lock 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # nyc test coverage 22 | .nyc_output 23 | 24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 25 | .grunt 26 | 27 | # Bower dependency directory (https://bower.io/) 28 | bower_components 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (http://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directories 37 | node_modules/ 38 | jspm_packages/ 39 | 40 | # Output directory should be excluded 41 | dist 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | # scratch -------------------------------------------------------------------------------- /.ignore: -------------------------------------------------------------------------------- 1 | /rendered -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | rendered -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vmix-function-list 2 | Complete list of available functions in vMix. Structured list read out from https://www.vmix.com/help25/ShortcutFunctionReference.html and from inside vMix > Settings > Shortcuts. 3 | 4 | [![package json version](https://img.shields.io/github/package-json/v/jensstigaard/vmix-function-list.svg)](https://www.github/jensstigaard/vmix-function-list) 5 | [![npm version](https://badge.fury.io/js/vmix-function-list.svg)](https://www.npmjs.com/package/vmix-function-list) 6 | 7 | The version number of this repository reflects which version number of vMix the repository is updated for. 8 | 9 | When a new patch or version is released to vMix, it is the plan that I check through the help files (and/or vMix itself) for whether new functions has been added to the vMix API, and this function list will be updated accordingly. 10 | 11 | ## Methods 12 | `.all()` - Returns a complete list of available functions in the vMix API. 13 | 14 | `.category(category: string)` - Returns a list of available functions in a given category from the vMix API. 15 | 16 | `.get(function: string)` - Returns a single function with a given name from the vMix API. 17 | 18 | See examples or tests for more info. 19 | 20 | 21 | ## Rendered list 22 | In the `rendered/` directory you can find .json files of rendered complete list of function, either as minified or in regular format with indentation. 23 | 24 | 25 | # Installation and use 26 | 27 | ## As a dependency using npm 28 | The repo is published at npmjs, meaning that you can easily add the utilities as a dependency in your frontend project. 29 | Found here: https://www.npmjs.com/package/vmix-function-list 30 | ```sh 31 | npm install vmix-function-list --save # or 'yarn add vmix-function-list -d' 32 | ``` 33 | 34 | In your code the simplest way to import the module is the following: 35 | 36 | ```javascript 37 | const VmixFunctionList = require('vmix-function-list') 38 | 39 | // List of all functions 40 | console.log('All functions', VmixFunctionList.all()) 41 | 42 | // Get specific function (case-insensitive) 43 | console.log('Get specific function: Cut', VmixFunctionList.get('cut')) 44 | console.log('Get specific function: SetText', VmixFunctionList.get('SetText')) 45 | ``` 46 | 47 | 48 | ### Examples 49 | - [All](./examples/all.js) 50 | - [Get category](./examples/category.js) 51 | - [Get single function](./examples/get.js) 52 | 53 | --- 54 | 55 | 56 | # Authors 57 | [Jens Stigaard](https://github.com/jensstigaard) 58 | 59 | 60 | # Contribution 61 | You are more than welcome to contribute to the repository! 62 | If you find any inconsistencies or missing functions, you are welcome to tell about it in an issue or make a pull request with the desired changes. 63 | 64 | -------------------------------------------------------------------------------- /examples/all.js: -------------------------------------------------------------------------------- 1 | const { FunctionList } = require('../../dist/index').default 2 | 3 | const list = new FunctionList() 4 | 5 | console.log('The complete list of functions in the vMix API:') 6 | console.log(list.all()) 7 | -------------------------------------------------------------------------------- /examples/category.js: -------------------------------------------------------------------------------- 1 | const { FunctionList } = require('../../dist/index').default 2 | 3 | const list = new FunctionList() 4 | 5 | console.log(`The functions for 'Replay' in the vMix API:`) 6 | console.log(list.inCategory('Replay')) 7 | -------------------------------------------------------------------------------- /examples/get.js: -------------------------------------------------------------------------------- 1 | const { FunctionList } = require('../../dist/index').default 2 | 3 | const list = new FunctionList() 4 | 5 | console.log(`The function definition for 'SetText' in the vMix API:`) 6 | console.log(list.get('SetText')) 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vmix-function-list", 3 | "version": "27.0.1", 4 | "private": false, 5 | "description": "Complete function list for vMix. All available functions to call to the vMix API.", 6 | "main": "dist/index.js", 7 | "types": "dist/index.d.ts", 8 | "engines": { 9 | "node": ">= 18.x" 10 | }, 11 | "scripts": { 12 | "build": "tsc", 13 | "build-render": "yarn build && yarn render", 14 | "build-test": "yarn build && yarn test", 15 | "clean": "rm -ifr ./dist", 16 | "prepublish": "yarn clean && yarn build", 17 | "render": "node scratch/render-complete-function-list.js", 18 | "scrape": "node scratch/scrape-vmix-shortcut-reference-help-page.js", 19 | "test": "mocha" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/jensstigaard/vmix-function-list.git" 24 | }, 25 | "author": "", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/jensstigaard/vmix-function-list/issues" 29 | }, 30 | "homepage": "https://github.com/jensstigaard/vmix-function-list#readme", 31 | "dependencies": { 32 | "axios": "^1.1.3", 33 | "lodash": "^4.17.21", 34 | "xpath": "^0.0.32" 35 | }, 36 | "devDependencies": { 37 | "@types/lodash": "^4.14.188", 38 | "@types/mocha": "^10.0.0", 39 | "@types/node": "^14.14.35", 40 | "@xmldom/xmldom": "^0.8.6", 41 | "mocha": "^9.1.3", 42 | "typescript": "^4.4" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /rendered/count.txt: -------------------------------------------------------------------------------- 1 | 678 -------------------------------------------------------------------------------- /scratch/render-complete-function-list.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | 4 | const FunctionList = require('../dist/index').default 5 | 6 | const list = new FunctionList() 7 | 8 | const dir = path.resolve(__dirname, '../rendered') 9 | 10 | const destPathPrettyList = path.resolve(dir, 'list.json') 11 | const destPathMinifiedList = path.resolve(dir, 'list.min.json') 12 | const destPathCountNumOfFunctions = path.resolve(dir, 'count.txt') 13 | 14 | const funcs = list.all() 15 | 16 | console.log(`The complete list of (${funcs.length}) functions in the vMix API were saved to:`) 17 | 18 | // Save nicely formatted JSON to file 19 | // https://gist.github.com/collingo/6700069 20 | fs.writeFileSync(destPathPrettyList, JSON.stringify(funcs, null, 2)) 21 | console.log('(list pretty)', '\t\t\t', destPathPrettyList) 22 | 23 | // Minimised version JSON to file 24 | fs.writeFileSync(destPathMinifiedList, JSON.stringify(funcs)) 25 | console.log('(list minified)', '\t\t', destPathMinifiedList) 26 | 27 | // Minimised version JSON to file 28 | fs.writeFileSync(destPathCountNumOfFunctions, `${funcs.length}`) 29 | console.log('(count number of functions)\t', destPathCountNumOfFunctions) 30 | 31 | console.log() 32 | 33 | -------------------------------------------------------------------------------- /scratch/scrape-vmix-shortcut-reference-help-page.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const _ = require('lodash') 4 | const axios = require('axios') 5 | const xmldom = require('@xmldom/xmldom') 6 | const xpath = require('xpath') 7 | 8 | const vMixFunctionList = require('../dist/index').default 9 | 10 | const VMIX_VERSION = 27 11 | 12 | const existingFunctionList = new vMixFunctionList() 13 | 14 | const domparser = new xmldom.DOMParser( 15 | // https://stackoverflow.com/questions/56213117/how-to-silent-all-the-warning-messages-of-xml-dom-in-node-js 16 | { 17 | locator: {}, 18 | errorHandler: { 19 | warning: function (_w) { }, 20 | error: function (_e) { }, 21 | fatalError: function (e) { console.error(e) } 22 | } 23 | } 24 | ) 25 | 26 | const USE_LOCAL_DATA = false 27 | 28 | const EXTERNAL_DATA_URL = `https://www.vmix.com/help${VMIX_VERSION}/ShortcutFunctionReference.html` 29 | const LOCAL_DATA_PATH = path.resolve(__dirname, 'scraped.html') 30 | 31 | async function getExternalData() { 32 | const response = await axios.get(EXTERNAL_DATA_URL) 33 | 34 | if (!response.data) { 35 | console.error('No response data...') 36 | process.exit(1) 37 | } 38 | 39 | const data = response.data 40 | 41 | fs.writeFile(LOCAL_DATA_PATH, data, err => { 42 | if (err) throw err 43 | }) 44 | 45 | return data 46 | } 47 | 48 | function getLocalData() { 49 | return fs.readFileSync(LOCAL_DATA_PATH, 'utf-8') 50 | } 51 | 52 | console.log('Number of functions in existing function list:', existingFunctionList.all().length) 53 | 54 | /** 55 | * Main function 56 | * @returns 57 | */ 58 | async function main() { 59 | const data = USE_LOCAL_DATA ? getLocalData() : await getExternalData() 60 | 61 | const xml = domparser.parseFromString(data) 62 | 63 | const table = xpath.select1('//table', xml) 64 | 65 | if (!table) { 66 | console.error('No table found in the HTML response...') 67 | process.exit(1) 68 | } 69 | 70 | const rows = xpath.select('tr', table) 71 | console.log('Found rows in functions table:', rows.length) 72 | 73 | const newFunctions = [] 74 | 75 | let currentCategory = null 76 | rows.slice(1, rows.length).forEach(row => { 77 | const rowCells = xpath.select('td', row) 78 | 79 | if (rowCells.length !== 3) { 80 | console.log('Unexcepted number of cells found in row...') 81 | return 82 | } 83 | 84 | const firstCell = rowCells[0] 85 | const firstCellStyle = firstCell.attributes && firstCell.attributes.getNamedItem('style') ? firstCell.attributes.getNamedItem('style') : undefined 86 | 87 | // Is the row a header (including category title)? 88 | if (firstCellStyle && firstCellStyle.nodeValue.includes('background-color: #ccffcc;')) { 89 | const categoryTitle = firstCell.textContent.trim() 90 | // console.log('Row is including header', categoryTitle) 91 | currentCategory = categoryTitle 92 | return 93 | } 94 | 95 | // Guard no current category 96 | if (!currentCategory) { 97 | console.error('Somehow has not seen header yet...') 98 | console.log(rowCells.map(c => c.textContent)) 99 | return 100 | } 101 | 102 | const func = { 103 | category: currentCategory, 104 | functionName: rowCells[0].textContent.trim(), 105 | description: rowCells[1].textContent.trim(), 106 | parameters: rowCells[2].textContent.trim().split(',') 107 | } 108 | 109 | // Sanitize parameters 110 | func.parameters = func.parameters.filter(paramName => paramName !== 'None') 111 | 112 | // console.log(func.functionName) 113 | 114 | // Add func to array if not existing 115 | try { 116 | const existingFunc = existingFunctionList.get(func.functionName) 117 | 118 | const existingFuncParamsArr = Object.keys(existingFunc.parameters) 119 | 120 | const isParametersDifferent = !_.isEqual(func.parameters.sort(), existingFuncParamsArr.sort()) 121 | 122 | // Is parameters different? 123 | if (isParametersDifferent) { 124 | const previousParameters = _.difference(existingFuncParamsArr, func.parameters) 125 | const newParameters = _.difference(func.parameters, existingFuncParamsArr) 126 | 127 | // Check for SelectedIndex and SelectedValue/SelectedName being the missing parameters 128 | if (!( 129 | previousParameters.length === 2 && 130 | previousParameters.includes('SelectedIndex') && 131 | func.description.includes('SelectedIndex') && 132 | ( 133 | ( 134 | previousParameters.includes('SelectedValue') && 135 | func.description.includes('SelectedValue') 136 | ) 137 | || 138 | ( 139 | previousParameters.includes('SelectedName') && 140 | func.description.includes('SelectedName') 141 | ) 142 | ) 143 | )) { 144 | console.log( 145 | 'Function', func.functionName, 146 | 'in category', func.category, 147 | 'with description', 148 | `"${func.description}"`, 149 | 'has parameters mismatch', 150 | 'Existing=', existingFuncParamsArr, 'Scraped=', func.parameters) 151 | } 152 | } 153 | } catch (e) { 154 | newFunctions.push(func) 155 | } 156 | }) 157 | 158 | if (newFunctions.length === 0) { 159 | console.log('No new functions seen...') 160 | return 161 | } 162 | 163 | if (newFunctions.length === 0) { 164 | console.log('No new functions found...') 165 | return 166 | } 167 | 168 | console.log('Total number of new functions found:', newFunctions.length) 169 | 170 | const newfunctionsByCategory = Object.entries(_.groupBy(newFunctions, 'category')) 171 | 172 | console.log('') 173 | console.log('--- New functions found ---') 174 | 175 | // Print details for new functions 176 | newfunctionsByCategory.forEach(([category, functions]) => { 177 | console.log('') 178 | console.log('--', 'Category:', category, functions.length, '--') 179 | functions.forEach(f => { 180 | console.log(f.functionName) 181 | console.log(f.description) 182 | console.log('Params:', f.parameters) 183 | console.log('') 184 | }) 185 | console.log('') 186 | }) 187 | } 188 | 189 | main() 190 | 191 | -------------------------------------------------------------------------------- /src/categories/01-general.ts: -------------------------------------------------------------------------------- 1 | function SetDynamicValueEntries() { 2 | const [start, end] = [1, 4] 3 | 4 | const output: Record = {} 5 | 6 | // Iterate through the dynamic input entries 7 | for (let i = start; i <= end; i++) { 8 | output[`SetDynamicValue${i}`] = { 9 | description: `Set Dynamic Value to use when specifying DynamicInput${i} as a shortcut value`, 10 | parameters: { 11 | Value: 'string', 12 | }, 13 | } 14 | } 15 | 16 | return output 17 | } 18 | 19 | export default { 20 | ActivatorRefresh: 'Refresh all activator device lights and controls', 21 | 22 | CallManagerShowHide: 'Toggle show/hide of vMix call manager', 23 | 24 | KeyPress: { 25 | description: 'Force key press. To activate shortcuts', 26 | parameters: { 27 | Value: 'string', 28 | }, 29 | }, 30 | 31 | SendKeys: { 32 | description: 'Send keys to active window', 33 | parameters: { 34 | Value: 'string', 35 | }, 36 | }, 37 | 38 | ...SetDynamicValueEntries(), 39 | 40 | Undo: 'Undo closing Input.', 41 | } 42 | -------------------------------------------------------------------------------- /src/categories/02-audio/audio.ts: -------------------------------------------------------------------------------- 1 | // Description used multiple places 2 | const audioBussesDesc: string = 'Valid bus names M,A,B,C,D,E,F,G - Value can be mixed, e.g. MAB - to toggle MAB busses' 3 | 4 | export default { 5 | Audio: { 6 | description: 'Toggle Audio Mute On/Off for an Input', 7 | parameters: { 8 | Input: 'input' 9 | } 10 | }, 11 | 12 | AudioAuto: { 13 | description: 'Toggle AudioAuto (Audio Follow Video) On/Off for an Input', 14 | parameters: { 15 | Input: 'input' 16 | } 17 | }, 18 | 19 | AudioAutoOff: { 20 | description: 'Switch AudioAuto (Audio Follow Video) Off for an Input', 21 | parameters: { 22 | Input: 'input' 23 | } 24 | }, 25 | 26 | AudioAutoOn: { 27 | description: 'Switch AudioAuto (Audio Follow Video) On for an Input', 28 | parameters: { 29 | Input: 'input' 30 | } 31 | }, 32 | 33 | // Audio busses general functions 34 | AudioBus: { 35 | description: 'Toggle on/off Audio Bus(ses) for an Input', 36 | parameters: { 37 | Input: 'input', 38 | Value: { 39 | type: 'string', 40 | description: 'Busses to toggle. ' + audioBussesDesc 41 | } 42 | } 43 | }, 44 | 45 | AudioBusOff: { 46 | description: 'Switch off Audio Bus(ses) for an Input', 47 | parameters: { 48 | Input: 'input', 49 | Value: { 50 | type: 'string', 51 | description: 'Busses to switch off. ' + audioBussesDesc 52 | } 53 | } 54 | }, 55 | 56 | AudioBusOn: { 57 | description: 'Switch on Audio Bus(ses) for an Input', 58 | parameters: { 59 | Input: 'input', 60 | Value: { 61 | type: 'string', 62 | description: 'Busses to switch on. ' + audioBussesDesc 63 | } 64 | } 65 | }, 66 | 67 | AudioChannelMatrixApplyPreset: { 68 | description: 'Apply preset to channel matrix', 69 | parameters: { 70 | Input: 'input', 71 | Value: { 72 | type: 'string', 73 | description: 'Preset Name' 74 | } 75 | } 76 | }, 77 | 78 | AudioMixerShowHide: { 79 | description: 'Toggle show/hide of Audio Mixer panel', 80 | parameters: {} 81 | }, 82 | 83 | AudioOff: { 84 | description: 'Switch Audio off for an Input', 85 | parameters: { 86 | Input: 'input' 87 | } 88 | }, 89 | 90 | AudioOn: { 91 | description: 'Switch Audio on for an Input', 92 | parameters: { 93 | Input: 'input' 94 | } 95 | }, 96 | 97 | AudioPluginOff: { 98 | description: 'Switch off Audio Plugin for an Input', 99 | parameters: { 100 | Input: 'input', 101 | Value: { 102 | type: 'string', 103 | description: 'Plugin Number starting from 1' 104 | } 105 | } 106 | }, 107 | 108 | AudioPluginOn: { 109 | description: 'Switch on Audio Plugin for an Input', 110 | parameters: { 111 | Input: 'input', 112 | Value: { 113 | type: 'string', 114 | description: 'Plugin Number starting from 1' 115 | } 116 | } 117 | }, 118 | 119 | AudioPluginOnOff: { 120 | description: 'Toggle on/off Audio Plugin for an Input', 121 | parameters: { 122 | Input: 'input', 123 | Value: { 124 | type: 'string', 125 | description: 'Plugin Number starting from 1' 126 | } 127 | } 128 | }, 129 | 130 | AudioPluginShow: { 131 | description: 'Show Audio Plugin Editor', 132 | parameters: { 133 | Input: 'input', 134 | Value: { 135 | type: 'string', 136 | description: 'Plugin Number starting from 1' 137 | } 138 | } 139 | }, 140 | } -------------------------------------------------------------------------------- /src/categories/02-audio/busses.ts: -------------------------------------------------------------------------------- 1 | // Some generic audio busses functions are found under audio 2 | 3 | export default { 4 | // Bus A stuff 5 | BusAAudio: 'Toggle on/off Audio on Bus A', 6 | 7 | BusAAudioOff: 'Switch off Audio on Bus A', 8 | 9 | BusAAudioOn: 'Switch on Audio on Bus A', 10 | 11 | BusAAudioPluginOff: { 12 | description: 'Switch off Audio Plugin for Audio Bus A', 13 | parameters: { 14 | Value: { 15 | type: 'string', 16 | description: 'Plugin Number starting from 1' 17 | } 18 | } 19 | }, 20 | 21 | BusAAudioPluginOn: { 22 | description: 'Switch on Audio Plugin for Audio Bus A', 23 | parameters: { 24 | Value: { 25 | type: 'string', 26 | description: 'Plugin Number starting from 1' 27 | } 28 | } 29 | }, 30 | 31 | BusAAudioPluginOnOff: { 32 | description: 'Toggle on/off Audio Plugin for Audio Bus A', 33 | parameters: { 34 | Value: { 35 | type: 'string', 36 | description: 'Plugin Number starting from 1' 37 | } 38 | } 39 | }, 40 | 41 | BusAAudioPluginShow: { 42 | description: 'Show Audio Plugin Editor for plugin on Audio Bus A', 43 | parameters: { 44 | Value: { 45 | type: 'string', 46 | description: 'Plugin Number starting from 1' 47 | } 48 | } 49 | }, 50 | 51 | // Bus B stuff 52 | BusBAudio: 'Toggle on/off Audio on Bus B', 53 | 54 | BusBAudioOff: 'Switch off Audio on Bus B', 55 | 56 | BusBAudioOn: 'Switch on Audio on Bus B', 57 | 58 | BusBAudioPluginOff: { 59 | description: 'Switch off Audio Plugin for Audio Bus B', 60 | parameters: { 61 | Value: { 62 | type: 'number', 63 | description: 'Plugin Number starting from 1' 64 | } 65 | } 66 | }, 67 | 68 | BusBAudioPluginOn: { 69 | description: 'Switch on Audio Plugin for Audio Bus B', 70 | parameters: { 71 | Value: { 72 | type: 'number', 73 | description: 'Plugin Number starting from 1' 74 | } 75 | } 76 | }, 77 | 78 | BusBAudioPluginOnOff: { 79 | description: 'Toggle on/off Audio Plugin for Audio Bus B', 80 | parameters: { 81 | Value: { 82 | type: 'number', 83 | description: 'Plugin Number starting from 1' 84 | } 85 | } 86 | }, 87 | 88 | BusBAudioPluginShow: { 89 | description: 'Show Audio Plugin Editor for plugin on Audio Bus B', 90 | parameters: { 91 | Value: { 92 | type: 'number', 93 | description: 'Plugin Number starting from 1' 94 | } 95 | } 96 | }, 97 | 98 | 99 | // Bus X stuff 100 | BusXAudio: { 101 | description: 'Toggle on/off Audio on Bus X', 102 | parameters: { 103 | Value: { 104 | type: 'string', 105 | description: 'Bus name' 106 | } 107 | } 108 | }, 109 | 110 | BusXAudioOff: { 111 | description: 'Switch off Audio on Bus X', 112 | parameters: { 113 | Value: { 114 | type: 'string', 115 | description: 'Bus name' 116 | } 117 | } 118 | }, 119 | 120 | BusXAudioOn: { 121 | description: 'Switch on Audio on Bus X', 122 | parameters: { 123 | Value: { 124 | type: 'string', 125 | description: 'Bus name' 126 | } 127 | } 128 | }, 129 | 130 | BusXAudioPluginOff: { 131 | description: 'Switch off Audio Plugin for Audio Bus X', 132 | parameters: { 133 | Value: [ // Composite - separated by "," 134 | { 135 | type: 'string', 136 | description: 'Bus' 137 | }, { 138 | type: 'number', 139 | description: 'PluginNumber - Plugin Number starting from 1' 140 | } 141 | ] 142 | } 143 | }, 144 | 145 | BusXAudioPluginOn: { 146 | description: 'Switch on Audio Plugin for Audio Bus X', 147 | parameters: { 148 | Value: [ // Composite - separated by "," 149 | { 150 | type: 'string', 151 | description: 'Bus' 152 | }, { 153 | type: 'number', 154 | description: 'PluginNumber - Plugin Number starting from 1' 155 | } 156 | ] 157 | } 158 | }, 159 | 160 | BusXAudioPluginOnOff: { 161 | description: 'Toggle on/off Audio Plugin for Audio Bus X', 162 | parameters: { 163 | Value: [ // Composite - separated by "," 164 | { 165 | type: 'string', 166 | description: 'Bus' 167 | }, { 168 | type: 'number', 169 | description: 'PluginNumber - Plugin Number starting from 1' 170 | } 171 | ] 172 | } 173 | }, 174 | 175 | BusXAudioPluginShow: { 176 | description: 'Show Audio Plugin Editor for plugin on Audio Bus X', 177 | parameters: { 178 | Value: [ // Composite - separated by "," 179 | { 180 | type: 'string', 181 | description: 'Bus' 182 | }, { 183 | type: 'number', 184 | description: 'PluginNumber - Plugin Number starting from 1' 185 | } 186 | ] 187 | } 188 | }, 189 | 190 | BusXSendToMaster: { 191 | description: 'Toggle on/off whether audio from Bus X is mixed on Master', 192 | parameters: { 193 | Value: { 194 | type: 'string', 195 | description: 'Bus name' 196 | } 197 | } 198 | }, 199 | 200 | BusXSendToMasterOff: { 201 | description: 'Switch off whether audio from Bus X is mixed on Master', 202 | parameters: { 203 | Value: { 204 | type: 'string', 205 | description: 'Bus name' 206 | } 207 | } 208 | }, 209 | 210 | BusXSendToMasterOn: { 211 | description: 'Switch on whether audio from Bus X is mixed on Master', 212 | parameters: { 213 | Value: { 214 | type: 'string', 215 | description: 'Bus name' 216 | } 217 | } 218 | }, 219 | 220 | BusXSolo: { 221 | description: 'Toggle on/off solo on Bus X', 222 | parameters: { 223 | Value: { 224 | type: 'string', 225 | description: 'Bus name' 226 | } 227 | } 228 | }, 229 | 230 | BusXSoloOff: { 231 | description: 'Switch off solo on Bus X', 232 | parameters: { 233 | Value: { 234 | type: 'string', 235 | description: 'Bus name' 236 | } 237 | } 238 | }, 239 | 240 | BusXSoloOn: { 241 | description: 'Switch on solo on Bus X', 242 | parameters: { 243 | Value: { 244 | type: 'string', 245 | description: 'Bus name' 246 | } 247 | } 248 | } 249 | } -------------------------------------------------------------------------------- /src/categories/02-audio/index.ts: -------------------------------------------------------------------------------- 1 | import audio from './audio' 2 | import busses from './busses' 3 | import master from './master' 4 | import set from './set' 5 | import solo from './solo' 6 | 7 | export default { 8 | ...audio, 9 | ...busses, 10 | ...master, 11 | ...set, 12 | ...solo 13 | } -------------------------------------------------------------------------------- /src/categories/02-audio/master.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | MasterAudio: 'Toggle on/off Master audio', 3 | 4 | MasterAudioOff: 'Toggle off Master audio', 5 | 6 | MasterAudioOn: 'Toggle on Master audio', 7 | 8 | MasterAudioPluginOff: { 9 | description: 'Switch off Audio Plugin on Master', 10 | parameters: { 11 | Value: { 12 | type: 'number', 13 | description: 'Plugin Number starting from 1' 14 | } 15 | } 16 | }, 17 | 18 | MasterAudioPluginOn: { 19 | description: 'Switch on Audio Plugin on Master', 20 | parameters: { 21 | Value: { 22 | type: 'number', 23 | description: 'Plugin Number starting from 1' 24 | } 25 | } 26 | }, 27 | 28 | MasterAudioPluginOnOff: { 29 | description: 'Switch on/off Audio Plugin on Master', 30 | parameters: { 31 | Value: { 32 | type: 'number', 33 | description: 'Plugin Number starting from 1' 34 | } 35 | } 36 | }, 37 | 38 | MasterAudioPluginShow: { 39 | description: 'Show Audio Plugin on Master', 40 | parameters: { 41 | Value: { 42 | type: 'number', 43 | description: 'Plugin Number starting from 1' 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/categories/02-audio/set.ts: -------------------------------------------------------------------------------- 1 | function SetVolumeBusMixerEntries() { 2 | const busses = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'M'] 3 | const output: Record = {} 4 | 5 | for (const bus of busses) { 6 | output[`SetVolumeBusMixer${bus}`] = { 7 | description: `Set Volume of an Input's ${bus} Bus`, 8 | parameters: { 9 | Input: 'input', 10 | 11 | Value: { 12 | type: 'number', 13 | description: 'Volume between 0 to 100', 14 | }, 15 | }, 16 | } 17 | } 18 | 19 | return output 20 | } 21 | function SetVolumeChannelMixerEntries() { 22 | const [start, end] = [1, 16] 23 | const output: Record = {} 24 | 25 | for (let i = start; i <= end; i++) { 26 | output[`SetVolumeChannelMixer${i}`] = { 27 | description: `Set Volume of an Input\'s sub channel ${i}`, 28 | parameters: { 29 | Input: 'input', 30 | 31 | Value: { 32 | type: 'number', 33 | description: 'Volume between 0 to 100', 34 | }, 35 | }, 36 | } 37 | } 38 | 39 | return output 40 | } 41 | 42 | export default { 43 | SetBalance: { 44 | description: 'Set balance for input', 45 | parameters: { 46 | Input: 'input', 47 | Value: { 48 | type: 'number', 49 | description: 'Balance between -1 to 1', 50 | }, 51 | }, 52 | }, 53 | 54 | SetBusAVolume: { 55 | description: 'Set volume for Bus A', 56 | parameters: { 57 | Value: { 58 | type: 'number', 59 | description: 'Volume between 0 to 100', 60 | }, 61 | }, 62 | }, 63 | 64 | SetBusBVolume: { 65 | description: 'Set volume for Bus B', 66 | parameters: { 67 | Value: { 68 | type: 'number', 69 | description: 'Volume between 0 to 100', 70 | }, 71 | }, 72 | }, 73 | 74 | SetBusCVolume: { 75 | description: 'Set volume for Bus C', 76 | parameters: { 77 | Value: { 78 | type: 'number', 79 | description: 'Volume between 0 to 100', 80 | }, 81 | }, 82 | }, 83 | 84 | SetBusDVolume: { 85 | description: 'Set volume for Bus D', 86 | parameters: { 87 | Value: { 88 | type: 'number', 89 | description: 'Volume between 0 to 100', 90 | }, 91 | }, 92 | }, 93 | 94 | SetBusEVolume: { 95 | description: 'Set volume for Bus E', 96 | parameters: { 97 | Value: { 98 | type: 'number', 99 | description: 'Volume between 0 to 100', 100 | }, 101 | }, 102 | }, 103 | 104 | SetBusFVolume: { 105 | description: 'Set volume for Bus F', 106 | parameters: { 107 | Value: { 108 | type: 'number', 109 | description: 'Volume between 0 to 100', 110 | }, 111 | }, 112 | }, 113 | 114 | SetBusGVolume: { 115 | description: 'Set volume for Bus G', 116 | parameters: { 117 | Value: { 118 | type: 'number', 119 | description: 'Volume between 0 to 100', 120 | }, 121 | }, 122 | }, 123 | 124 | SetGain: { 125 | description: 'Set gain for Input', 126 | parameters: { 127 | Input: 'input', 128 | Value: { 129 | type: 'number', 130 | description: 'Gain (unit in dB) between 0 to 24', 131 | }, 132 | }, 133 | }, 134 | 135 | SetGainChannel1: { 136 | description: 'Set gain on channel 1 for Input', 137 | parameters: { 138 | Input: 'input', 139 | Value: { 140 | type: 'number', 141 | description: 'Gain (unit in dB) between 0 to 24', 142 | }, 143 | }, 144 | }, 145 | 146 | SetGainChannel2: { 147 | description: 'Set gain on channel 2 for Input', 148 | parameters: { 149 | Input: 'input', 150 | Value: { 151 | type: 'number', 152 | description: 'Gain (unit in dB) between 0 to 24', 153 | }, 154 | }, 155 | }, 156 | 157 | SetHeadphonesVolume: { 158 | description: 'Set volume for Headphones', 159 | parameters: { 160 | Value: { 161 | type: 'number', 162 | description: 'Volume between 0 to 100', 163 | }, 164 | }, 165 | }, 166 | 167 | SetMasterVolume: { 168 | description: 'Set volume for Master', 169 | parameters: { 170 | Value: { 171 | type: 'number', 172 | description: 'Volume between 0 to 100', 173 | }, 174 | }, 175 | }, 176 | 177 | SetVolume: { 178 | description: 'Set volume for Input', 179 | parameters: { 180 | Input: 'input', 181 | Value: { 182 | type: 'number', 183 | description: 'Volume between 0 to 100', 184 | }, 185 | }, 186 | }, 187 | 188 | // Added in vMix version 27 189 | SetVolumeBusMixer: { 190 | description: "Set Volume of an Input's Bus Mixer (M,A,B,C,D,E,F,G)", 191 | parameters: { 192 | Input: 'input', 193 | Value: { 194 | type: 'string', 195 | description: 'Bus,Volume 0-100', 196 | }, 197 | }, 198 | }, 199 | 200 | ...SetVolumeBusMixerEntries(), 201 | 202 | SetVolumeChannel1: { 203 | description: 204 | 'Set volume on channel 1 for Input. When using SeparateMono on an Audio Input, this can be used to set channel volumes independently', 205 | parameters: { 206 | Input: 'input', 207 | Value: { 208 | type: 'number', 209 | description: 'Volume between 0 to 100', 210 | }, 211 | }, 212 | }, 213 | 214 | SetVolumeChannel2: { 215 | description: 216 | 'Set volume on channel 2 for Input. When using SeparateMono on an Audio Input, this can be used to set channel volumes independently', 217 | parameters: { 218 | Input: 'input', 219 | Value: { 220 | type: 'number', 221 | description: 'Volume between 0 to 100', 222 | }, 223 | }, 224 | }, 225 | 226 | SetVolumeChannelMixer: { 227 | description: "Set Volume of an Input's sub channel", 228 | parameters: { 229 | Input: 'input', 230 | Value: [ 231 | // Composite - separated by "," 232 | { 233 | type: 'number', 234 | description: 'Channel between 1 to 16', 235 | }, 236 | { 237 | type: 'number', 238 | description: 'Volume between 0 to 100', 239 | }, 240 | ], 241 | }, 242 | }, 243 | 244 | ...SetVolumeChannelMixerEntries(), 245 | 246 | SetVolumeFade: { 247 | description: 'Set volume gradually over x milliseconds', 248 | parameters: { 249 | Input: 'input', 250 | Value: [ 251 | // Composite - separated by "," 252 | { 253 | type: 'number', 254 | description: 'Volume between 0 to 100', 255 | }, 256 | { 257 | type: 'number', 258 | description: 'Duration in milliseconds', 259 | }, 260 | ], 261 | }, 262 | }, 263 | } 264 | -------------------------------------------------------------------------------- /src/categories/02-audio/solo.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | Solo: { 3 | description: 'Toggle on/off solo (to headphones) of Input', 4 | parameters: { 5 | Input: 'input', 6 | }, 7 | }, 8 | 9 | SoloAllOff: 'Turn off Solo for all Inputs and Busses', 10 | 11 | SoloOff: { 12 | description: 'Toggle off solo (to headphones) of Input', 13 | parameters: { 14 | Input: 'input', 15 | }, 16 | }, 17 | 18 | SoloOn: { 19 | description: 'Toggle on solo (to headphones) of Input', 20 | parameters: { 21 | Input: 'input', 22 | }, 23 | }, 24 | 25 | SoloPFL: { 26 | description: 'Toggle between AFL or PFL mode for Solo', 27 | parameters: { 28 | Input: 'input', 29 | }, 30 | }, 31 | 32 | SoloPFLOff: { 33 | description: 'Turn off PFL mode for Solo', 34 | parameters: { 35 | Input: 'input', 36 | }, 37 | }, 38 | 39 | SoloPFLOn: { 40 | description: 'Turn on PFL mode for Solo', 41 | parameters: { 42 | Input: 'input', 43 | }, 44 | }, 45 | } 46 | -------------------------------------------------------------------------------- /src/categories/03-transition.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | CutDirect: { 3 | description: 'Cuts the input directly to Output without changing Preview', 4 | parameters: { 5 | Input: 'input' 6 | } 7 | }, 8 | 9 | FadeToBlack: 'Toggle FadeToBlack On/Off', 10 | 11 | QuickPlay: { 12 | description: 'Quick Play an Input to Output', 13 | parameters: { 14 | Input: 'input' 15 | } 16 | }, 17 | 18 | SetFader: { 19 | description: 'Set Master Fader T-Bar, 255 will cut to Preview', 20 | parameters: { 21 | Value: { 22 | type: 'number', 23 | description: 'Fader between 0 to 255' 24 | } 25 | } 26 | }, 27 | 28 | SetTransitionDuration1: { 29 | description: 'Change Transition Duration for Button 1', 30 | parameters: { 31 | Value: { 32 | type: 'number', 33 | description: 'Duration in milliseconds' 34 | } 35 | } 36 | }, 37 | 38 | SetTransitionDuration2: { 39 | description: 'Change Transition Duration for Button 2', 40 | parameters: { 41 | Value: { 42 | type: 'number', 43 | description: 'Duration in milliseconds' 44 | } 45 | } 46 | }, 47 | 48 | SetTransitionDuration3: { 49 | description: 'Change Transition Duration for Button 3', 50 | parameters: { 51 | Value: { 52 | type: 'number', 53 | description: 'Duration in milliseconds' 54 | } 55 | } 56 | }, 57 | 58 | SetTransitionDuration4: { 59 | description: 'Change Transition Duration for Button 4', 60 | parameters: { 61 | Value: { 62 | type: 'number', 63 | description: 'Duration in milliseconds' 64 | } 65 | } 66 | }, 67 | 68 | SetTransitionEffect1: { 69 | description: 'Change Transition for Button 1', 70 | parameters: { 71 | Value: { 72 | type: 'string', 73 | description: 'Transition name' 74 | } 75 | } 76 | }, 77 | 78 | SetTransitionEffect2: { 79 | description: 'Change Transition for Button 2', 80 | parameters: { 81 | Value: { 82 | type: 'string', 83 | description: 'Transition name' 84 | } 85 | } 86 | }, 87 | 88 | SetTransitionEffect3: { 89 | description: 'Change Transition for Button 3', 90 | parameters: { 91 | Value: { 92 | type: 'string', 93 | description: 'Transition name' 94 | } 95 | } 96 | }, 97 | 98 | SetTransitionEffect4: { 99 | description: 'Change Transition for Button 4', 100 | parameters: { 101 | Value: { 102 | type: 'string', 103 | description: 'Transition name' 104 | } 105 | } 106 | }, 107 | 108 | Stinger1: { 109 | description: 'Perform Stinger 1 transition to given Input', 110 | parameters: { 111 | Input: 'input' 112 | } 113 | }, 114 | 115 | Stinger2: { 116 | description: 'Perform Stinger 2 transition to given Input', 117 | parameters: { 118 | Input: 'input' 119 | } 120 | }, 121 | 122 | Stinger3: { 123 | description: 'Perform Stinger 3 transition to given Input', 124 | parameters: { 125 | Input: 'input' 126 | } 127 | }, 128 | 129 | Stinger4: { 130 | description: 'Perform Stinger 4 transition to given Input', 131 | parameters: { 132 | Input: 'input' 133 | } 134 | }, 135 | 136 | Transition1: 'Clicks the first Transition button in the main vMix window - transitions to what is in preview', 137 | // Transition1: { 138 | // description: 'Clicks the first Transition button in the main vMix window - transitions to what is in preview', 139 | // parameters: { 140 | // Input: 'input' 141 | // } 142 | // }, 143 | 144 | Transition2: 'Clicks the second Transition button in the main vMix window - transitions to what is in preview', 145 | // Transition2: { 146 | // description: 'Clicks the second Transition button in the main vMix window - transitions to what is in preview', 147 | // parameters: { 148 | // Input: 'input' 149 | // } 150 | // }, 151 | 152 | Transition3: 'Clicks the third Transition button in the main vMix window - transitions to what is in preview', 153 | // Transition3: { 154 | // description: 'Clicks the third Transition button in the main vMix window - transitions to what is in preview', 155 | // parameters: { 156 | // Input: 'input' 157 | // } 158 | // }, 159 | 160 | Transition4: 'Clicks the fourth Transition button in the main vMix window - transitions to what is in preview', 161 | // Transition4: { 162 | // description: 'Clicks the fourth Transition button in the main vMix window - transitions to what is in preview', 163 | // parameters: { 164 | // Input: 'input' 165 | // } 166 | // }, 167 | 168 | // These transition functions are somehow not mentioned in the vMix help documentation. 169 | // They are present inside vMix under Transition category when setting up a shortcut 170 | 171 | Fade: { 172 | description: 'Fade transition', 173 | parameters: { 174 | Input: 'input', 175 | Duration: 'number' 176 | } 177 | }, 178 | 179 | Zoom: { 180 | description: 'Zoom transition', 181 | parameters: { 182 | Input: 'input', 183 | Duration: 'number' 184 | } 185 | }, 186 | 187 | Wipe: { 188 | description: 'Wipe transition', 189 | parameters: { 190 | Input: 'input', 191 | Duraion: 'number' 192 | } 193 | }, 194 | 195 | Slide: { 196 | description: 'Slide transition', 197 | parameters: { 198 | Input: 'input', 199 | Duraion: 'number' 200 | } 201 | }, 202 | 203 | Fly: { 204 | description: 'Fly transition', 205 | parameters: { 206 | Input: 'input', 207 | Duraion: 'number' 208 | } 209 | }, 210 | 211 | CrossZoom: { 212 | description: 'CrossZoom transition', 213 | parameters: { 214 | Input: 'input', 215 | Duraion: 'number' 216 | } 217 | }, 218 | 219 | FlyRotate: { 220 | description: 'FlyRotate transition', 221 | parameters: { 222 | Input: 'input', 223 | Duraion: 'number' 224 | } 225 | }, 226 | 227 | Cube: { 228 | description: 'Cube transition', 229 | parameters: { 230 | Input: 'input', 231 | Duraion: 'number' 232 | } 233 | }, 234 | 235 | CubeZoom: { 236 | description: 'CubeZoom transition', 237 | parameters: { 238 | Input: 'input', 239 | Duraion: 'number' 240 | } 241 | }, 242 | 243 | VerticalWipe: { 244 | description: 'VerticalWipe transition', 245 | parameters: { 246 | Input: 'input', 247 | Duraion: 'number' 248 | } 249 | }, 250 | 251 | VerticalSlide: { 252 | description: 'VerticalSlide transition', 253 | parameters: { 254 | Input: 'input', 255 | Duraion: 'number' 256 | } 257 | }, 258 | 259 | Merge: { 260 | description: 'Merge transition', 261 | parameters: { 262 | Input: 'input', 263 | Duration: 'number' 264 | } 265 | }, 266 | 267 | WipeReverse: { 268 | description: 'WipeReverse transition', 269 | parameters: { 270 | Input: 'input', 271 | Duration: 'number' 272 | } 273 | }, 274 | 275 | SlideReverse: { 276 | description: 'SlideReverse transition', 277 | parameters: { 278 | Input: 'input', 279 | Duration: 'number' 280 | } 281 | }, 282 | 283 | VerticalWipeReverse: { 284 | description: 'VerticalWipeReverse transition', 285 | parameters: { 286 | Input: 'input', 287 | Duration: 'number' 288 | } 289 | }, 290 | VerticalSlideReverse: { 291 | description: 'VerticalSlideReverse transition', 292 | parameters: { 293 | Input: 'input', 294 | Duration: 'number' 295 | } 296 | }, 297 | 298 | Cut: { 299 | description: 'Cut transition', 300 | parameters: { 301 | Input: 'input', 302 | } 303 | }, 304 | } 305 | -------------------------------------------------------------------------------- /src/categories/04-output.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | Fullscreen: 'Toggle on/off fullscreen', 4 | 5 | FullscreenOff: 'Switch off fullscreen', 6 | 7 | FullscreenOn: 'Switch on fullscreen', 8 | 9 | SetOutput2: { 10 | description: 'Change what is displayed on Output 2', 11 | parameters: { 12 | Value: { 13 | type: 'string', 14 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 15 | }, 16 | Input: { 17 | type: 'input', 18 | description: 'When the Value parameter is Inout, the Input parameter must be set to a valid Input number, name or UUID', 19 | optional: true 20 | }, 21 | } 22 | }, 23 | SetOutput3: { 24 | description: 'Change what is displayed on Output 3', 25 | parameters: { 26 | Value: { 27 | type: 'string', 28 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 29 | }, 30 | Input: { 31 | type: 'input', 32 | optional: true 33 | }, 34 | } 35 | }, 36 | SetOutput4: { 37 | description: 'Change what is displayed on Output 4', 38 | parameters: { 39 | Value: { 40 | type: 'string', 41 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 42 | }, 43 | Input: { 44 | type: 'input', 45 | optional: true 46 | }, 47 | } 48 | }, 49 | SetOutputFullscreen: { 50 | description: 'Change what is displayed on the Fullscreen output', 51 | parameters: { 52 | Value: { 53 | type: 'string', 54 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 55 | }, 56 | Input: { 57 | type: 'input', 58 | optional: true 59 | }, 60 | } 61 | }, 62 | SetOutputFullscreen2: { 63 | description: 'Change what is displayed on the Fullscreen2 output', 64 | parameters: { 65 | Value: { 66 | type: 'string', 67 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 68 | }, 69 | Input: { 70 | type: 'input', 71 | optional: true 72 | }, 73 | } 74 | }, 75 | 76 | SetOutputExternal2: { 77 | description: 'Change what is displayed on the External2 output.', 78 | parameters: { 79 | Value: { 80 | type: 'string', 81 | description: 'Can be set to one of the following values: Output, Preview, MultiView, Input. When the value is Input, also the Input parameter must be set to a valid Input number, name or UUID' 82 | }, 83 | Input: { 84 | type: 'input', 85 | optional: true 86 | }, 87 | } 88 | }, 89 | 90 | 91 | Snapshot: { 92 | description: 'Create a snapshot image of the current Output. Optional Value specifies save Filename, otherwise a save file window will appear. Filename can specify date, for example mysnapshot {0:dd MMM yyyy}.jpg', 93 | parameters: { 94 | Value: { 95 | type: 'string', 96 | optional: true 97 | } 98 | } 99 | }, 100 | 101 | SnapshotInput: { 102 | description: 'Create a snapshot image of the selected Input. Optional Value specifies save Filename, otherwise a save file window will appear. Filename can specify date, for example mysnapshot {0:dd MMM yyyy}.jpg', 103 | parameters: { 104 | Input: 'input', 105 | Value: { 106 | type: 'string', 107 | optional: true 108 | } 109 | } 110 | }, 111 | 112 | StartExternal: 'Start external output', 113 | 114 | StartMultiCorder: 'Start MultiCorder', 115 | 116 | StartRecording: 'Start recording', 117 | 118 | StartSRTOutput: { 119 | description: 'Optional output number starting from 0. Leave blank to control Output 1 only.', 120 | parameters: { 121 | Value: { 122 | type: 'number', 123 | optional: true, 124 | description: 'Optional output number starting from 0. Leave blank to control all streams' 125 | } 126 | } 127 | }, 128 | 129 | StartStopSRTOutput: { 130 | description: 'Optional output number starting from 0. Leave blank to control Output 1 only.', 131 | parameters: { 132 | Value: { 133 | type: 'number', 134 | optional: true, 135 | description: 'Optional output number starting from 0. Leave blank to control all streams' 136 | } 137 | } 138 | }, 139 | 140 | StopSRTOutput: { 141 | description: 'Optional output number starting from 0. Leave blank to control Output 1 only.', 142 | parameters: { 143 | Value: { 144 | type: 'number', 145 | optional: true, 146 | description: 'Optional output number starting from 0. Leave blank to control all streams' 147 | } 148 | } 149 | }, 150 | 151 | StartStopExternal: 'Toggle start/stop external output', 152 | 153 | StartStopMultiCorder: 'Toggle start/stop MultiCorder', 154 | 155 | StartStopRecording: 'Toggle start/stop recording', 156 | 157 | StartStopStreaming: { 158 | description: 'Toggle start/stop streaming (of one specific or all configured streams)', 159 | parameters: { 160 | Value: { 161 | type: 'number', 162 | optional: true, 163 | description: 'Optional stream number starting from 0. Leave blank to control all streams' 164 | } 165 | } 166 | }, 167 | 168 | StartStreaming: { 169 | description: 'Start streaming (of one specific or all configured streams)', 170 | parameters: { 171 | Value: { 172 | type: 'number', 173 | optional: true, 174 | description: 'Optional stream number starting from 0. Leave blank to control all streams' 175 | } 176 | } 177 | }, 178 | 179 | StopExternal: 'Stop external output', 180 | StopMultiCorder: 'Stop MultiCorder', 181 | StopRecording: 'Stop recording', 182 | 183 | StopStreaming: { 184 | description: 'Stop streaming (of one specific or all configured streams)', 185 | parameters: { 186 | Value: { 187 | type: 'number', 188 | optional: true, 189 | description: 'Optional stream number starting from 0. Leave blank to control all streams' 190 | } 191 | } 192 | }, 193 | 194 | StreamingSetKey: { 195 | description: 'Set Key on Custom RTMP Stream', 196 | parameters: { 197 | Value: { 198 | type: 'string', 199 | description: 'Optional stream number starting from 0 at start followed by comma, e.g. 0,mystreamkey' 200 | } 201 | } 202 | }, 203 | 204 | StreamingSetPassword: { 205 | description: 'Set Password on Custom RTMP Stream', 206 | parameters: { 207 | Value: { 208 | type: 'string', 209 | description: 'Optional stream number starting from 0 at start followed by comma, e.g 0,password' 210 | } 211 | } 212 | }, 213 | 214 | StreamingSetURL: { 215 | description: 'Set URL on Custom RTMP Stream', 216 | parameters: { 217 | Value: { 218 | type: 'string', 219 | description: 'Optional stream number starting from 0 at start followed by comma, e.g 0,rtmp://myurl/' 220 | } 221 | } 222 | }, 223 | 224 | StreamingSetUsername: { 225 | description: 'Set Username on Custom RTMP Stream', 226 | parameters: { 227 | Value: { 228 | type: 'string', 229 | description: 'Optional stream number starting from 0 at start followed by comma, e.g 0,username' 230 | } 231 | } 232 | }, 233 | 234 | WriteDurationToRecordingLog: { 235 | description: 'Write current recording duration to log file with optional tag text Value', 236 | parameters: { 237 | Value: { 238 | type: 'string', 239 | description: 'Tag Text' 240 | } 241 | } 242 | }, 243 | } -------------------------------------------------------------------------------- /src/categories/05-input/index.ts: -------------------------------------------------------------------------------- 1 | import SetCC from './set-cc' 2 | import Layers from './layers' 3 | import Zoom from './zoom' 4 | 5 | function SetLayerEntries() { 6 | const [start, end] = [1, 10] 7 | 8 | const output: Record = {} 9 | 10 | const parameters = { 11 | Input: 'input', 12 | Value: 'string', 13 | } 14 | 15 | const map = { 16 | Crop: `Change current Crop value of Input Layer. 17 | 18 | X1,Y1,X2,Y2 19 | 20 | Value = X1,Y2,X2,Y2`, 21 | CropX1: `Change current Crop X1 value of Input Layer. 22 | 23 | 1=No Crop, 0=Full Crop 24 | 25 | Value = Y2 0-1`, 26 | CropX2: `Change current Crop X2 value of Input Layer. 27 | 28 | 1=No Crop, 0=Full Crop 29 | 30 | Value = Y2 0-1`, 31 | CropY1: `Change current Crop Y1 value of Input Layer. 32 | 33 | 1=No Crop, 0=Full Crop 34 | 35 | Value = Y2 0-1`, 36 | CropY2: `Change current Crop Y2 value of Input Layer. 37 | 38 | 1=No Crop, 0=Full Crop 39 | 40 | Value = Y2 0-1`, 41 | Height: `Change current Height value of Input Layer. 42 | 43 | In pixels based on preset resolution 44 | 45 | Value = Pixels -4096-4096`, 46 | PanX: `Change current PanX value of Input Layer. 47 | 48 | 0=centered, -2=100% to bottom, 2=100% to top 49 | 50 | Value = Pan -2-2`, 51 | PanY: `Change current PanY value of Input Layer. 52 | 53 | 0=centered, -2=100% to bottom, 2=100% to top 54 | 55 | Value = Pan -2-2`, 56 | Rectangle: `Change current Rectangle values of Input Layer in pixels. 57 | 58 | X,Y,Width,Height 59 | 60 | Value = X,Y,Width,Height`, 61 | Width: `Change current Width value of Input Layer. 62 | 63 | In pixels based on preset resolution 64 | 65 | Value = Pixels -4096-4096`, 66 | X: `Change current X value of Input Layer. 67 | 68 | In pixels based on preset resolution 69 | 70 | Value = Pixels -4096-4096`, 71 | Y: `Change current Y value of Input Layer. 72 | 73 | In pixels based on preset resolution 74 | 75 | Value = Pixels -4096-4096`, 76 | Zoom: `Change current Zoom level of Input Layer. 77 | 78 | 1=100%, 0.5=50%, 2=200% 79 | 80 | Value = Zoom 0-5`, 81 | } 82 | 83 | // Iterate through the dynamic input entries 84 | for (let i = start; i <= end; i++) { 85 | const prefix = `SetLayer${i}` 86 | 87 | for (const [type, desc] of Object.entries(map)) { 88 | output[`${prefix}${type}`] = { 89 | description: desc, 90 | parameters, 91 | } 92 | } 93 | } 94 | 95 | return output 96 | } 97 | 98 | export default { 99 | ActiveInput: { 100 | description: 'Send to Output the selected Input', 101 | parameters: { 102 | Input: 'input', 103 | }, 104 | }, 105 | 106 | AddInput: { 107 | description: `Create a new Input based on information provided in Value. 108 | Examples of types: 109 | Video|c:\path\to\video.avi 110 | Image|c:\path\to\image.jpg 111 | Photos|c:\path\to\folder 112 | Xaml|c:\path\to\title.xaml 113 | VideoList|c:\path\to\playlist.m3u 114 | Colour|HTMLColor 115 | AudioFile|c:\path\to\audio.wav 116 | Flash|c:\path\to\flash.swf 117 | PowerPoint|c:\path\to\powerpoint.pptx 118 | `, 119 | parameters: { 120 | Value: [ 121 | // Composite value 122 | { 123 | type: 'string', 124 | description: 'Type', 125 | }, 126 | { 127 | type: 'string', 128 | description: 'Filename', 129 | }, 130 | ], 131 | }, 132 | }, 133 | 134 | AutoPauseOff: { 135 | description: 'Auto Pause off for Input', 136 | parameters: { 137 | Input: 'input', 138 | }, 139 | }, 140 | 141 | AutoPauseOn: { 142 | description: 'Auto Pause on for Input', 143 | parameters: { 144 | Input: 'input', 145 | }, 146 | }, 147 | 148 | AutoPlayFirst: { 149 | description: 150 | 'Toggle automatically playing first item in a List with Transition', 151 | parameters: { 152 | Input: 'input', 153 | }, 154 | }, 155 | 156 | AutoPlayFirstOff: { 157 | description: 158 | 'Switch off automatically playing first item in a List with Transition', 159 | parameters: { 160 | Input: 'input', 161 | }, 162 | }, 163 | 164 | AutoPlayFirstOn: { 165 | description: 166 | 'Switch on automatically playing first item in a List with Transition', 167 | parameters: { 168 | Input: 'input', 169 | }, 170 | }, 171 | 172 | AutoPlayNext: { 173 | description: 'Toggle automatically playing next item in a List', 174 | parameters: { 175 | Input: 'input', 176 | }, 177 | }, 178 | 179 | AutoPlayNextOff: { 180 | description: 'Switch Off automatically playing next item in a List', 181 | parameters: { 182 | Input: 'input', 183 | }, 184 | }, 185 | 186 | AutoPlayNextOn: { 187 | description: 'Switch On automatically playing next item in a List', 188 | parameters: { 189 | Input: 'input', 190 | }, 191 | }, 192 | 193 | AutoPlayOff: { 194 | description: 'Switch Off automatically playing on transition', 195 | parameters: { 196 | Input: 'input', 197 | }, 198 | }, 199 | 200 | AutoPlayOn: { 201 | description: 'Switch On automatically playing on transition', 202 | parameters: { 203 | Input: 'input', 204 | }, 205 | }, 206 | 207 | AutoRestartOff: { 208 | description: 'Switch Off automatically restarting on transition', 209 | parameters: { 210 | Input: 'input', 211 | }, 212 | }, 213 | 214 | AutoRestartOn: { 215 | description: 'Switch On automatically restarting on transition', 216 | parameters: { 217 | Input: 'input', 218 | }, 219 | }, 220 | 221 | ColourCorrectionAuto: { 222 | description: 'Perform Basic Auto Colour Correction for Input', 223 | parameters: { 224 | Input: 'input', 225 | }, 226 | }, 227 | 228 | ColourCorrectionReset: { 229 | description: 'Reset Colour Correction for Input', 230 | parameters: { 231 | Input: 'input', 232 | }, 233 | }, 234 | 235 | CreateVirtualInput: { 236 | description: 'Create Virtual Input based on existing input', 237 | parameters: { 238 | Input: 'input', 239 | }, 240 | }, 241 | 242 | DeinterlaceOff: { 243 | description: 'Switch off deinterlacing for Input', 244 | parameters: { 245 | Input: 'input', 246 | }, 247 | }, 248 | 249 | DeinterlaceOn: { 250 | description: 'Switch on deinterlacing for Input', 251 | parameters: { 252 | Input: 'input', 253 | }, 254 | }, 255 | 256 | Effect1: { 257 | description: 'Toggle Effect 1 on/off', 258 | parameters: { 259 | Input: 'input', 260 | }, 261 | }, 262 | 263 | Effect1Off: { 264 | description: 'Turn off Effect 1', 265 | parameters: { 266 | Input: 'input', 267 | }, 268 | }, 269 | 270 | Effect1On: { 271 | description: 'Turn on Effect 1', 272 | parameters: { 273 | Input: 'input', 274 | }, 275 | }, 276 | 277 | Effect2: { 278 | description: 'Toggle Effect 2 on/off', 279 | parameters: { 280 | Input: 'input', 281 | }, 282 | }, 283 | 284 | Effect2Off: { 285 | description: 'Turn off Effect 2', 286 | parameters: { 287 | Input: 'input', 288 | }, 289 | }, 290 | 291 | Effect2On: { 292 | description: 'Turn on Effect 2', 293 | parameters: { 294 | Input: 'input', 295 | }, 296 | }, 297 | 298 | Effect3: { 299 | description: 'Toggle Effect 3 on/off', 300 | parameters: { 301 | Input: 'input', 302 | }, 303 | }, 304 | 305 | Effect3Off: { 306 | description: 'Turn off Effect 3', 307 | parameters: { 308 | Input: 'input', 309 | }, 310 | }, 311 | 312 | Effect3On: { 313 | description: 'Turn on Effect 3', 314 | parameters: { 315 | Input: 'input', 316 | }, 317 | }, 318 | 319 | Effect4: { 320 | description: 'Toggle Effect 4 on/off', 321 | parameters: { 322 | Input: 'input', 323 | }, 324 | }, 325 | 326 | Effect4Off: { 327 | description: 'Turn off Effect 4', 328 | parameters: { 329 | Input: 'input', 330 | }, 331 | }, 332 | 333 | Effect4On: { 334 | description: 'Turn on Effect 4', 335 | parameters: { 336 | Input: 'input', 337 | }, 338 | }, 339 | 340 | InputPreviewHide: { 341 | description: 'Hides large preview of input', 342 | parameters: { 343 | Input: 'input', 344 | }, 345 | }, 346 | 347 | InputPreviewShow: { 348 | description: 'Shows large preview of input', 349 | parameters: { 350 | Input: 'input', 351 | }, 352 | }, 353 | 354 | InputPreviewShowHide: { 355 | description: 'Toggles large preview of input', 356 | parameters: { 357 | Input: 'input', 358 | }, 359 | }, 360 | 361 | ...Layers, 362 | 363 | ListAdd: { 364 | description: 'Add Filename to List', 365 | parameters: { 366 | Input: { 367 | type: 'input', 368 | description: 'List Input', 369 | }, 370 | Value: { 371 | type: 'string', 372 | description: 'Filename to be added to list', 373 | }, 374 | }, 375 | }, 376 | 377 | ListExport: { 378 | description: 'Export List as M3U file', 379 | parameters: { 380 | Input: { 381 | type: 'input', 382 | description: 'List Input', 383 | }, 384 | Value: { 385 | type: 'string', 386 | description: 'Filename of exported file', 387 | }, 388 | }, 389 | }, 390 | 391 | ListPlayOut: { 392 | description: 'Play out list input', 393 | parameters: { 394 | Input: 'input', 395 | }, 396 | }, 397 | 398 | ListRemove: { 399 | description: 'Remove from List by Index', 400 | parameters: { 401 | Input: { 402 | type: 'input', 403 | description: 'List Input', 404 | }, 405 | Value: { 406 | type: 'number', 407 | description: 'Index starting from 1', 408 | }, 409 | }, 410 | }, 411 | 412 | ListRemoveAll: { 413 | description: 'Remove all items from List', 414 | parameters: { 415 | Input: 'input', 416 | }, 417 | }, 418 | 419 | ListShowHide: { 420 | description: 'Toggle show/hide list', 421 | parameters: { 422 | Input: 'input', 423 | }, 424 | }, 425 | 426 | ListShuffle: { 427 | description: 'Toggle Shuffle (randomize) List', 428 | parameters: { 429 | Input: 'input', 430 | }, 431 | }, 432 | 433 | LivePlayPause: { 434 | description: 'Toggle Live/Pause of Input', 435 | parameters: { 436 | Input: 'input', 437 | }, 438 | }, 439 | 440 | Loop: { 441 | description: 'Toogle looping of Input', 442 | parameters: { 443 | Input: 'input', 444 | }, 445 | }, 446 | 447 | LoopOff: { 448 | description: 'Switch off looping of Input', 449 | parameters: { 450 | Input: 'input', 451 | }, 452 | }, 453 | 454 | LoopOn: { 455 | description: 'Switch on looping of Input', 456 | parameters: { 457 | Input: 'input', 458 | }, 459 | }, 460 | 461 | MarkIn: { 462 | description: 'Mark in on current position for Input', 463 | parameters: { 464 | Input: 'input', 465 | }, 466 | }, 467 | 468 | MarkOut: { 469 | description: 'Mark out on current position for Input', 470 | parameters: { 471 | Input: 'input', 472 | }, 473 | }, 474 | 475 | MarkReset: { 476 | description: 'Reset Mark in and out for Input', 477 | parameters: { 478 | Input: 'input', 479 | }, 480 | }, 481 | 482 | MarkResetIn: { 483 | description: 'Reset Mark in for Input', 484 | parameters: { 485 | Input: 'input', 486 | }, 487 | }, 488 | 489 | MarkResetOut: { 490 | description: 'Reset Mark out for Input', 491 | parameters: { 492 | Input: 'input', 493 | }, 494 | }, 495 | 496 | MirrorOff: { 497 | description: 'Switch off mirror for Input', 498 | parameters: { 499 | Input: 'input', 500 | }, 501 | }, 502 | 503 | MirrorOn: { 504 | description: 'Switch on mirror for Input', 505 | parameters: { 506 | Input: 'input', 507 | }, 508 | }, 509 | 510 | MoveInput: { 511 | description: 'Move Input', 512 | parameters: { 513 | Input: 'input', 514 | Value: { 515 | type: 'number', 516 | description: 'New input number starting from 1', 517 | }, 518 | }, 519 | }, 520 | 521 | MoveLayer: { 522 | description: 'Move Layer in Input according to Value parameter', 523 | parameters: { 524 | Input: 'input', 525 | Value: [ 526 | // Composite 527 | { 528 | type: 'number', 529 | description: 'FromIndex (starting at 1)', 530 | }, 531 | { 532 | type: 'number', 533 | description: 'ToIndex (starting at 1)', 534 | }, 535 | ], 536 | }, 537 | }, 538 | 539 | NextItem: { 540 | description: 'Move to next item in List', 541 | parameters: { 542 | Input: 'input', 543 | }, 544 | }, 545 | 546 | NextPicture: { 547 | description: 'Move to Next Picture for Photo and PowerPoint Inputs', 548 | parameters: { 549 | Input: 'input', 550 | }, 551 | }, 552 | 553 | Pause: { 554 | description: 'Pause input', 555 | parameters: { 556 | Input: 'input', 557 | }, 558 | }, 559 | 560 | Play: { 561 | description: 'Play input', 562 | parameters: { 563 | Input: 'input', 564 | }, 565 | }, 566 | 567 | PlayPause: { 568 | description: 'Toggle play/pause for input', 569 | parameters: { 570 | Input: 'input', 571 | }, 572 | }, 573 | 574 | PreviewInput: { 575 | description: 'Send selected input to Preview', 576 | parameters: { 577 | Input: 'input', 578 | }, 579 | }, 580 | 581 | PreviewInputNext: 'Send the next Input to Preview', 582 | 583 | PreviewInputPrevious: 'Send the previous Input to Preview', 584 | 585 | PreviousItem: { 586 | description: 'Move to previous item in List', 587 | parameters: { 588 | Input: 'input', 589 | }, 590 | }, 591 | 592 | PreviousPicture: { 593 | description: 'Move to Previous Picture for Photo and PowerPoint Inputs', 594 | parameters: { 595 | Input: 'input', 596 | }, 597 | }, 598 | 599 | RemoveInput: { 600 | description: 'Remove input', 601 | parameters: { 602 | Input: 'input', 603 | }, 604 | }, 605 | 606 | ResetInput: { 607 | description: 'Reset input', 608 | parameters: { 609 | Input: 'input', 610 | }, 611 | }, 612 | 613 | Restart: { 614 | description: 'Restart input', 615 | parameters: { 616 | Input: 'input', 617 | }, 618 | }, 619 | 620 | SaveVideoDelay: { 621 | description: 'Save video clip from Video Delay', 622 | parameters: { 623 | Input: 'input', 624 | Duration: { 625 | type: 'number', 626 | description: 'In milliseconds', 627 | }, 628 | }, 629 | }, 630 | 631 | SelectCategory: { 632 | description: 'Select category of inputs', 633 | parameters: { 634 | Value: { 635 | type: 'string', 636 | description: 'Name of caregory', 637 | }, 638 | }, 639 | }, 640 | 641 | SelectIndex: { 642 | description: 643 | 'Photos,List: Selects item in List according to Value starting from number 1. Virtual Set: Zooms to selected preset using the current speed settings', 644 | parameters: { 645 | Input: 'input', 646 | Value: { 647 | type: 'number', 648 | description: 'Index of item', 649 | }, 650 | }, 651 | }, 652 | 653 | SetAlpha: { 654 | description: 'Set Input transparency', 655 | parameters: { 656 | Input: 'input', 657 | Value: { 658 | type: 'number', 659 | description: 'Alpha between 0 and 255. 0 is transparent. 255 is opaque', 660 | }, 661 | }, 662 | }, 663 | 664 | ...SetCC, 665 | 666 | SetCrop: { 667 | description: 'Change current Crop value of Input', 668 | parameters: { 669 | Input: 'input', 670 | Value: { 671 | type: 'string', 672 | description: 'Format: X1,Y1,X2,Y2', 673 | }, 674 | }, 675 | }, 676 | 677 | SetCropX1: { 678 | description: 'Change current Crop X1 value of Input.', 679 | parameters: { 680 | Input: 'input', 681 | Value: { 682 | type: 'number', 683 | description: '0=No Crop, 1=Full Crop', 684 | }, 685 | }, 686 | }, 687 | 688 | SetCropX2: { 689 | description: 'Change current Crop X2 value of Input.', 690 | parameters: { 691 | Input: 'input', 692 | Value: { 693 | type: 'number', 694 | description: '0=No Crop, 1=Full Crop', 695 | }, 696 | }, 697 | }, 698 | 699 | SetCropY1: { 700 | description: 'Change current Crop Y1 value of Input.', 701 | parameters: { 702 | Input: 'input', 703 | Value: { 704 | type: 'number', 705 | description: '0=No Crop, 1=Full Crop', 706 | }, 707 | }, 708 | }, 709 | 710 | SetCropY2: { 711 | description: 'Change current Crop Y2 value of Input.', 712 | parameters: { 713 | Input: 'input', 714 | Value: { 715 | type: 'number', 716 | description: '0=No Crop, 1=Full Crop', 717 | }, 718 | }, 719 | }, 720 | 721 | SetDynamicInput1: { 722 | description: 'Set Dynamic Input 1', 723 | parameters: { 724 | Value: 'input', 725 | // Input: 'input' 726 | }, 727 | }, 728 | 729 | SetDynamicInput2: { 730 | description: 'Set Dynamic Input 2', 731 | parameters: { 732 | Value: 'input', 733 | // Input: 'input' 734 | }, 735 | }, 736 | 737 | SetDynamicInput3: { 738 | description: 'Set Dynamic Input 3', 739 | parameters: { 740 | Value: 'input', 741 | // Input: 'input' 742 | }, 743 | }, 744 | 745 | SetDynamicInput4: { 746 | description: 'Set Dynamic Input 4', 747 | parameters: { 748 | Value: 'input', 749 | // Input: 'input' 750 | }, 751 | }, 752 | 753 | SetEffect1Strength: { 754 | description: 'Set Input 1 Effect Strength', 755 | parameters: { 756 | Input: 'input', 757 | Value: { 758 | type: 'number', 759 | description: 'Value between 0.0 to 1.0', 760 | }, 761 | }, 762 | }, 763 | 764 | SetEffect2Strength: { 765 | description: 'Set Input 2 Effect Strength', 766 | parameters: { 767 | Input: 'input', 768 | Value: { 769 | type: 'number', 770 | description: 'Value between 0.0 to 1.0', 771 | }, 772 | }, 773 | }, 774 | 775 | SetEffect3Strength: { 776 | description: 'Set Input 3 Effect Strength', 777 | parameters: { 778 | Input: 'input', 779 | Value: { 780 | type: 'number', 781 | description: 'Value between 0.0 to 1.0', 782 | }, 783 | }, 784 | }, 785 | 786 | SetEffect4Strength: { 787 | description: 'Set Input 4 Effect Strength', 788 | parameters: { 789 | Input: 'input', 790 | Value: { 791 | type: 'number', 792 | description: 'Value between 0.0 to 1.0', 793 | }, 794 | }, 795 | }, 796 | 797 | SetFrameDelay: { 798 | description: 'Set the delay in framees', 799 | parameters: { 800 | Input: 'input', 801 | Value: { 802 | type: 'number', 803 | description: 'Number of frames', 804 | }, 805 | }, 806 | }, 807 | 808 | SetInputName: { 809 | description: 'Set the Display Name of the Input', 810 | parameters: { 811 | Input: 'input', 812 | Value: { 813 | type: 'string', 814 | description: 'New display name', 815 | }, 816 | }, 817 | }, 818 | 819 | SetLayer: { 820 | description: 821 | 'Change Layer in Input according to Value parameter. Example: 1,2 changes Layer1 to Input2', 822 | parameters: { 823 | Input: 'input', 824 | Value: [ 825 | // Composite - separated by "," 826 | { 827 | type: 'number', 828 | description: 'Layer number (1 to 10)', 829 | }, 830 | { 831 | type: 'string', 832 | description: 'Input to set as layer', 833 | }, 834 | ], 835 | }, 836 | }, 837 | 838 | ...SetLayerEntries(), 839 | 840 | SetPanX: { 841 | description: 'Change current PanX value of Input', 842 | parameters: { 843 | Input: 'input', 844 | Value: { 845 | type: 'number', 846 | description: 847 | 'Value between -2 to 2. 0=centered, -2=100% to left, 2=100% to right', 848 | }, 849 | }, 850 | }, 851 | 852 | SetPanY: { 853 | description: 'Change current PanY value of Input', 854 | parameters: { 855 | Input: 'input', 856 | Value: { 857 | type: 'number', 858 | description: 859 | 'Value between -2 to 2. 0=centered, -2=100% to bottom, 2=100% to top', 860 | }, 861 | }, 862 | }, 863 | 864 | SetPictureEffect: { 865 | description: 'Set transition effect for Photos and PowerPoint Inputs', 866 | parameters: { 867 | Input: 'input', 868 | Value: { 869 | type: 'string', 870 | description: 'Transition name. (Fade, Zoom, etc)', 871 | }, 872 | }, 873 | }, 874 | 875 | SetPictureEffectDuration: { 876 | description: 877 | 'Set duration of transition effect for Photos and PowerPoint Inputs', 878 | parameters: { 879 | Input: 'input', 880 | Value: { 881 | type: 'number', 882 | description: 'Duration in milliseconds', 883 | }, 884 | }, 885 | }, 886 | 887 | SetPictureTransition: { 888 | description: 'Set transition time between Photos and PowerPoint slides', 889 | parameters: { 890 | Input: 'input', 891 | Value: { 892 | type: 'number', 893 | description: 'Duration in seconds between entries', 894 | }, 895 | }, 896 | }, 897 | 898 | SetPosition: { 899 | description: 'Set Position of selected Input', 900 | parameters: { 901 | Input: 'input', 902 | Value: { 903 | type: 'number', 904 | description: 'Value in Milliseconds', 905 | }, 906 | }, 907 | }, 908 | 909 | SetRate: { 910 | description: 'Set Playback speed/rate for Videos and Video Delays', 911 | parameters: { 912 | Input: 'input', 913 | Value: { 914 | type: 'number', 915 | description: 'Value between 0.1 and 4. 0.5=50%, 1=100%, 2=200%, 4=400%', 916 | }, 917 | }, 918 | }, 919 | 920 | SetRateSlowMotion: { 921 | description: 'Set Slow Motion speed for Instant Replay', 922 | parameters: { 923 | Input: 'input', 924 | Value: { 925 | type: 'number', 926 | description: 'Value between 0.1 and 1.0. 0.1=10%, 0.5=50%, 1=100%', 927 | }, 928 | }, 929 | }, 930 | 931 | SetZoom: { 932 | description: 'Change current Zoom level of Input', 933 | parameters: { 934 | Input: 'input', 935 | Value: { 936 | type: 'number', 937 | description: 'Value between 0 and 5.0. 1=100%, 0.5=50%, 2=200%', 938 | }, 939 | }, 940 | }, 941 | 942 | SharpenOff: { 943 | description: 'Switch off sharpen for Input', 944 | parameters: { 945 | Input: 'input', 946 | }, 947 | }, 948 | 949 | SharpenOn: { 950 | description: 'Switch on sharpen for Input', 951 | parameters: { 952 | Input: 'input', 953 | }, 954 | }, 955 | 956 | VideoCallAudioSource: { 957 | description: 958 | 'Select audio source to route to Video Call (to let the caller receive the selected audio). Including mix-minus', 959 | parameters: { 960 | Input: 'input', 961 | Value: { 962 | type: 'string', 963 | description: 964 | 'Bus Valid values: Master,Headphones,BusA,BusB,BusC,BusD,BusE,BusF,BusG', 965 | }, 966 | }, 967 | }, 968 | 969 | VideoCallVideoSource: { 970 | description: 971 | 'Select video source to route to Video Call (to let the caller receive the selected video)', 972 | parameters: { 973 | Input: 'input', 974 | Value: { 975 | type: 'string', 976 | description: 'Valid values: Output1,Output2,Output3,Output4', 977 | }, 978 | }, 979 | }, 980 | 981 | VideoDelayStartRecording: { 982 | description: 'Start Video Delay Recording', 983 | parameters: { 984 | Input: 'input', 985 | Duration: { 986 | type: 'number', 987 | description: 'Delay in milliseconds', 988 | }, 989 | }, 990 | }, 991 | 992 | VideoDelayStartStopRecording: { 993 | description: 'Toggle start/stop Video Delay Recording', 994 | parameters: { 995 | Input: 'input', 996 | Duration: { 997 | type: 'number', 998 | description: 'Duration in milliseconds', 999 | }, 1000 | }, 1001 | }, 1002 | 1003 | VideoDelayStopRecording: { 1004 | description: 'Stop Video Delay Recording', 1005 | parameters: { 1006 | Input: 'input', 1007 | Duration: { 1008 | type: 'number', 1009 | description: 'Duration in milliseconds', 1010 | }, 1011 | }, 1012 | }, 1013 | 1014 | ...Zoom, 1015 | 1016 | WaitForCompletion: { 1017 | description: 'Wait for a Video Input to reach the end of playback', 1018 | parameters: { 1019 | Input: 'input', 1020 | 1021 | Duration: { 1022 | type: 'number', 1023 | description: 'Duration in milliseconds', 1024 | }, 1025 | }, 1026 | }, 1027 | } 1028 | -------------------------------------------------------------------------------- /src/categories/05-input/layers.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | // New in vMix version 24 3 | LayerOff: { 4 | description: 'Turn off layer for input', 5 | parameters: { 6 | Input: { 7 | type: 'input', 8 | }, 9 | Value: { 10 | type: 'number', 11 | description: 'Layer number 1-10', 12 | }, 13 | }, 14 | }, 15 | 16 | LayerOn: { 17 | description: 'Turn on layer for input', 18 | parameters: { 19 | Input: { 20 | type: 'input', 21 | }, 22 | Value: { 23 | type: 'number', 24 | description: 'Layer number 1-10', 25 | }, 26 | }, 27 | }, 28 | 29 | LayerOnOff: { 30 | description: 'Toggle layer for input', 31 | parameters: { 32 | Input: { 33 | type: 'input', 34 | }, 35 | Value: { 36 | type: 'number', 37 | description: 'Layer number 1-10', 38 | }, 39 | }, 40 | }, 41 | 42 | SetLayerAnimated: { 43 | description: `Change Layer Index to Input. 44 | Animate if input exists in another layer. 45 | Example: 1,2,1000 changes Layer1 to Input2.`, 46 | parameters: { 47 | Input: 'input', 48 | Value: { 49 | type: 'string', 50 | description: 'Index,Input,DurationMilliseconds', 51 | }, 52 | }, 53 | }, 54 | 55 | SetLayerDynamicCrop: { 56 | description: `Change current Crop value of Input Layer from DynamicValue1 (1-10). 57 | X1,Y1,X2,Y2 (values between 0 and 1)`, 58 | parameters: { 59 | Input: 'input', 60 | Value: { 61 | type: 'string', 62 | description: 'X1,Y1,X2,Y2', 63 | }, 64 | }, 65 | }, 66 | 67 | SetLayerDynamicCropX1: { 68 | description: `Change current Crop X1 value of Input Layer from DynamicValue1 (1-10). 69 | 0=No Crop, 1=Full Crop`, 70 | parameters: { 71 | Input: 'input', 72 | Value: { 73 | type: 'number', 74 | description: 'X1 0.0-1.0', 75 | }, 76 | }, 77 | }, 78 | 79 | SetLayerDynamicCropX2: { 80 | description: `Change current Crop X2 value of Input Layer from DynamicValue1 (1-10). 81 | 0=No Crop, 1=Full Crop`, 82 | parameters: { 83 | Input: 'input', 84 | Value: { 85 | type: 'number', 86 | description: 'X2 0.0-1.0', 87 | }, 88 | }, 89 | }, 90 | 91 | SetLayerDynamicCropY1: { 92 | description: `Change current Crop Y1 value of Input Layer from DynamicValue1 (1-10). 93 | 0=No Crop, 1=Full Crop`, 94 | parameters: { 95 | Input: 'input', 96 | Value: { 97 | type: 'number', 98 | description: 'Y1 0.0-1.0', 99 | }, 100 | }, 101 | }, 102 | 103 | SetLayerDynamicCropY2: { 104 | description: `Change current Crop Y2 value of Input Layer from DynamicValue1 (1-10). 105 | 0=No Crop, 1=Full Crop`, 106 | parameters: { 107 | Input: 'input', 108 | Value: { 109 | type: 'number', 110 | description: 'Y2 0.0-1.0', 111 | }, 112 | }, 113 | }, 114 | 115 | SetLayerDynamicHeight: { 116 | description: `Change current Height value of Input Layer from DynamicValue1 (1-10). 117 | In pixels based on preset resolution`, 118 | parameters: { 119 | Input: 'input', 120 | Value: { 121 | type: 'number', 122 | description: 'Pixels -4096-4096', 123 | }, 124 | }, 125 | }, 126 | 127 | SetLayerDynamicPanX: { 128 | description: `Change current PanX value of Input Layer from DynamicValue1 (1-10). 129 | 0=centered, -2=100% to left, 2=100% to right`, 130 | parameters: { 131 | Input: 'input', 132 | Value: { 133 | type: 'number', 134 | description: 'Pan between -2.0 and 2.0', 135 | }, 136 | }, 137 | }, 138 | 139 | SetLayerDynamicPanY: { 140 | description: `Change current PanY value of Input Layer from DynamicValue1 (1-10). 141 | 0=centered, -2=100% to bottom, 2=100% to top`, 142 | parameters: { 143 | Input: 'input', 144 | Value: { 145 | type: 'number', 146 | description: 'Pan between -2.0 and 2.0', 147 | }, 148 | }, 149 | }, 150 | 151 | SetLayerDynamicRectangle: { 152 | description: `Change current Rectangle values of Input Layer from DynamicValue1 (1-10) in pixels.`, 153 | parameters: { 154 | Input: 'input', 155 | Value: { 156 | type: 'string', 157 | description: 'X,Y,Width,Height', 158 | }, 159 | }, 160 | }, 161 | 162 | SetLayerDynamicWidth: { 163 | description: `Change current Width value of Input Layer from DynamicValue1 (1-10). 164 | In pixels based on preset resolution`, 165 | parameters: { 166 | Input: 'input', 167 | Value: { 168 | type: 'number', 169 | description: 'Pixels -4096-4096', 170 | }, 171 | }, 172 | }, 173 | 174 | SetLayerDynamicX: { 175 | description: `Change current X value of Input Layer from DynamicValue1 (1-10). 176 | In pixels based on preset resolution`, 177 | parameters: { 178 | Input: 'input', 179 | Value: { 180 | type: 'number', 181 | description: 'Pixels -4096-4096', 182 | }, 183 | }, 184 | }, 185 | 186 | SetLayerDynamicY: { 187 | description: `Change current Y value of Input Layer from DynamicValue1 (1-10). 188 | In pixels based on preset resolution`, 189 | parameters: { 190 | Input: 'input', 191 | Value: { 192 | type: 'number', 193 | description: 'Pixels -4096-4096', 194 | }, 195 | }, 196 | }, 197 | 198 | SetLayerDynamicZoom: { 199 | description: `Change current Zoom level of Input Layer from DynamicValue1 (1-10). 200 | 1=100%, 0.5=50%, 2=200%`, 201 | parameters: { 202 | Input: 'input', 203 | Value: { 204 | type: 'number', 205 | description: 'Zoom between 0.0 and 5.0', 206 | }, 207 | }, 208 | }, 209 | 210 | SwapLayerAnimated: { 211 | description: `Animate swapping the Layers in Input according to Value parameter. 212 | Example: 1,2,1000 swaps Layer1 and Layer2 over 1000 milliseconds.`, 213 | parameters: { 214 | Input: 'input', 215 | Value: { 216 | type: 'string', 217 | description: 'FromIndex,ToIndex,DurationMilliseconds', 218 | }, 219 | }, 220 | }, 221 | } 222 | -------------------------------------------------------------------------------- /src/categories/05-input/set-cc.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | SetCCGainB: { 3 | description: 'Change Gain B level of Input', 4 | parameters: { 5 | Input: 'input', 6 | Value: { 7 | type: 'number', 8 | description: 'Value between 0 and 2. 1 is original value', 9 | }, 10 | }, 11 | }, 12 | 13 | SetCCGainG: { 14 | description: 'Change Gain G level of Input', 15 | parameters: { 16 | Input: 'input', 17 | Value: { 18 | type: 'number', 19 | description: 'Value between 0 and 2. 1 is original value', 20 | }, 21 | }, 22 | }, 23 | 24 | SetCCGainR: { 25 | description: 'Change Gain R level of Input', 26 | parameters: { 27 | Input: 'input', 28 | Value: { 29 | type: 'number', 30 | description: 'Value between 0 and 2. 1 is original value', 31 | }, 32 | }, 33 | }, 34 | 35 | SetCCGainRGB: { 36 | description: 'Change Gain RGB level of Input', 37 | parameters: { 38 | Input: 'input', 39 | Value: { 40 | type: 'number', 41 | description: 'Value between 0 and 2. 1 is original value', 42 | }, 43 | }, 44 | }, 45 | SetCCGainY: { 46 | description: 'Change Gain Y level of Input', 47 | parameters: { 48 | Input: 'input', 49 | Value: { 50 | type: 'number', 51 | description: 'Value between 0 and 2. 1 is original value', 52 | }, 53 | }, 54 | }, 55 | 56 | SetCCGammaB: { 57 | description: 'Change Gamma B level of Input', 58 | parameters: { 59 | Input: 'input', 60 | Value: { 61 | type: 'number', 62 | description: 'Value between -1 and 1. 0 is original value', 63 | }, 64 | }, 65 | }, 66 | 67 | SetCCGammaG: { 68 | description: 'Change Gamma G level of Input', 69 | parameters: { 70 | Input: 'input', 71 | Value: { 72 | type: 'number', 73 | description: 'Value between -1 and 1. 0 is original value', 74 | }, 75 | }, 76 | }, 77 | 78 | SetCCGammaR: { 79 | description: 'Change Gamma R level of Input', 80 | parameters: { 81 | Input: 'input', 82 | Value: { 83 | type: 'number', 84 | description: 'Value between -1 and 1. 0 is original value', 85 | }, 86 | }, 87 | }, 88 | 89 | SetCCGammaRGB: { 90 | description: 'Change Gamma RGB level of Input', 91 | parameters: { 92 | Input: 'input', 93 | Value: { 94 | type: 'number', 95 | description: 'Value between -1 and 1. 0 is original value', 96 | }, 97 | }, 98 | }, 99 | 100 | SetCCGammaY: { 101 | description: 'Change Gamma Y level of Input', 102 | parameters: { 103 | Input: 'input', 104 | Value: { 105 | type: 'number', 106 | description: 'Value between -1 and 1. 0 is original value', 107 | }, 108 | }, 109 | }, 110 | 111 | SetCCHue: { 112 | description: 'Change Hue level of Input', 113 | parameters: { 114 | Input: 'input', 115 | Value: { 116 | type: 'number', 117 | description: 'Value between -1 and 1. 0 is original value', 118 | }, 119 | }, 120 | }, 121 | 122 | SetCCLiftB: { 123 | description: 'Change Lift B level of Input', 124 | parameters: { 125 | Input: 'input', 126 | Value: { 127 | type: 'number', 128 | description: 'Value between -1 and 1. 0 is original value', 129 | }, 130 | }, 131 | }, 132 | 133 | SetCCLiftG: { 134 | description: 'Change Lift G level of Input', 135 | parameters: { 136 | Input: 'input', 137 | Value: { 138 | type: 'number', 139 | description: 'Value between -1 and 1. 0 is original value', 140 | }, 141 | }, 142 | }, 143 | 144 | SetCCLiftR: { 145 | description: 'Change Lift R level of Input', 146 | parameters: { 147 | Input: 'input', 148 | Value: { 149 | type: 'number', 150 | description: 'Value between -1 and 1. 0 is original value', 151 | }, 152 | }, 153 | }, 154 | 155 | SetCCLiftY: { 156 | description: 'Change Lift Y level of Input', 157 | parameters: { 158 | Input: 'input', 159 | Value: { 160 | type: 'number', 161 | description: 'Value between -1 and 1. 0 is original value', 162 | }, 163 | }, 164 | }, 165 | 166 | SetCCLiftRGB: { 167 | description: 'Change Lift RGB level of Input', 168 | parameters: { 169 | Input: 'input', 170 | Value: { 171 | type: 'number', 172 | description: 'Value between -1 and 1. 0 is original value', 173 | }, 174 | }, 175 | }, 176 | 177 | SetCCSaturation: { 178 | description: 'Change Saturation level of Input', 179 | parameters: { 180 | Input: 'input', 181 | Value: { 182 | type: 'number', 183 | description: 184 | 'Value between -1 and 1. 0 is original value. -1 is greyscale. 1 is very saturated', 185 | }, 186 | }, 187 | }, 188 | } 189 | -------------------------------------------------------------------------------- /src/categories/05-input/zoom.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | ZoomMuteSelf: { 3 | description: '', 4 | parameters: { 5 | Input: 'input', 6 | }, 7 | }, 8 | 9 | ZoomSelectParticipantByName: { 10 | description: '', 11 | parameters: { 12 | Input: 'input', 13 | Value: { 14 | type: 'string', 15 | description: 'Name', 16 | }, 17 | }, 18 | }, 19 | 20 | ZoomUnMuteSelf: { 21 | description: '', 22 | parameters: { 23 | Input: 'input', 24 | }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /src/categories/05-title.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | // Currently only able to control one countdown on each title input 3 | AdjustCountdown: { 4 | description: 'Seconds to add or subtract from current Countdown time', 5 | parameters: { 6 | Input: 'input', 7 | 8 | Value: { 9 | type: 'number', 10 | description: 'Value in seconds - Enter negative number to subtract' 11 | } 12 | } 13 | }, 14 | 15 | // Currently only able to control one countdown on each title input 16 | ChangeCountdown: { 17 | description: 'Change countdown time. SelectedIndex or SelectedName parameters can be used to select Text Field', 18 | parameters: { 19 | Input: 'input', 20 | 21 | SelectedIndex: { 22 | type: 'string', 23 | optional: true, 24 | }, 25 | SelectedName: { 26 | type: 'string', 27 | optional: true, 28 | }, 29 | 30 | Value: { 31 | type: 'string', 32 | description: 'Value as hh:mm:ss (00:00:00)' 33 | } 34 | }, 35 | }, 36 | 37 | NextTitlePreset: { 38 | description: 'Next Title Preset on Input', 39 | parameters: { 40 | Input: 'input' 41 | }, 42 | }, 43 | 44 | // Currently only able to control one countdown on each title input 45 | PauseCountdown: { 46 | description: 'Pause or Resume Countdown. If complete, it restarts from beginning. SelectedIndex or SelectedName parameters can be used to select Text Field', 47 | parameters: { 48 | Input: 'input', 49 | 50 | SelectedIndex: { 51 | type: 'string', 52 | optional: true, 53 | }, 54 | SelectedName: { 55 | type: 'string', 56 | optional: true, 57 | } 58 | }, 59 | }, 60 | 61 | PauseRender: { 62 | description: 'Pause render of Title input. Remember to fire ResumeRender after making multiple updates', 63 | parameters: { 64 | Input: 'input' 65 | }, 66 | }, 67 | 68 | PreviousTitlePreset: { 69 | description: 'Previous Title Preset on Input', 70 | parameters: { 71 | Input: 'input' 72 | }, 73 | }, 74 | 75 | ResumeRender: { 76 | description: 'Resume render of Title input after making multiple updates', 77 | parameters: { 78 | Input: 'input' 79 | }, 80 | }, 81 | 82 | SelectTitlePreset: { 83 | description: 'Select Title Preset on Input', 84 | parameters: { 85 | Input: 'input', 86 | Value: { 87 | type: 'number', 88 | description: 'Preset Index starting at 0' 89 | } 90 | }, 91 | }, 92 | 93 | SetCountdown: { 94 | description: 'Set countdown duration', 95 | parameters: { 96 | Input: 'input', 97 | Value: { 98 | type: 'string', 99 | description: 'Duration as hh:mm:ss (e.g. 00:00:00)' 100 | } 101 | }, 102 | }, 103 | 104 | SetImage: { 105 | description: 'Change Image in Title according to Filename or empty to clear. SelectedIndex or SelectedName can be used to select image', 106 | parameters: { 107 | Input: 'input', 108 | 109 | SelectedIndex: { 110 | type: 'number', 111 | optional: true, 112 | }, 113 | SelectedName: { 114 | type: 'string', 115 | optional: true, 116 | }, 117 | 118 | Value: { 119 | type: 'string', 120 | description: 'Can use both file:// and https:// addresses' 121 | }, 122 | }, 123 | }, 124 | 125 | SetImageVisible: { 126 | description: 'Toggle Image Visibility in Title. SelectedIndex or SelectedName can be used to select image', 127 | parameters: { 128 | Input: 'input', 129 | 130 | SelectedIndex: { 131 | type: 'number', 132 | optional: true, 133 | }, 134 | SelectedName: { 135 | type: 'string', 136 | optional: true, 137 | }, 138 | }, 139 | }, 140 | 141 | SetImageVisibleOff: { 142 | description: 'Hide Image in Title. SelectedIndex or SelectedName can be used to select image', 143 | parameters: { 144 | Input: 'input', 145 | 146 | SelectedIndex: { 147 | type: 'number', 148 | optional: true, 149 | }, 150 | SelectedName: { 151 | type: 'string', 152 | optional: true, 153 | }, 154 | }, 155 | }, 156 | 157 | SetImageVisibleOn: { 158 | description: 'Show Image in Title. SelectedIndex or SelectedName can be used to select image', 159 | parameters: { 160 | Input: 'input', 161 | 162 | SelectedIndex: { 163 | type: 'number', 164 | optional: true, 165 | }, 166 | SelectedName: { 167 | type: 'string', 168 | optional: true, 169 | }, 170 | }, 171 | }, 172 | 173 | SetText: { 174 | description: 'Change Text in Title according to Value parameter. SelectedIndex or SelectedName can be used to select image', 175 | parameters: { 176 | Input: 'input', 177 | 178 | SelectedIndex: { 179 | type: 'number', 180 | optional: true, 181 | }, 182 | 183 | SelectedName: { 184 | type: 'string', 185 | optional: true, 186 | }, 187 | 188 | Value: { 189 | type: 'string', 190 | description: 'Value for the text field' 191 | }, 192 | }, 193 | }, 194 | 195 | SetTextColour: { 196 | description: 'Change Colour of Text in Title in HTML format (#xxxxxx)', 197 | parameters: { 198 | Input: 'input', 199 | 200 | SelectedIndex: { 201 | type: 'number', 202 | optional: true, 203 | }, 204 | // NOTE - vMix API documentation says 'SelectedName', but only SelectName works 205 | // SelectName: { 206 | SelectedName: { 207 | type: 'string', 208 | optional: true, 209 | }, 210 | 211 | Value: { 212 | type: 'string', 213 | description: 'HTML format (#xxxxxx or #xxxxxxxx), remember to urlencode. E.g. %2333FFFFFF for transparant white' 214 | }, 215 | }, 216 | }, 217 | 218 | SetTextVisible: { 219 | description: 'Toggle on/off Text Visibility in Title', 220 | parameters: { 221 | Input: 'input', 222 | 223 | SelectedIndex: { 224 | type: 'number', 225 | optional: true, 226 | }, 227 | SelectedName: { 228 | type: 'string', 229 | optional: true, 230 | }, 231 | }, 232 | }, 233 | 234 | SetTextVisibleOff: { 235 | description: 'Switch off Text Visibility in Title', 236 | parameters: { 237 | Input: 'input', 238 | 239 | SelectedIndex: { 240 | type: 'number', 241 | optional: true, 242 | }, 243 | SelectedName: { 244 | type: 'string', 245 | optional: true, 246 | }, 247 | }, 248 | }, 249 | 250 | SetTextVisibleOn: { 251 | description: 'Switch on Text Visibility in Title', 252 | parameters: { 253 | Input: 'input', 254 | 255 | SelectedIndex: { 256 | type: 'number', 257 | optional: true, 258 | }, 259 | SelectedName: { 260 | type: 'string', 261 | optional: true, 262 | }, 263 | }, 264 | }, 265 | 266 | SetTickerSpeed: { 267 | description: 'Change Ticker Speed', 268 | parameters: { 269 | Input: 'input', 270 | 271 | SelectedIndex: { 272 | type: 'number', 273 | optional: true, 274 | }, 275 | SelectedName: { 276 | type: 'string', 277 | optional: true, 278 | }, 279 | 280 | Value: { 281 | type: 'number', 282 | description: 'Speed between 0 to 1000' 283 | } 284 | }, 285 | }, 286 | 287 | // Added in version 26 288 | SetColor: { 289 | description: 'Change Color in Title using HTML #xxxxxxxx format. SelectedIndex or SelectedName can be used to select object.', 290 | parameters: { 291 | Input: 'input', 292 | 293 | SelectedIndex: { 294 | type: 'number', 295 | optional: true, 296 | }, 297 | SelectedName: { 298 | type: 'string', 299 | optional: true, 300 | }, 301 | 302 | // Color value 303 | Value: { 304 | type: 'string', 305 | description: 'Color', 306 | }, 307 | 308 | } 309 | }, 310 | 311 | 312 | StartCountdown: { 313 | description: 'Start Countdown', 314 | parameters: { 315 | Input: 'input', 316 | 317 | // SelectedIndex: { 318 | // type: 'number', 319 | // optional: true, 320 | // }, 321 | // SelectedName: { 322 | // type: 'string', 323 | // optional: true, 324 | // }, 325 | // }, 326 | }, 327 | }, 328 | 329 | StopCountdown: { 330 | description: 'Stop Countdown', 331 | parameters: { 332 | Input: 'input', 333 | 334 | // SelectedIndex: { 335 | // type: 'number', 336 | // optional: true, 337 | // }, 338 | // SelectedName: { 339 | // type: 'string', 340 | // optional: true, 341 | // }, 342 | }, 343 | }, 344 | 345 | SuspendCountdown: { 346 | description: 'Suspend Countdown - does not restart countdown on completion - stays 00.00', 347 | parameters: { 348 | Input: 'input', 349 | 350 | // SelectedIndex: { 351 | // type: 'number', 352 | // optional: true, 353 | // }, 354 | // SelectedName: { 355 | // type: 'string', 356 | // optional: true, 357 | // }, 358 | }, 359 | }, 360 | 361 | TitleBeginAnimation: { 362 | description: 'Title begin animation', 363 | parameters: { 364 | Input: 'input', 365 | 366 | Value: { 367 | type: 'string', 368 | description: 'Animation name' 369 | }, 370 | }, 371 | }, 372 | } -------------------------------------------------------------------------------- /src/categories/06-overlay.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | // MultiView overlay functions - start 4 | 5 | MoveMultiViewOverlay: { 6 | description: 'Move Overlay in Input MultiView according to Value parameter. Example: 1,2 moves Overlay1 to Overlay2', 7 | parameters: { 8 | Input: 'input', 9 | Value: [ // Composite - separated by "," 10 | { 11 | type: 'number', 12 | description: 'FromIndex - starting by 1' 13 | }, 14 | { 15 | type: 'number', 16 | description: 'ToIndex - starting by 1' 17 | }, 18 | ], 19 | } 20 | }, 21 | 22 | MultiViewOverlay: { 23 | description: 'Toggle On/Off MultiView Overlay For Input At Index', 24 | parameters: { 25 | Input: 'input', 26 | Value: { 27 | type: 'number', 28 | description: 'Index starting from 1' 29 | } 30 | } 31 | }, 32 | 33 | MultiViewOverlayOff: { 34 | description: 'Switch Off MultiView Overlay For Input At Index', 35 | parameters: { 36 | Input: 'input', 37 | Value: { 38 | type: 'number', 39 | description: 'Index starting from 1' 40 | } 41 | } 42 | }, 43 | 44 | MultiViewOverlayOn: { 45 | description: 'Switch On MultiView Overlay For Input At Index', 46 | parameters: { 47 | Input: 'input', 48 | Value: { 49 | type: 'number', 50 | description: 'Index starting from 1' 51 | } 52 | } 53 | }, 54 | 55 | // MultiView overlay functions - end 56 | 57 | // Overlay 1 functions - start 58 | 59 | OverlayInput1: { 60 | description: 'Toggle Overlay1 On/Off with selected Input using configured Transition', 61 | parameters: { 62 | Input: 'input' 63 | } 64 | }, 65 | 66 | OverlayInput1In: { 67 | description: 'Transition In to Overlay1 with selected Input', 68 | parameters: { 69 | Input: 'input' 70 | } 71 | }, 72 | 73 | OverlayInput1Last: 'Toggle Overlay1 On/Off with last used Input on this channel', 74 | 75 | OverlayInput1Off: 'Immediately switch Overlay1 Off (Cut)', 76 | OverlayInput1Out: 'Transition Out Overlay1', 77 | OverlayInput1Zoom: 'Zooms PIP Overlay 1 to fill Fullscreen and vice versa', 78 | 79 | // Overlay 1 functions - end 80 | 81 | // Overlay 2 functions - start 82 | 83 | OverlayInput2: { 84 | description: 'Toggle Overlay2 On/Off with selected Input using configured Transition', 85 | parameters: { 86 | Input: 'input' 87 | } 88 | }, 89 | 90 | OverlayInput2In: { 91 | description: 'Transition In to Overlay2 with selected Input', 92 | parameters: { 93 | Input: 'input' 94 | } 95 | }, 96 | 97 | OverlayInput2Last: 'Toggle Overlay2 On/Off with last used Input on this channel', 98 | 99 | OverlayInput2Off: 'Immediately switch Overlay2 Off (Cut)', 100 | OverlayInput2Out: 'Transition Out Overlay2', 101 | OverlayInput2Zoom: 'Zooms PIP Overlay 2 to fill Fullscreen and vice versa', 102 | 103 | // Overlay 2 functions - end 104 | 105 | // Overlay 3 functions - start 106 | 107 | OverlayInput3: { 108 | description: 'Toggle Overlay3 On/Off with selected Input using configured Transition', 109 | parameters: { 110 | Input: 'input' 111 | } 112 | }, 113 | 114 | OverlayInput3In: { 115 | description: 'Transition In to Overlay3 with selected Input', 116 | parameters: { 117 | Input: 'input' 118 | } 119 | }, 120 | 121 | OverlayInput3Last: 'Toggle Overlay3 On/Off with last used Input on this channel', 122 | 123 | OverlayInput3Off: 'Immediately switch Overlay3 Off (Cut)', 124 | OverlayInput3Out: 'Transition Out Overlay3', 125 | OverlayInput3Zoom: 'Zooms PIP Overlay 3 to fill Fullscreen and vice versa', 126 | 127 | // Overlay 3 functions - end 128 | 129 | // Overlay 4 functions - start 130 | 131 | OverlayInput4: { 132 | description: 'Toggle Overlay4 On/Off with selected Input using configured Transition', 133 | parameters: { 134 | Input: 'input' 135 | } 136 | }, 137 | 138 | OverlayInput4In: { 139 | description: 'Transition In to Overlay4 with selected Input', 140 | parameters: { 141 | Input: 'input' 142 | } 143 | }, 144 | 145 | OverlayInput4Last: 'Toggle Overlay4 On/Off with last used Input on this channel', 146 | 147 | OverlayInput4Off: 'Immediately switch Overlay4 Off (Cut)', 148 | OverlayInput4Out: 'Transition Out Overlay4', 149 | OverlayInput4Zoom: 'Zooms PIP Overlay 4 to fill Fullscreen and vice versa', 150 | 151 | // Overlay 4 functions - end 152 | 153 | OverlayInputAllOff: 'Immediately switch all Overlays Off', 154 | 155 | PreviewOverlayInput1: { 156 | description: 'Preview Overlay1 using the selected Input', 157 | parameters: { 158 | Input: 'input' 159 | } 160 | }, 161 | 162 | PreviewOverlayInput2: { 163 | description: 'Preview Overlay2 using the selected Input', 164 | parameters: { 165 | Input: 'input' 166 | } 167 | }, 168 | 169 | PreviewOverlayInput3: { 170 | description: 'Preview Overlay3 using the selected Input', 171 | parameters: { 172 | Input: 'input' 173 | } 174 | }, 175 | 176 | PreviewOverlayInput4: { 177 | description: 'Preview Overlay4 using the selected Input', 178 | parameters: { 179 | Input: 'input' 180 | } 181 | }, 182 | 183 | SetMultiViewOverlay: { 184 | description: 'Change Overlay in Input MultiView according to Value parameter. Example: 1,2 changes MultiviewOverlay1 to Input2', 185 | parameters: { 186 | Input: 'input', 187 | Value: [ // Composite - separated by "," 188 | { 189 | type: 'number', 190 | description: 'Overlay number (1 to 10)' 191 | }, 192 | { 193 | type: 'string', 194 | description: 'Input to set as layer' 195 | }, 196 | ], 197 | } 198 | }, 199 | } 200 | -------------------------------------------------------------------------------- /src/categories/07-playlist.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | NextPlayListEntry: 'Move to Next Item in a running PlayList', 3 | PreviousPlayListEntry: 'Move to Previous Item in a running PlayList', 4 | 5 | SelectPlayList: { 6 | description: 'Open PlayList with Name matching Value', 7 | parameters: { 8 | Value: 'string' 9 | } 10 | }, 11 | 12 | StartPlayList: 'Start Playlist', 13 | StopPlayList: 'Stop Playlist' 14 | } 15 | -------------------------------------------------------------------------------- /src/categories/08-scripting.ts: -------------------------------------------------------------------------------- 1 | // 2 | export default { 3 | ScriptStart: { 4 | description: 'Start script', 5 | parameters: { 6 | Value: { 7 | type: 'string', 8 | description: 'Script name' 9 | } 10 | } 11 | }, 12 | 13 | ScriptStartDynamic: { 14 | description: 'Start a dynamic script using code specified as the Value', 15 | parameters: { 16 | Value: { 17 | type: 'string', 18 | description: 'Code to execute' 19 | } 20 | } 21 | }, 22 | 23 | ScriptStop: { 24 | description: 'Stop script', 25 | parameters: { 26 | Value: { 27 | type: 'string', 28 | description: 'Script name' 29 | } 30 | } 31 | }, 32 | 33 | ScriptStopAll: 'Stop all scripts currently executing', 34 | ScriptStopDynamic: 'Stop all dynamic scripts currently executing' 35 | } 36 | -------------------------------------------------------------------------------- /src/categories/09-replay.ts: -------------------------------------------------------------------------------- 1 | const CHANNEL = { 2 | type: 'string', 3 | description: 'Valid values: Current, A or B' 4 | } 5 | 6 | export default { 7 | 8 | ReplayACamera1: 'Set Replay A input to camera 1', 9 | ReplayACamera2: 'Set Replay A input to camera 2', 10 | ReplayACamera3: 'Set Replay A input to camera 3', 11 | ReplayACamera4: 'Set Replay A input to camera 4', 12 | ReplayACamera5: 'Set Replay A input to camera 5', 13 | ReplayACamera6: 'Set Replay A input to camera 6', 14 | ReplayACamera7: 'Set Replay A input to camera 7', 15 | ReplayACamera8: 'Set Replay A input to camera 8', 16 | 17 | ReplayBCamera1: 'Set Replay B input to camera 1', 18 | ReplayBCamera2: 'Set Replay B input to camera 2', 19 | ReplayBCamera3: 'Set Replay B input to camera 3', 20 | ReplayBCamera4: 'Set Replay B input to camera 4', 21 | ReplayBCamera5: 'Set Replay B input to camera 5', 22 | ReplayBCamera6: 'Set Replay B input to camera 6', 23 | ReplayBCamera7: 'Set Replay B input to camera 7', 24 | ReplayBCamera8: 'Set Replay B input to camera 8', 25 | 26 | ReplayCamera1: 'Set Current Replay playout to camera 1', 27 | ReplayCamera2: 'Set Current Replay playout to camera 2', 28 | ReplayCamera3: 'Set Current Replay playout to camera 3', 29 | ReplayCamera4: 'Set Current Replay playout to camera 4', 30 | ReplayCamera5: 'Set Current Replay playout to camera 5', 31 | ReplayCamera6: 'Set Current Replay playout to camera 6', 32 | ReplayCamera7: 'Set Current Replay playout to camera 7', 33 | ReplayCamera8: 'Set Current Replay playout to camera 8', 34 | 35 | ReplayChangeDirection: { 36 | description: 'Switch replay direction - forward/reverse', 37 | parameters: { 38 | Channel: CHANNEL 39 | } 40 | }, 41 | 42 | ReplayChangeSpeed: { 43 | description: 'Change replay playback speed', 44 | parameters: { 45 | Value: { 46 | type: 'number', 47 | description: 'Speed in percentage' 48 | }, 49 | Channel: CHANNEL 50 | } 51 | }, 52 | 53 | ReplayCopyLastEvent: { 54 | description: 'Copy last replay event to event list', 55 | parameters: { 56 | Value: { 57 | type: 'number', 58 | description: 'Event list 0-19' 59 | } 60 | } 61 | }, 62 | 63 | ReplayCopySelectedEvent: { 64 | description: 'Copy selected replay event to event list', 65 | parameters: { 66 | Value: { 67 | type: 'number', 68 | description: 'Event list 0-19' 69 | }, 70 | }, 71 | }, 72 | 73 | ReplayDeleteLastEvent: { 74 | description: 'Delete last replay event', 75 | parameters: { 76 | Channel: CHANNEL, 77 | }, 78 | }, 79 | ReplayDeleteSelectedEvent: { 80 | description: 'Delete selected replay event', 81 | parameters: { 82 | Channel: CHANNEL, 83 | }, 84 | }, 85 | 86 | // { 87 | // description: '', 88 | // parameters: { 89 | // Channel: { 90 | // type: 'string', 91 | // description: 'Valid values: Current, A or B' 92 | // }, 93 | // }, 94 | // }, 95 | 96 | ReplayDuplicateLastEvent: { 97 | description: 'Duplicate last replay event', 98 | parameters: { 99 | Channel: CHANNEL, 100 | }, 101 | }, 102 | ReplayDuplicateSelectedEvent: { 103 | description: 'Duplicate selected replay event', 104 | parameters: { 105 | Channel: CHANNEL, 106 | }, 107 | }, 108 | 109 | ReplayExportLastEvent: { 110 | description: 'Export last replay event to specific folder', 111 | parameters: { 112 | Channel: CHANNEL, 113 | Value: { 114 | type: 'string', 115 | description: 'Replay clip export destination folder. I.e C:\\\\vMix Replay Exported Clips\\' 116 | }, 117 | } 118 | }, 119 | 120 | ReplayFastBackward: { 121 | description: 'Replay fast backwards', 122 | parameters: { 123 | Channel: CHANNEL, 124 | Value: { 125 | type: 'number', 126 | description: 'Speed 1-30x' 127 | }, 128 | } 129 | }, 130 | 131 | ReplayFastForward: { 132 | description: 'Replay fast forward', 133 | parameters: { 134 | Channel: CHANNEL, 135 | Value: { 136 | type: 'number', 137 | description: 'Speed 1-30x' 138 | } 139 | } 140 | }, 141 | 142 | ReplayJumpFrames: { 143 | description: 'Replay jump frames', 144 | parameters: { 145 | Channel: CHANNEL, 146 | Value: { 147 | type: 'number', 148 | description: 'Number of frames to jump' 149 | } 150 | } 151 | }, 152 | 153 | ReplayJumpFramesFastOff: { 154 | description: 'ReplayJumpFrames jumps 1 frame for each value instead of 1 second.', 155 | parameters: { 156 | Channel: CHANNEL 157 | } 158 | }, 159 | 160 | ReplayJumpFramesFastOn: { 161 | description: 'ReplayJumpFrames jumps 1 second for each value instead of 1 frame.', 162 | parameters: { 163 | Channel: CHANNEL, 164 | } 165 | }, 166 | 167 | ReplayJumpToNow: { 168 | description: 'Replay jump to now', 169 | parameters: { 170 | Channel: CHANNEL, 171 | } 172 | }, 173 | 174 | ReplayLastEventCameraOff: { 175 | description: 'Replay turn off speficied camera angle for last event', 176 | parameters: { 177 | Value: { 178 | type: 'number', 179 | description: 'Camera angle 1-8' 180 | } 181 | } 182 | }, 183 | 184 | ReplayLastEventCameraOn: { 185 | description: 'Replay turn on speficied camera angle for last event', 186 | parameters: { 187 | Value: { 188 | type: 'number', 189 | description: 'Camera angle 1-8' 190 | } 191 | } 192 | }, 193 | 194 | ReplayLastEventSingleCameraOn: { 195 | description: 'Replay turn on only speficied camera angle for last event (turns off all other angles for event)', 196 | parameters: { 197 | Value: { 198 | type: 'number', 199 | description: 'Camera angle 1-8' 200 | } 201 | } 202 | }, 203 | 204 | ReplayLive: 'Replay: Turn on replay live mode - replay window showing live sources and new replays are created in repect to now timestamp', 205 | ReplayLiveToggle: 'Replay: Toggle on/off replay live mode - toggles whether replay window is showing live sources and new replays are created in repect to now timestamp', 206 | ReplayMarkCancel: 'Replay: Cancel marking of event', 207 | ReplayMarkIn: 'Replay: Mark In for new replay event in respect to current timestamp selected in replay module (from live/non live mode)', 208 | ReplayMarkInLive: 'Replay: Mark In for new replay event in respect to live', 209 | 210 | ReplayMarkInOut: { 211 | description: 'Replay: Mark In/Out based on number of seconds and current timestamp selected in replay module (from live/non live mode)', 212 | parameters: { 213 | Value: { 214 | type: 'number', 215 | description: 'Seconds' 216 | } 217 | } 218 | }, 219 | 220 | ReplayMarkInOutLive: { 221 | description: 'Replay: Mark In/Out based on number of seconds back from right now', 222 | parameters: { 223 | Value: { 224 | type: 'number', 225 | description: 'Seconds' 226 | } 227 | } 228 | }, 229 | 230 | // Added in version 26 231 | ReplayMarkInOutLiveFuture: { 232 | description: 'Number of seconds into the future to use when creating a new event.', 233 | parameters: { 234 | Value: { 235 | type: 'number', 236 | description: 'Seconds' 237 | } 238 | } 239 | }, 240 | 241 | ReplayMarkInOutRecorded: { 242 | description: 'Replay: Mark In/Out based on number of seconds back from current selected timestamp of recorded session', 243 | parameters: { 244 | Value: { 245 | type: 'number', 246 | description: 'Seconds' 247 | } 248 | } 249 | }, 250 | 251 | ReplayMarkInRecorded: 'Replay: Mark In based on currently selected timestamp of recorded session', 252 | ReplayMarkInRecordedNow: 'Replay: Mark In based on currently selected timestamp of now timestamp in recorded session', 253 | 254 | ReplayMarkOut: 'Replay: Mark Out based on currently selected timestamp of recorded session', 255 | 256 | ReplayMoveLastEvent: { 257 | description: 'Replay: Move Last replay event to other event list', 258 | parameters: { 259 | Value: { 260 | type: 'number', 261 | description: 'Event list 0-19' 262 | } 263 | } 264 | }, 265 | 266 | ReplayMoveSelectedEvent: { 267 | description: 'Replay: Move selected replay event to other event list', 268 | parameters: { 269 | Value: { 270 | type: 'number', 271 | description: 'Event list 0-19' 272 | } 273 | } 274 | }, 275 | 276 | ReplayMoveSelectedEventDown: 'Replay: Move selected event down in list', 277 | ReplayMoveSelectedEventUp: 'Replay: Move selected previous event up in list', 278 | 279 | ReplayMoveSelectedInPoint: { 280 | description: 'Replay: Move In-point for selected event', 281 | parameters: { 282 | Channel: CHANNEL, 283 | 284 | Value: { 285 | type: 'number', 286 | description: 'Number of frames relative. Negative number = previous in time. Positive number = Forward in time' 287 | } 288 | } 289 | }, 290 | 291 | ReplayMoveSelectedOutPoint: { 292 | description: 'Replay: Move Out-point for selected event', 293 | parameters: { 294 | Channel: CHANNEL, 295 | 296 | Value: { 297 | type: 'number', 298 | description: 'Number of frames relative. Negative number = previous in time. Positive number = Forward in time' 299 | } 300 | } 301 | }, 302 | 303 | ReplayPause: { 304 | description: 'Replay: Pause playback', 305 | parameters: { 306 | Channel: CHANNEL, 307 | }, 308 | }, 309 | 310 | ReplayPlay: { 311 | description: 'Replay: Resume playback', 312 | parameters: { 313 | Channel: CHANNEL, 314 | }, 315 | }, 316 | 317 | ReplayPlayAllEvents: { 318 | description: 'Replay: Play all events in active list (do NOT automatically transition to output)', 319 | parameters: { 320 | Channel: CHANNEL, 321 | }, 322 | }, 323 | ReplayPlayAllEventsToOutput: { 324 | description: 'Replay: Play all events in active list (automatically transition to output)', 325 | parameters: { 326 | Channel: CHANNEL, 327 | }, 328 | }, 329 | 330 | ReplayPlayBackward: { 331 | description: 'Replay: Reverse playback of replay', 332 | parameters: { 333 | Channel: CHANNEL, 334 | }, 335 | }, 336 | 337 | ReplayPlayEvent: { 338 | description: 'Replay: Play Event by ID', 339 | parameters: { 340 | Channel: CHANNEL, 341 | 342 | Value: { 343 | type: 'number', 344 | description: 'Event number: 0-1000' 345 | } 346 | } 347 | }, 348 | 349 | ReplayPlayEventsByID: { 350 | description: 'Replay: Play Events by ID (do NOT automatically transition to output)', 351 | parameters: { 352 | Channel: CHANNEL, 353 | 354 | Value: { 355 | type: 'string', 356 | description: 'List of Events each with number 0-1000' 357 | } 358 | } 359 | }, 360 | 361 | ReplayPlayEventsByIDToOutput: { 362 | description: 'Replay: Play Events by ID (automatically transition to output)', 363 | parameters: { 364 | Channel: CHANNEL, 365 | 366 | Value: { 367 | type: 'string', 368 | description: 'List of Events each with number 0-1000' 369 | } 370 | } 371 | }, 372 | 373 | ReplayPlayEventToOutput: { 374 | description: 'Replay: Play Event by ID', 375 | parameters: { 376 | Channel: CHANNEL, 377 | 378 | Value: { 379 | type: 'number', 380 | description: 'Event number: 0-1000' 381 | } 382 | } 383 | }, 384 | 385 | ReplayPlayForward: { 386 | description: 'Replay: Forward Playback of replay inputs', 387 | parameters: { 388 | Channel: CHANNEL, 389 | } 390 | }, 391 | 392 | ReplayPlayLastEvent: { 393 | description: 'Replay: Playback of last event (do NOT automatically transition to output)', 394 | parameters: { 395 | Channel: CHANNEL, 396 | } 397 | }, 398 | ReplayPlayLastEventToOutput: { 399 | description: 'Replay: Playback of last event (automatically transition to output)', 400 | parameters: { 401 | Channel: CHANNEL, 402 | } 403 | }, 404 | 405 | ReplayPlayNext: { 406 | description: 'Replay: Play Next event', 407 | parameters: { 408 | Channel: CHANNEL, 409 | } 410 | }, 411 | 412 | ReplayPlayPause: { 413 | description: 'Replay: Resume or pause playback of replay input', 414 | parameters: { 415 | Channel: CHANNEL, 416 | } 417 | }, 418 | ReplayPlayPrevious: { 419 | description: 'Replay: Play Previous event', 420 | parameters: { 421 | Channel: CHANNEL, 422 | } 423 | }, 424 | 425 | ReplayPlaySelectedEvent: { 426 | description: 'Replay: Play selected event (do NOT automatically transition to output)', 427 | parameters: { 428 | Channel: CHANNEL, 429 | } 430 | }, 431 | 432 | ReplayPlaySelectedEventToOutput: { 433 | description: 'Replay: Play selected event (automatically transition to output)', 434 | parameters: { 435 | Channel: CHANNEL, 436 | } 437 | }, 438 | 439 | ReplayRecorded: 'Replay: Set in Recorded mode (non live)', 440 | 441 | ReplayScrollSelectedEvent: { 442 | description: 'Move back or forward through events list', 443 | parameters: { 444 | Value: { 445 | type: 'number', 446 | description: 'Count between -10 and 10', 447 | }, 448 | } 449 | 450 | }, 451 | 452 | ReplaySelectAllEvents: 'Select all events in active channel.', 453 | 454 | ReplaySelectChannelA: '', 455 | ReplaySelectChannelAB: '', 456 | ReplaySelectChannelB: '', 457 | 458 | ReplaySelectedEventCameraOff: { 459 | description: 'Replay: Turn off desired camera angle for selected event', 460 | parameters: { 461 | Value: { 462 | type: 'number', 463 | description: 'Camera angle 1-8' 464 | } 465 | } 466 | }, 467 | 468 | ReplaySelectedEventCameraOn: { 469 | description: 'Replay: Turn on desired camera angle for selected event', 470 | parameters: { 471 | Value: { 472 | type: 'number', 473 | description: 'Camera angle 1-8' 474 | } 475 | } 476 | }, 477 | 478 | ReplaySelectedEventSingleCameraOn: { 479 | description: 'Replay: Turn on only desired camera angle for selected event (turns off all other angles for event)', 480 | parameters: { 481 | Value: { 482 | type: 'number', 483 | description: 'Camera angle 1-8' 484 | } 485 | } 486 | }, 487 | 488 | ReplaySelectEvents1: { 489 | description: 'Replay: Select events category 1', 490 | parameters: { 491 | Channel: CHANNEL, 492 | } 493 | }, 494 | ReplaySelectEvents2: { 495 | description: 'Replay: Select events category 2', 496 | parameters: { 497 | Channel: CHANNEL, 498 | } 499 | }, 500 | ReplaySelectEvents3: { 501 | description: 'Replay: Select events category 3', 502 | parameters: { 503 | Channel: CHANNEL, 504 | } 505 | }, 506 | ReplaySelectEvents4: { 507 | description: 'Replay: Select events category 4', 508 | parameters: { 509 | Channel: CHANNEL, 510 | } 511 | }, 512 | ReplaySelectEvents5: { 513 | description: 'Replay: Select events category 5', 514 | parameters: { 515 | Channel: CHANNEL, 516 | } 517 | }, 518 | ReplaySelectEvents6: { 519 | description: 'Replay: Select events category 6', 520 | parameters: { 521 | Channel: CHANNEL, 522 | } 523 | }, 524 | ReplaySelectEvents7: { 525 | description: 'Replay: Select events category 7', 526 | parameters: { 527 | Channel: CHANNEL, 528 | } 529 | }, 530 | ReplaySelectEvents8: { 531 | description: 'Replay: Select events category 9', 532 | parameters: { 533 | Channel: CHANNEL, 534 | } 535 | }, 536 | 537 | ReplaySelectEvents9: { 538 | description: 'Replay: Select events category 9', 539 | parameters: { 540 | Channel: CHANNEL, 541 | } 542 | }, 543 | ReplaySelectEvents10: { 544 | description: 'Replay: Select events category 10', 545 | parameters: { 546 | Channel: CHANNEL, 547 | } 548 | }, 549 | ReplaySelectEvents11: { 550 | description: 'Replay: Select events category 11', 551 | parameters: { 552 | Channel: CHANNEL, 553 | } 554 | }, 555 | ReplaySelectEvents12: { 556 | description: 'Replay: Select events category 12', 557 | parameters: { 558 | Channel: CHANNEL, 559 | } 560 | }, 561 | ReplaySelectEvents13: { 562 | description: 'Replay: Select events category 13', 563 | parameters: { 564 | Channel: CHANNEL, 565 | } 566 | }, 567 | ReplaySelectEvents14: { 568 | description: 'Replay: Select events category 14', 569 | parameters: { 570 | Channel: CHANNEL, 571 | } 572 | }, 573 | ReplaySelectEvents15: { 574 | description: 'Replay: Select events category 15', 575 | parameters: { 576 | Channel: CHANNEL, 577 | } 578 | }, 579 | ReplaySelectEvents16: { 580 | description: 'Replay: Select events category 16', 581 | parameters: { 582 | Channel: CHANNEL, 583 | } 584 | }, 585 | ReplaySelectEvents17: { 586 | description: 'Replay: Select events category 17', 587 | parameters: { 588 | Channel: CHANNEL, 589 | } 590 | }, 591 | ReplaySelectEvents18: { 592 | description: 'Replay: Select events category 18', 593 | parameters: { 594 | Channel: CHANNEL, 595 | } 596 | }, 597 | ReplaySelectEvents19: { 598 | description: 'Replay: Select events category 19', 599 | parameters: { 600 | Channel: CHANNEL, 601 | } 602 | }, 603 | ReplaySelectEvents20: { 604 | description: 'Replay: Select events category 20', 605 | parameters: { 606 | Channel: CHANNEL, 607 | } 608 | }, 609 | 610 | ReplaySelectFirstEvent: { 611 | description: 'Replay: Select first event (oldest - in top) of active list/category', 612 | parameters: { 613 | Channel: CHANNEL, 614 | } 615 | }, 616 | ReplaySelectLastEvent: { 617 | description: 'Replay: Select Last event (newest - in bottom) of active list/category', 618 | parameters: { 619 | Channel: CHANNEL, 620 | } 621 | }, 622 | 623 | ReplaySelectNextEvent: { 624 | description: 'Replay: Select next event in list (down)', 625 | parameters: { 626 | Channel: CHANNEL, 627 | } 628 | }, 629 | ReplaySelectPreviousEvent: { 630 | description: 'Replay: Select previous event in list (up)', 631 | parameters: { 632 | Channel: CHANNEL, 633 | } 634 | }, 635 | 636 | ReplaySetAudioSource: { 637 | description: 'Replay: Set audio source', 638 | parameters: { 639 | Value: { 640 | type: 'string', 641 | description: 'Name as per dropdown box in IR module configuration window. Values: Master, Follow, Camera1, Camera2, ..., Camera8' 642 | } 643 | } 644 | }, 645 | 646 | // Added in version 26 647 | ReplaySetChannelAToBTimecode: { 648 | description: 'Replay: Set A Timecode to B Timecode', 649 | }, 650 | 651 | // Added in version 26 652 | ReplaySetChannelBToATimecode: { 653 | description: 'Replay: Set B Timecode to A Timecode', 654 | }, 655 | 656 | 657 | ReplaySetDirectionBackward: { 658 | description: 'Replay: Set direction backwards - Reverse playback', 659 | parameters: { 660 | Channel: CHANNEL, 661 | } 662 | }, 663 | ReplaySetDirectionForward: { 664 | description: 'Replay: Set direction backwards - Forward (normal) playback', 665 | parameters: { 666 | Channel: CHANNEL, 667 | } 668 | }, 669 | 670 | ReplaySetLastEventText: { 671 | description: 'Replay: Set text for last event', 672 | parameters: { 673 | Value: { 674 | type: 'string', 675 | description: 'Text' 676 | } 677 | } 678 | }, 679 | 680 | ReplaySetLastEventTextCamera: { 681 | description: 'Replay: Changes the text of last event of the specified angle (1-8). Example: 3,angle3text', 682 | parameters: { 683 | Value: [ // Composite separated by "," 684 | { 685 | type: 'number', 686 | description: 'Camera' 687 | }, 688 | { 689 | type: 'string', 690 | description: 'Text' 691 | } 692 | ] 693 | } 694 | }, 695 | 696 | ReplaySetSelectedEventText: { 697 | description: 'Replay: Set text for selected event', 698 | parameters: { 699 | Value: { 700 | type: 'string', 701 | description: 'Text' 702 | } 703 | } 704 | }, 705 | 706 | ReplaySetSelectedEventTextCamera: { 707 | description: 'Replay: Changes the text of the selected event of the specified angle (1-8). Example: 3,angle3text', 708 | parameters: { 709 | Value: [ // Composite separated by "," 710 | { 711 | type: 'number', 712 | description: 'Camera' 713 | }, 714 | { 715 | type: 'string', 716 | description: 'Text' 717 | } 718 | ] 719 | } 720 | }, 721 | 722 | ReplaySetSpeed: { 723 | description: 'Replay: See SetRateSlowMotion', 724 | parameters: { 725 | Value: { 726 | type: 'number', 727 | description: 'Speed 0.0-1.0' 728 | }, 729 | 730 | Channel: { 731 | type: 'string', 732 | description: 'Valid values: Current, A or B' 733 | } 734 | } 735 | }, 736 | 737 | // Added in version 26 738 | ReplaySetTimecode: { 739 | description: 'Replay: Set position to Timecode', 740 | parameters: { 741 | Value: { 742 | type: 'number', 743 | description: 'Timecode in format yyyy-MM-ddTHH:mm:ss.fff' 744 | }, 745 | 746 | Channel: { 747 | type: 'string', 748 | description: 'Valid values: Current, A or B' 749 | } 750 | } 751 | }, 752 | 753 | ReplayShowHide: 'Replay: Show/hide replay window', 754 | 755 | ReplayStartRecording: 'Replay: Start recording of replay session', 756 | ReplayStartStopRecording: 'Replay: Toggle start/stop recording replay', 757 | 758 | ReplayStopEvents: { 759 | description: 'Replay: Stop events playback on a replay channel', 760 | parameters: { 761 | Channel: CHANNEL, 762 | } 763 | }, 764 | 765 | ReplayStopRecording: 'Replay: Stop recording of replay session', 766 | 767 | ReplaySwapChannels: 'Swap A to B and vice versa, includes angles and playback status.', 768 | 769 | ReplayToggleLastEventCamera1: 'Replay: Toggle Camera angle 1 for Last event', 770 | ReplayToggleLastEventCamera2: 'Replay: Toggle Camera angle 2 for Last event', 771 | ReplayToggleLastEventCamera3: 'Replay: Toggle Camera angle 3 for Last event', 772 | ReplayToggleLastEventCamera4: 'Replay: Toggle Camera angle 4 for Last event', 773 | ReplayToggleLastEventCamera5: 'Replay: Toggle Camera angle 5 for Last event', 774 | ReplayToggleLastEventCamera6: 'Replay: Toggle Camera angle 6 for Last event', 775 | ReplayToggleLastEventCamera7: 'Replay: Toggle Camera angle 7 for Last event', 776 | ReplayToggleLastEventCamera8: 'Replay: Toggle Camera angle 8 for Last event', 777 | 778 | ReplayToggleSelectedEventCamera1: 'Replay: Toggle Camera angle 1 for Selected event', 779 | ReplayToggleSelectedEventCamera2: 'Replay: Toggle Camera angle 2 for Selected event', 780 | ReplayToggleSelectedEventCamera3: 'Replay: Toggle Camera angle 3 for Selected event', 781 | ReplayToggleSelectedEventCamera4: 'Replay: Toggle Camera angle 4 for Selected event', 782 | ReplayToggleSelectedEventCamera5: 'Replay: Toggle Camera angle 5 for Selected event', 783 | ReplayToggleSelectedEventCamera6: 'Replay: Toggle Camera angle 6 for Selected event', 784 | ReplayToggleSelectedEventCamera7: 'Replay: Toggle Camera angle 7 for Selected event', 785 | ReplayToggleSelectedEventCamera8: 'Replay: Toggle Camera angle 8 for Selected event', 786 | 787 | ReplayUpdateSelectedInPoint: { 788 | description: 'Replay: Update In point of Selected Event to current Position on the given Channel', 789 | parameters: { 790 | Channel: CHANNEL, 791 | } 792 | }, 793 | ReplayUpdateSelectedOutPoint: { 794 | description: 'Replay: Update Mark Out point of Selected Event to current Position on the given Channel', 795 | parameters: { 796 | Channel: CHANNEL, 797 | } 798 | }, 799 | 800 | // New in vMix 24 801 | ReplayUpdateSelectedSpeed: { 802 | description: 'Replay: Update Selected Event to use Current Speed.', 803 | parameters: { 804 | Channel: CHANNEL, 805 | } 806 | }, 807 | 808 | ReplayUpdateSelectedSpeedDefault: { 809 | description: 'Update Selected Event to use Default Speed.', 810 | parameters: { 811 | Channel: { 812 | type: 'string', 813 | description: 'Valid values: Current, A or B' 814 | } 815 | } 816 | } 817 | } 818 | -------------------------------------------------------------------------------- /src/categories/10-ndi.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | NDICommand: { 4 | description: 'Send specified command to NDI source', 5 | parameters: { 6 | Input: 'input', 7 | Value: { 8 | type: 'string', 9 | description: 'Command to send' 10 | } 11 | } 12 | }, 13 | 14 | NDISelectSourceByIndex: { 15 | description: 'Select NDI source by Index', 16 | parameters: { 17 | Input: 'input', 18 | Value: { 19 | type: 'number', 20 | description: 'Index 0-100' 21 | } 22 | } 23 | }, 24 | 25 | NDISelectSourceByName: { 26 | description: 'Select NDI source by Name', 27 | parameters: { 28 | Input: 'input', 29 | Value: { 30 | type: 'string', 31 | description: 'Name of source' 32 | } 33 | } 34 | }, 35 | 36 | NDIStartRecording: { 37 | description: 'Start recording of NDI source input (raw NDI recording)', 38 | parameters: { 39 | Input: 'input' 40 | } 41 | }, 42 | 43 | NDIStopRecording: { 44 | description: 'Stop recording of NDI source input (raw NDI recording)', 45 | parameters: { 46 | Input: 'input' 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/categories/11-ptz.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | PTZCreateVirtualInput: { 3 | description: 'Creates a PTZ Virtual Input with the current Position', 4 | parameters: { 5 | Input: 'input' 6 | } 7 | }, 8 | 9 | PTZFocusAuto: { 10 | description: 'Turn on auto focus for PTZ camera', 11 | parameters: { 12 | Input: 'input' 13 | } 14 | }, 15 | 16 | PTZFocusFar: { 17 | description: 'Move focus farer away with speed for PTZ camera', 18 | parameters: { 19 | Input: 'input', 20 | Value: { 21 | type: 'number', 22 | description: 'Speed 0.0 - 1.0' 23 | } 24 | } 25 | }, 26 | 27 | PTZFocusManual: { 28 | description: 'Turn on manual focus for PTZ camera (disables auto focus)', 29 | parameters: { 30 | Input: 'input' 31 | } 32 | }, 33 | 34 | PTZFocusNear: { 35 | description: 'Move focus nearer with speed for PTZ camera', 36 | parameters: { 37 | Input: 'input', 38 | Value: { 39 | type: 'number', 40 | description: 'Speed 0.0 - 1.0' 41 | } 42 | } 43 | }, 44 | 45 | PTZFocusStop: { 46 | description: 'Stop focus movement for PTZ camera', 47 | parameters: { 48 | Input: 'input' 49 | } 50 | }, 51 | 52 | PTZHome: { 53 | description: 'Go to home position for PTZ camera', 54 | parameters: { 55 | Input: 'input' 56 | } 57 | }, 58 | 59 | PTZMoveDown: { 60 | description: 'Move down with speed for PTZ camera', 61 | parameters: { 62 | Input: 'input', 63 | Value: { 64 | type: 'number', 65 | description: 'Speed 0.0 - 1.0' 66 | } 67 | } 68 | }, 69 | 70 | PTZMoveDownLeft: { 71 | description: 'Move down+left with speed for PTZ camera', 72 | parameters: { 73 | Input: 'input', 74 | Value: { 75 | type: 'number', 76 | description: 'Speed 0.0 - 1.0' 77 | } 78 | } 79 | }, 80 | 81 | PTZMoveDownRight: { 82 | description: 'Move down+right with speed for PTZ camera', 83 | parameters: { 84 | Input: 'input', 85 | Value: { 86 | type: 'number', 87 | description: 'Speed 0.0 - 1.0' 88 | } 89 | } 90 | }, 91 | 92 | PTZMoveLeft: { 93 | description: 'Move left with speed for PTZ camera', 94 | parameters: { 95 | Input: 'input', 96 | Value: { 97 | type: 'number', 98 | description: 'Speed 0.0 - 1.0' 99 | } 100 | } 101 | }, 102 | 103 | PTZMoveRight: { 104 | description: 'Move right with speed for PTZ camera', 105 | parameters: { 106 | Input: 'input', 107 | Value: { 108 | type: 'number', 109 | description: 'Speed 0.0 - 1.0' 110 | } 111 | } 112 | }, 113 | 114 | PTZMoveStop: { 115 | description: 'Stop all movement for PTZ camera', 116 | parameters: { 117 | Input: 'input' 118 | } 119 | }, 120 | 121 | PTZMoveToVirtualInputPosition: { 122 | description: 'Moves to the Position of the PTZ Virtual Input without selecting it into Preview', 123 | parameters: { 124 | Input: 'input' 125 | } 126 | }, 127 | 128 | PTZMoveToVirtualInputPositionByIndex: { 129 | description: 'Moves to the Position of the PTZ Virtual Input associated with this Input', 130 | parameters: { 131 | Input: 'input', 132 | Value: { 133 | type: 'number', 134 | description: 'Index 0-100. Index is first Input found starting from 0' 135 | } 136 | } 137 | }, 138 | 139 | PTZMoveUp: { 140 | description: 'Move up with speed for PTZ camera', 141 | parameters: { 142 | Input: 'input', 143 | Value: { 144 | type: 'number', 145 | description: 'Speed 0.0 - 1.0' 146 | } 147 | } 148 | }, 149 | 150 | PTZMoveUpLeft: { 151 | description: 'Move up+left with speed for PTZ camera', 152 | parameters: { 153 | Input: 'input', 154 | Value: { 155 | type: 'number', 156 | description: 'Speed 0.0 - 1.0' 157 | } 158 | } 159 | }, 160 | 161 | PTZMoveUpRight: { 162 | description: 'Move up+right with speed for PTZ camera', 163 | parameters: { 164 | Input: 'input', 165 | Value: { 166 | type: 'number', 167 | description: 'Speed 0.0 - 1.0' 168 | } 169 | } 170 | }, 171 | 172 | PTZUpdateVirtualInput: { 173 | description: 'Updates selected PTZ Virtual Input with current Position', 174 | parameters: { 175 | Input: 'input' 176 | } 177 | }, 178 | 179 | 180 | PTZZoomIn: { 181 | description: 'Zoom in with speed for PTZ camera', 182 | parameters: { 183 | Input: 'input', 184 | Value: { 185 | type: 'number', 186 | description: 'Speed 0.0 - 1.0' 187 | } 188 | } 189 | }, 190 | 191 | PTZZoomOut: { 192 | description: 'Zoom out with speed for PTZ camera', 193 | parameters: { 194 | Input: 'input', 195 | Value: { 196 | type: 'number', 197 | description: 'Speed 0.0 - 1.0' 198 | } 199 | } 200 | }, 201 | 202 | PTZZoomStop: { 203 | description: 'Stop zoom for PTZ camera', 204 | parameters: { 205 | Input: 'input' 206 | } 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /src/categories/12-preset.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | LastPreset: 'Load the last preset', 3 | 4 | OpenPreset: { 5 | description: 'Load preset from the specified Filename', 6 | parameters: { 7 | Value: { 8 | type: 'string', 9 | description: 'Filename' 10 | } 11 | } 12 | }, 13 | 14 | SavePreset: { 15 | description: 'Save preset to the specified Filename', 16 | parameters: { 17 | Value: { 18 | type: 'string', 19 | description: 'Filename' 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/categories/13-datasources.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | DataSourceAutoNextOff: { 4 | description: 'Turn off auto next for data source', 5 | parameters: { 6 | Value: [ // Composite separated by "," 7 | { 8 | type: 'string', 9 | description: 'Data source name Name' 10 | }, 11 | { 12 | type: 'string', 13 | description: 'Table name' 14 | }, 15 | ] 16 | } 17 | }, 18 | 19 | DataSourceAutoNextOn: { 20 | description: 'Turn on auto next for data source', 21 | parameters: { 22 | Value: [ // Composite separated by "," 23 | { 24 | type: 'string', 25 | description: 'Data source name' 26 | }, 27 | { 28 | type: 'string', 29 | description: 'Table name' 30 | }, 31 | ] 32 | } 33 | }, 34 | 35 | DataSourceAutoNextOnOff: { 36 | description: 'Toggle on/off auto next for data source', 37 | parameters: { 38 | Value: [ // Composite separated by "," 39 | { 40 | type: 'string', 41 | description: 'Data source name' 42 | }, 43 | { 44 | type: 'string', 45 | description: 'Table name' 46 | }, 47 | ] 48 | } 49 | }, 50 | 51 | DataSourceNextRow: { 52 | description: 'Select next row of data source', 53 | parameters: { 54 | Value: [ // Composite separated by "," 55 | { 56 | type: 'string', 57 | description: 'Data source name' 58 | }, 59 | { 60 | type: 'string', 61 | description: 'Table name' 62 | }, 63 | ] 64 | } 65 | }, 66 | 67 | 68 | DataSourcePause: { 69 | description: 'Pause data source', 70 | parameters: { 71 | Value: { 72 | type: 'string', 73 | description: 'Data source name', 74 | examples: 'Excel/CSV' 75 | } 76 | } 77 | }, 78 | 79 | DataSourcePlay: { 80 | description: 'Play data source', 81 | parameters: { 82 | Value: { 83 | type: 'string', 84 | description: 'Data source name', 85 | examples: 'Excel/CSV' 86 | } 87 | } 88 | }, 89 | 90 | DataSourcePlayPause: { 91 | description: 'Play data source', 92 | parameters: { 93 | Value: { 94 | type: 'string', 95 | description: 'Data source name', 96 | examples: 'Excel/CSV' 97 | } 98 | } 99 | }, 100 | 101 | DataSourcePreviousRow: { 102 | description: 'Select previous row of data source', 103 | parameters: { 104 | Value: [ // Composite separated by "," 105 | { 106 | type: 'string', 107 | description: 'Data source name' 108 | }, 109 | { 110 | type: 'string', 111 | description: 'Table name' 112 | }, 113 | ] 114 | } 115 | }, 116 | 117 | DataSourceSelectRow: { 118 | description: 'Select row by row index of data source', 119 | parameters: { 120 | Value: [ // Composite separated by "," 121 | { 122 | type: 'string', 123 | description: 'Data source name' 124 | }, 125 | { 126 | type: 'string', 127 | description: 'Table name' 128 | }, 129 | { 130 | type: 'number', 131 | description: 'Row Index starting from 0' 132 | }, 133 | ] 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/categories/14-browser.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | BrowserBack: { 3 | description: 'Go back one page for browser input', 4 | parameters: { 5 | Input: 'input', 6 | }, 7 | }, 8 | 9 | BrowserForward: { 10 | description: 'Go forward one page for browser input', 11 | parameters: { 12 | Input: 'input', 13 | }, 14 | }, 15 | 16 | BrowserKeyboardDisabled: { 17 | description: 'Disable keyboard for browser input', 18 | parameters: { 19 | Input: 'input', 20 | }, 21 | }, 22 | 23 | BrowserKeyboardEnabled: { 24 | description: 'Enable keyboard for browser input', 25 | parameters: { 26 | Input: 'input', 27 | }, 28 | }, 29 | 30 | BrowserMouseDisabled: { 31 | description: 'Disable mouse interaction for browser input', 32 | parameters: { 33 | Input: 'input', 34 | }, 35 | }, 36 | 37 | BrowserMouseEnabled: { 38 | description: 'Enable mouse interaction for browser input', 39 | parameters: { 40 | Input: 'input', 41 | }, 42 | }, 43 | 44 | BrowserNavigate: { 45 | description: 'Navigate browser input to specific URL', 46 | parameters: { 47 | Input: 'input', 48 | Value: { 49 | type: 'url', 50 | description: 'URL to navigate to', 51 | }, 52 | }, 53 | }, 54 | 55 | BrowserReload: { 56 | description: 'Reload page for browser input', 57 | parameters: { 58 | Input: 'input', 59 | }, 60 | }, 61 | } 62 | -------------------------------------------------------------------------------- /src/categories/index.ts: -------------------------------------------------------------------------------- 1 | import General from './01-general' 2 | 3 | import Audio from './02-audio/index' 4 | import Transition from './03-transition' 5 | import Output from './04-output' 6 | import Title from './05-title' 7 | import Input from './05-input/index' 8 | import Overlay from './06-overlay' 9 | import Playlist from './07-playlist' 10 | import Scripting from './08-scripting' 11 | import Replay from './09-replay' 12 | import NDI from './10-ndi' 13 | import PTZ from './11-ptz' 14 | import Preset from './12-preset' 15 | import DataSources from './13-datasources' 16 | import Browser from './14-browser' 17 | 18 | // All functions broken up in categories 19 | // Respecting the order of the vMix documentation 20 | // See https://www.vmix.com/help23/ShortcutFunctionReference.html 21 | export default { 22 | General, 23 | Audio, 24 | Transition, 25 | Output, 26 | Title, 27 | Input, 28 | Overlay, 29 | Playlist, 30 | Scripting, 31 | Replay, 32 | NDI, 33 | PTZ, 34 | Preset, 35 | DataSources, 36 | Browser, 37 | } 38 | -------------------------------------------------------------------------------- /src/function-list.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | 3 | import { 4 | SimpleFunctionParameter, 5 | VmixFunctionDefinition, 6 | VmixFunctionParameter, 7 | VmixFunctionParameterType 8 | } from './types/vmix-function-definition' 9 | import { 10 | IntermediateVmixFunctionDefinition, 11 | IntermediateVmixFunctionParameter 12 | } from './types/intermediate/intermediate-vmix-function-definition' 13 | 14 | import functionsIntermediateList from './categories/index' 15 | 16 | const validParameterTypes: string[] = ['string', 'number', 'input', 'url'] 17 | 18 | 19 | // 20 | export default class FunctionList { 21 | protected _functions: VmixFunctionDefinition[] = [] 22 | 23 | constructor() { 24 | let functions = {} 25 | Object.entries(functionsIntermediateList) 26 | .forEach(([category, functionsInCategory]) => { 27 | functions = { 28 | ...this.parseFunctions(category, functionsInCategory), 29 | ...functions 30 | } 31 | }) 32 | 33 | this._functions = Object.values(functions) 34 | } 35 | 36 | /** 37 | * Returns complete list of functions in the vMix API 38 | */ 39 | all = (): VmixFunctionDefinition[] => { 40 | return this._functions 41 | } 42 | 43 | /** 44 | * Returns list of functions in specific category 45 | * Works case insentitive 46 | */ 47 | inCategory = (category: string) => { 48 | return this.all() 49 | .filter(f => f.category.toLowerCase() === category.toLowerCase()) 50 | } 51 | 52 | /** 53 | * Get function by function name 54 | */ 55 | get = (functionName: string): VmixFunctionDefinition => { 56 | const func = this._functions 57 | .find(f => f.function.toLowerCase() === functionName.toLowerCase()) 58 | 59 | if (!func) { 60 | throw new Error(`Function not found with name '${functionName}'`) 61 | } 62 | 63 | return func 64 | } 65 | 66 | /** 67 | * Parse functions 68 | * 69 | * @param functions 70 | */ 71 | protected parseFunctions = ( 72 | category: string, 73 | functions: { [key: string]: IntermediateVmixFunctionDefinition } 74 | ): { [key: string]: VmixFunctionDefinition } => { 75 | return _.keyBy(( 76 | Object.entries(functions) 77 | .map(([functionName, obj]) => this.parseFunction(category, functionName, obj)) 78 | ), 79 | (func: VmixFunctionDefinition) => func.function 80 | ) 81 | } 82 | 83 | /** 84 | * 85 | * @param functionName 86 | * @param functionObj 87 | */ 88 | protected parseFunction = ( 89 | category: string, 90 | functionName: string, 91 | functionObj: IntermediateVmixFunctionDefinition 92 | ): VmixFunctionDefinition => { 93 | const output = { 94 | category, 95 | function: functionName, 96 | description: '', 97 | parameters: {}, 98 | examples: [] 99 | } as VmixFunctionDefinition 100 | 101 | // Is functionObj just a string - then parse it as description 102 | if (typeof functionObj === 'string') { 103 | output.description = functionObj 104 | return output 105 | } 106 | 107 | // Is functionObj not a object 108 | if (typeof functionObj !== 'object') { 109 | console.error(functionObj) 110 | throw new Error(`Invalid function object of type ${typeof functionObj}`) 111 | } 112 | 113 | // Is functionObj an object, we can read from it 114 | if ('description' in functionObj) { 115 | output.description = functionObj.description || '' 116 | } 117 | if ('examples' in functionObj && functionObj.examples && Array.isArray(functionObj.examples)) { 118 | output.examples = (functionObj.examples as string[]) 119 | } 120 | if ('parameters' in functionObj) { 121 | output.parameters = this.parseFunctionParameters(functionObj.parameters || {}) 122 | } 123 | 124 | return output 125 | } 126 | 127 | /** 128 | * 129 | * @param params 130 | */ 131 | protected parseFunctionParameters = ( 132 | params: { [key: string]: IntermediateVmixFunctionParameter } 133 | ): { [key: string]: VmixFunctionParameter } => { 134 | const parameters: { [key: string]: VmixFunctionParameter } = {} 135 | 136 | Object.entries(params).forEach(([paramKey, parameterValue]) => { 137 | parameters[paramKey] = this.parseFunctionParameter(paramKey, parameterValue) 138 | }) 139 | 140 | return parameters 141 | } 142 | 143 | /** 144 | * 145 | * @param paramKey 146 | * @param value 147 | */ 148 | protected parseFunctionParameter = ( 149 | paramKey: string, 150 | value: IntermediateVmixFunctionParameter 151 | ): VmixFunctionParameter => { 152 | 153 | if (Array.isArray(value)) { 154 | return { 155 | composites: value.reduce( 156 | (all: SimpleFunctionParameter[], subparamValue) => { 157 | all.push(this.parseFunctionParameter(paramKey, subparamValue) as SimpleFunctionParameter) 158 | return all 159 | }, 160 | []) 161 | } 162 | } 163 | 164 | const parameter: SimpleFunctionParameter = { 165 | type: 'string', 166 | description: '', 167 | optional: false 168 | } 169 | 170 | // If value is a string - wrap just type 171 | if (typeof value === 'string') { 172 | parameter.type = value as VmixFunctionParameterType 173 | } 174 | // If value is an object - wrap type, description and examlpes if possible 175 | else if (typeof value === 'object') { 176 | if ('type' in value) { 177 | parameter.type = value.type 178 | } 179 | if ('description' in value) { 180 | parameter.description = value.description || '' 181 | } 182 | if ('optional' in value) { 183 | parameter.optional = value.optional || false 184 | } 185 | } 186 | 187 | if (!validParameterTypes.includes(parameter.type)) { 188 | throw new Error(`Parameter '${paramKey}' had unknown type '${parameter.type}'...`) 189 | } 190 | 191 | return parameter 192 | } 193 | } 194 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import FunctionList from './function-list' 2 | 3 | export default FunctionList 4 | 5 | // For CommonJS default export support 6 | // module.exports = FunctionList 7 | // module.exports.default = FunctionList 8 | -------------------------------------------------------------------------------- /src/types/input.ts: -------------------------------------------------------------------------------- 1 | export type Input = string | number -------------------------------------------------------------------------------- /src/types/intermediate/intermediate-vmix-function-definition.ts: -------------------------------------------------------------------------------- 1 | // 2 | import { VmixFunctionParameterType } from '../vmix-function-definition' 3 | 4 | // Function description type - can only be a string 5 | type FunctionDescriptionDefinition = string 6 | 7 | type FunctionParameterValue = { 8 | type: VmixFunctionParameterType 9 | description?: string 10 | optional?: boolean 11 | } 12 | 13 | // Function parameter can be a description, a function parameter value or array of these 14 | export type IntermediateVmixFunctionParameter = FunctionDescriptionDefinition 15 | | FunctionParameterValue 16 | | FunctionParameterValue[] 17 | 18 | export type IntermediateVmixFunctionDefinition = FunctionDescriptionDefinition | { 19 | description?: string 20 | parameters?: { 21 | [key: string]: IntermediateVmixFunctionParameter 22 | } 23 | examples?: string[] 24 | } -------------------------------------------------------------------------------- /src/types/vmix-function-definition.ts: -------------------------------------------------------------------------------- 1 | export type VmixFunctionParameterType = string // 'string' | 'number' | 'input' | 'url' 2 | // 3 | export type SimpleFunctionParameter = { 4 | type: VmixFunctionParameterType 5 | description: string 6 | optional: boolean 7 | } 8 | 9 | export type CompositeFunctionParameter = { 10 | composites: SimpleFunctionParameter[] 11 | } 12 | 13 | export type VmixFunctionParameter = SimpleFunctionParameter | CompositeFunctionParameter 14 | 15 | export type VmixFunctionDefinition = { 16 | function: string 17 | category: string 18 | description: string 19 | parameters: { [key: string]: VmixFunctionParameter } 20 | examples: string[] 21 | } -------------------------------------------------------------------------------- /test/function-list.test.js: -------------------------------------------------------------------------------- 1 | // Using assert library 2 | const assert = require('assert') 3 | 4 | // Import the modules 5 | const vMixFunctionList = require('../dist/index').default 6 | 7 | const functionList = new vMixFunctionList() 8 | 9 | const TOTAL_NUMBER_OF_FUNCTIONS = 710 10 | 11 | describe('function-list', function () { 12 | it('should have a large number of functions in total', function () { 13 | const allFunctions = functionList.all() 14 | assert.equal(allFunctions.length, TOTAL_NUMBER_OF_FUNCTIONS, 'Did not see expected number of functions') 15 | }) 16 | 17 | it('should have a function called Cut', function () { 18 | const cutFunction = functionList.get('cut') 19 | 20 | // console.log(cutFunction) 21 | // console.log(cutFunction.parameters.Input) 22 | 23 | assert.equal(cutFunction.description, 'Cut transition', 'Did not see expected description') 24 | // Parameter 25 | assert.equal(Object.values(cutFunction.parameters).length, 1, 'Did not see expected number of parameters') 26 | assert.equal(typeof cutFunction.parameters.Input, 'object', 'Did not see expected parameter') 27 | assert.equal(cutFunction.parameters.Input.type, 'input', 'Did not see expected parameter info type') 28 | assert.equal(cutFunction.parameters.Input.optional, false, 'Did not see expected parameter info mandatory') 29 | }) 30 | 31 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 7 | "lib": ["es2017", "es7", "es6", "dom"], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | "outDir": "./dist", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 19 | // "removeComments": true, /* Do not emit comments to output. */ 20 | // "noEmit": true, /* Do not emit outputs. */ 21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 24 | 25 | /* Strict Type-Checking Options */ 26 | "strict": true, /* Enable all strict type-checking options. */ 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | 35 | /* Additional Checks */ 36 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 37 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 38 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 39 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 40 | 41 | /* Module Resolution Options */ 42 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 43 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 44 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | // "typeRoots": [], /* List of folders to include type definitions from. */ 47 | // "types": [], /* Type declaration files to be included in compilation. */ 48 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 49 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 50 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 51 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 52 | 53 | /* Source Map Options */ 54 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 55 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 56 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 57 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 58 | 59 | /* Experimental Options */ 60 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 61 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 62 | }, 63 | "include": ["src"], 64 | "exclude": [ 65 | "node_modules", 66 | "**/__tests__/*", 67 | "dist" 68 | ] 69 | } 70 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/lodash@^4.14.188": 6 | version "4.14.188" 7 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.188.tgz#e4990c4c81f7c9b00c5ff8eae389c10f27980da5" 8 | integrity sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w== 9 | 10 | "@types/mocha@^10.0.0": 11 | version "10.0.0" 12 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.0.tgz#3d9018c575f0e3f7386c1de80ee66cc21fbb7a52" 13 | integrity sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg== 14 | 15 | "@types/node@^14.14.35": 16 | version "14.17.32" 17 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.32.tgz#2ca61c9ef8c77f6fa1733be9e623ceb0d372ad96" 18 | integrity sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ== 19 | 20 | "@ungap/promise-all-settled@1.1.2": 21 | version "1.1.2" 22 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 23 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 24 | 25 | "@xmldom/xmldom@^0.8.6": 26 | version "0.8.6" 27 | resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" 28 | integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== 29 | 30 | ansi-colors@4.1.1: 31 | version "4.1.1" 32 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 33 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 34 | 35 | ansi-regex@^5.0.1: 36 | version "5.0.1" 37 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 38 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 39 | 40 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 41 | version "4.3.0" 42 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 43 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 44 | dependencies: 45 | color-convert "^2.0.1" 46 | 47 | anymatch@~3.1.2: 48 | version "3.1.2" 49 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 50 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 51 | dependencies: 52 | normalize-path "^3.0.0" 53 | picomatch "^2.0.4" 54 | 55 | argparse@^2.0.1: 56 | version "2.0.1" 57 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 58 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 59 | 60 | asynckit@^0.4.0: 61 | version "0.4.0" 62 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 63 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 64 | 65 | axios@^1.1.3: 66 | version "1.6.0" 67 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" 68 | integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== 69 | dependencies: 70 | follow-redirects "^1.15.0" 71 | form-data "^4.0.0" 72 | proxy-from-env "^1.1.0" 73 | 74 | balanced-match@^1.0.0: 75 | version "1.0.2" 76 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 77 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 78 | 79 | binary-extensions@^2.0.0: 80 | version "2.2.0" 81 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 82 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 83 | 84 | brace-expansion@^1.1.7: 85 | version "1.1.11" 86 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 87 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 88 | dependencies: 89 | balanced-match "^1.0.0" 90 | concat-map "0.0.1" 91 | 92 | braces@~3.0.2: 93 | version "3.0.2" 94 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 95 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 96 | dependencies: 97 | fill-range "^7.0.1" 98 | 99 | browser-stdout@1.3.1: 100 | version "1.3.1" 101 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 102 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 103 | 104 | camelcase@^6.0.0: 105 | version "6.2.0" 106 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" 107 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 108 | 109 | chalk@^4.1.0: 110 | version "4.1.2" 111 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 112 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 113 | dependencies: 114 | ansi-styles "^4.1.0" 115 | supports-color "^7.1.0" 116 | 117 | chokidar@3.5.2: 118 | version "3.5.2" 119 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 120 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 121 | dependencies: 122 | anymatch "~3.1.2" 123 | braces "~3.0.2" 124 | glob-parent "~5.1.2" 125 | is-binary-path "~2.1.0" 126 | is-glob "~4.0.1" 127 | normalize-path "~3.0.0" 128 | readdirp "~3.6.0" 129 | optionalDependencies: 130 | fsevents "~2.3.2" 131 | 132 | cliui@^7.0.2: 133 | version "7.0.4" 134 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 135 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 136 | dependencies: 137 | string-width "^4.2.0" 138 | strip-ansi "^6.0.0" 139 | wrap-ansi "^7.0.0" 140 | 141 | color-convert@^2.0.1: 142 | version "2.0.1" 143 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 144 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 145 | dependencies: 146 | color-name "~1.1.4" 147 | 148 | color-name@~1.1.4: 149 | version "1.1.4" 150 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 151 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 152 | 153 | combined-stream@^1.0.8: 154 | version "1.0.8" 155 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 156 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 157 | dependencies: 158 | delayed-stream "~1.0.0" 159 | 160 | concat-map@0.0.1: 161 | version "0.0.1" 162 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 163 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 164 | 165 | debug@4.3.2: 166 | version "4.3.2" 167 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 168 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 169 | dependencies: 170 | ms "2.1.2" 171 | 172 | decamelize@^4.0.0: 173 | version "4.0.0" 174 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 175 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 176 | 177 | delayed-stream@~1.0.0: 178 | version "1.0.0" 179 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 180 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 181 | 182 | diff@5.0.0: 183 | version "5.0.0" 184 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 185 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 186 | 187 | emoji-regex@^8.0.0: 188 | version "8.0.0" 189 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 190 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 191 | 192 | escalade@^3.1.1: 193 | version "3.1.1" 194 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 195 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 196 | 197 | escape-string-regexp@4.0.0: 198 | version "4.0.0" 199 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 200 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 201 | 202 | fill-range@^7.0.1: 203 | version "7.0.1" 204 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 205 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 206 | dependencies: 207 | to-regex-range "^5.0.1" 208 | 209 | find-up@5.0.0: 210 | version "5.0.0" 211 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 212 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 213 | dependencies: 214 | locate-path "^6.0.0" 215 | path-exists "^4.0.0" 216 | 217 | flat@^5.0.2: 218 | version "5.0.2" 219 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 220 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 221 | 222 | follow-redirects@^1.15.0: 223 | version "1.15.6" 224 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" 225 | integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== 226 | 227 | form-data@^4.0.0: 228 | version "4.0.0" 229 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 230 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 231 | dependencies: 232 | asynckit "^0.4.0" 233 | combined-stream "^1.0.8" 234 | mime-types "^2.1.12" 235 | 236 | fs.realpath@^1.0.0: 237 | version "1.0.0" 238 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 239 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 240 | 241 | fsevents@~2.3.2: 242 | version "2.3.2" 243 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 244 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 245 | 246 | get-caller-file@^2.0.5: 247 | version "2.0.5" 248 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 249 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 250 | 251 | glob-parent@~5.1.2: 252 | version "5.1.2" 253 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 254 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 255 | dependencies: 256 | is-glob "^4.0.1" 257 | 258 | glob@7.1.7: 259 | version "7.1.7" 260 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 261 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 262 | dependencies: 263 | fs.realpath "^1.0.0" 264 | inflight "^1.0.4" 265 | inherits "2" 266 | minimatch "^3.0.4" 267 | once "^1.3.0" 268 | path-is-absolute "^1.0.0" 269 | 270 | growl@1.10.5: 271 | version "1.10.5" 272 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 273 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 274 | 275 | has-flag@^4.0.0: 276 | version "4.0.0" 277 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 278 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 279 | 280 | he@1.2.0: 281 | version "1.2.0" 282 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 283 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 284 | 285 | inflight@^1.0.4: 286 | version "1.0.6" 287 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 288 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 289 | dependencies: 290 | once "^1.3.0" 291 | wrappy "1" 292 | 293 | inherits@2: 294 | version "2.0.4" 295 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 296 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 297 | 298 | is-binary-path@~2.1.0: 299 | version "2.1.0" 300 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 301 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 302 | dependencies: 303 | binary-extensions "^2.0.0" 304 | 305 | is-extglob@^2.1.1: 306 | version "2.1.1" 307 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 308 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 309 | 310 | is-fullwidth-code-point@^3.0.0: 311 | version "3.0.0" 312 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 313 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 314 | 315 | is-glob@^4.0.1, is-glob@~4.0.1: 316 | version "4.0.3" 317 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 318 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 319 | dependencies: 320 | is-extglob "^2.1.1" 321 | 322 | is-number@^7.0.0: 323 | version "7.0.0" 324 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 325 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 326 | 327 | is-plain-obj@^2.1.0: 328 | version "2.1.0" 329 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 330 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 331 | 332 | is-unicode-supported@^0.1.0: 333 | version "0.1.0" 334 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 335 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 336 | 337 | isexe@^2.0.0: 338 | version "2.0.0" 339 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 340 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 341 | 342 | js-yaml@4.1.0: 343 | version "4.1.0" 344 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 345 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 346 | dependencies: 347 | argparse "^2.0.1" 348 | 349 | locate-path@^6.0.0: 350 | version "6.0.0" 351 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 352 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 353 | dependencies: 354 | p-locate "^5.0.0" 355 | 356 | lodash@^4.17.21: 357 | version "4.17.21" 358 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 359 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 360 | 361 | log-symbols@4.1.0: 362 | version "4.1.0" 363 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 364 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 365 | dependencies: 366 | chalk "^4.1.0" 367 | is-unicode-supported "^0.1.0" 368 | 369 | mime-db@1.52.0: 370 | version "1.52.0" 371 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 372 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 373 | 374 | mime-types@^2.1.12: 375 | version "2.1.35" 376 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 377 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 378 | dependencies: 379 | mime-db "1.52.0" 380 | 381 | minimatch@3.0.4, minimatch@^3.0.4: 382 | version "3.0.4" 383 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 384 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 385 | dependencies: 386 | brace-expansion "^1.1.7" 387 | 388 | mocha@^9.1.3: 389 | version "9.1.3" 390 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" 391 | integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== 392 | dependencies: 393 | "@ungap/promise-all-settled" "1.1.2" 394 | ansi-colors "4.1.1" 395 | browser-stdout "1.3.1" 396 | chokidar "3.5.2" 397 | debug "4.3.2" 398 | diff "5.0.0" 399 | escape-string-regexp "4.0.0" 400 | find-up "5.0.0" 401 | glob "7.1.7" 402 | growl "1.10.5" 403 | he "1.2.0" 404 | js-yaml "4.1.0" 405 | log-symbols "4.1.0" 406 | minimatch "3.0.4" 407 | ms "2.1.3" 408 | nanoid "3.1.25" 409 | serialize-javascript "6.0.0" 410 | strip-json-comments "3.1.1" 411 | supports-color "8.1.1" 412 | which "2.0.2" 413 | workerpool "6.1.5" 414 | yargs "16.2.0" 415 | yargs-parser "20.2.4" 416 | yargs-unparser "2.0.0" 417 | 418 | ms@2.1.2: 419 | version "2.1.2" 420 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 421 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 422 | 423 | ms@2.1.3: 424 | version "2.1.3" 425 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 426 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 427 | 428 | nanoid@3.1.25: 429 | version "3.1.25" 430 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" 431 | integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== 432 | 433 | normalize-path@^3.0.0, normalize-path@~3.0.0: 434 | version "3.0.0" 435 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 436 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 437 | 438 | once@^1.3.0: 439 | version "1.4.0" 440 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 441 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 442 | dependencies: 443 | wrappy "1" 444 | 445 | p-limit@^3.0.2: 446 | version "3.1.0" 447 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 448 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 449 | dependencies: 450 | yocto-queue "^0.1.0" 451 | 452 | p-locate@^5.0.0: 453 | version "5.0.0" 454 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 455 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 456 | dependencies: 457 | p-limit "^3.0.2" 458 | 459 | path-exists@^4.0.0: 460 | version "4.0.0" 461 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 462 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 463 | 464 | path-is-absolute@^1.0.0: 465 | version "1.0.1" 466 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 467 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 468 | 469 | picomatch@^2.0.4, picomatch@^2.2.1: 470 | version "2.3.0" 471 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 472 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 473 | 474 | proxy-from-env@^1.1.0: 475 | version "1.1.0" 476 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 477 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 478 | 479 | randombytes@^2.1.0: 480 | version "2.1.0" 481 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 482 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 483 | dependencies: 484 | safe-buffer "^5.1.0" 485 | 486 | readdirp@~3.6.0: 487 | version "3.6.0" 488 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 489 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 490 | dependencies: 491 | picomatch "^2.2.1" 492 | 493 | require-directory@^2.1.1: 494 | version "2.1.1" 495 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 496 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 497 | 498 | safe-buffer@^5.1.0: 499 | version "5.2.1" 500 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 501 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 502 | 503 | serialize-javascript@6.0.0: 504 | version "6.0.0" 505 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 506 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 507 | dependencies: 508 | randombytes "^2.1.0" 509 | 510 | string-width@^4.1.0, string-width@^4.2.0: 511 | version "4.2.3" 512 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 513 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 514 | dependencies: 515 | emoji-regex "^8.0.0" 516 | is-fullwidth-code-point "^3.0.0" 517 | strip-ansi "^6.0.1" 518 | 519 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 520 | version "6.0.1" 521 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 522 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 523 | dependencies: 524 | ansi-regex "^5.0.1" 525 | 526 | strip-json-comments@3.1.1: 527 | version "3.1.1" 528 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 529 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 530 | 531 | supports-color@8.1.1: 532 | version "8.1.1" 533 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 534 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 535 | dependencies: 536 | has-flag "^4.0.0" 537 | 538 | supports-color@^7.1.0: 539 | version "7.2.0" 540 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 541 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 542 | dependencies: 543 | has-flag "^4.0.0" 544 | 545 | to-regex-range@^5.0.1: 546 | version "5.0.1" 547 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 548 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 549 | dependencies: 550 | is-number "^7.0.0" 551 | 552 | typescript@^4.4: 553 | version "4.4.4" 554 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" 555 | integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== 556 | 557 | which@2.0.2: 558 | version "2.0.2" 559 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 560 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 561 | dependencies: 562 | isexe "^2.0.0" 563 | 564 | workerpool@6.1.5: 565 | version "6.1.5" 566 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" 567 | integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== 568 | 569 | wrap-ansi@^7.0.0: 570 | version "7.0.0" 571 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 572 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 573 | dependencies: 574 | ansi-styles "^4.0.0" 575 | string-width "^4.1.0" 576 | strip-ansi "^6.0.0" 577 | 578 | wrappy@1: 579 | version "1.0.2" 580 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 581 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 582 | 583 | xpath@^0.0.32: 584 | version "0.0.32" 585 | resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" 586 | integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== 587 | 588 | y18n@^5.0.5: 589 | version "5.0.8" 590 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 591 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 592 | 593 | yargs-parser@20.2.4: 594 | version "20.2.4" 595 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 596 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 597 | 598 | yargs-parser@^20.2.2: 599 | version "20.2.9" 600 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 601 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 602 | 603 | yargs-unparser@2.0.0: 604 | version "2.0.0" 605 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 606 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 607 | dependencies: 608 | camelcase "^6.0.0" 609 | decamelize "^4.0.0" 610 | flat "^5.0.2" 611 | is-plain-obj "^2.1.0" 612 | 613 | yargs@16.2.0: 614 | version "16.2.0" 615 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 616 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 617 | dependencies: 618 | cliui "^7.0.2" 619 | escalade "^3.1.1" 620 | get-caller-file "^2.0.5" 621 | require-directory "^2.1.1" 622 | string-width "^4.2.0" 623 | y18n "^5.0.5" 624 | yargs-parser "^20.2.2" 625 | 626 | yocto-queue@^0.1.0: 627 | version "0.1.0" 628 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 629 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 630 | --------------------------------------------------------------------------------