├── .gitignore ├── .npmignore ├── .vscode ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── bitwig-api.d.ts ├── package-lock.json ├── package.json ├── src ├── additional-types.d.ts.template ├── build.ts ├── main.ts ├── mods.ts ├── renderers │ ├── renderEnumDeclarations.ts │ ├── renderImportDeclarations.ts │ ├── renderTypeDeclarations │ │ ├── index.ts │ │ └── renderUnannType.ts │ └── util.ts ├── types.ts └── visit.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | /java_source 2 | /node_modules 3 | /dist 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.vscode 2 | /java_source 3 | /src 4 | /tsconfig.json 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "Launch Program", 8 | "runtimeArgs": [ 9 | "-r", 10 | "ts-node/register" 11 | ], 12 | "args": [ 13 | "${workspaceFolder}/src/build.ts" 14 | ], 15 | "resolveSourceMapLocations": [ 16 | "${workspaceFolder}/src/**" 17 | ], 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, Joseph Larson 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation and/or 12 | other materials provided with the distribution. 13 | 14 | 3. Neither the name of the copyright holder nor the names of its contributors 15 | may be used to endorse or promote products derived from this software without 16 | specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typed-bitwig-api 2 | 3 | Typescript types definition file for Bitwig Control Surface API. 4 | 5 | 6 | ## Installation 7 | 8 | ```bash 9 | $ npm install typed-bitwig-api 10 | ``` 11 | 12 | In your `tsconfig.json` for your project add the following to the `types` list: 13 | 14 | ```js 15 | { 16 | ... 17 | "types": [ 18 | ..., 19 | "typed-bitwig-api" 20 | ], 21 | ... 22 | } 23 | ``` 24 | 25 | 26 | ## Usage 27 | 28 | With the above installation complete, the `host` variable should be seen as available globally (along with `load`, `loadAPI`, `println`, `dump`, etc). API interfaces are made available for reference through the globally accessible `API` namespace. So, for example, if you wrote a function that took an instance of the API's `Transport` object, you would reference it as follows: 29 | 30 | ```ts 31 | function foo(transport: API.Transport) { 32 | // ... do something 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typed-bitwig-api", 3 | "version": "19.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "typed-bitwig-api", 9 | "version": "19.0.0", 10 | "license": "BSD-3-Clause", 11 | "devDependencies": { 12 | "@types/download": "6.2.4", 13 | "@types/node": "14.14.2", 14 | "@types/prettier": "2.1.5", 15 | "chevrotain": "6.5.0", 16 | "download": "^8.0.0", 17 | "java-parser": "0.8.2", 18 | "prettier": "2.1.2", 19 | "ts-node": "9.0.0", 20 | "typescript": "4.1.2" 21 | } 22 | }, 23 | "node_modules/@sindresorhus/is": { 24 | "version": "0.7.0", 25 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", 26 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", 27 | "dev": true, 28 | "engines": { 29 | "node": ">=4" 30 | } 31 | }, 32 | "node_modules/@types/decompress": { 33 | "version": "4.2.3", 34 | "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.3.tgz", 35 | "integrity": "sha512-W24e3Ycz1UZPgr1ZEDHlK4XnvOr+CpJH3qNsFeqXwwlW/9END9gxn3oJSsp7gYdiQxrXUHwUUd3xuzVz37MrZQ==", 36 | "dev": true, 37 | "dependencies": { 38 | "@types/node": "*" 39 | } 40 | }, 41 | "node_modules/@types/download": { 42 | "version": "6.2.4", 43 | "resolved": "https://registry.npmjs.org/@types/download/-/download-6.2.4.tgz", 44 | "integrity": "sha512-Lo5dy3ai6LNnbL663sgdzqL1eib11u1yKH6w3v3IXEOO4kRfQpMn1qWUTaumcHLACjFp1RcBx9tUXEvJoR3vcA==", 45 | "dev": true, 46 | "dependencies": { 47 | "@types/decompress": "*", 48 | "@types/got": "^8", 49 | "@types/node": "*" 50 | } 51 | }, 52 | "node_modules/@types/got": { 53 | "version": "8.3.5", 54 | "resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.5.tgz", 55 | "integrity": "sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A==", 56 | "dev": true, 57 | "dependencies": { 58 | "@types/node": "*" 59 | } 60 | }, 61 | "node_modules/@types/node": { 62 | "version": "14.14.2", 63 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", 64 | "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", 65 | "dev": true 66 | }, 67 | "node_modules/@types/prettier": { 68 | "version": "2.1.5", 69 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", 70 | "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", 71 | "dev": true 72 | }, 73 | "node_modules/archive-type": { 74 | "version": "4.0.0", 75 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", 76 | "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", 77 | "dev": true, 78 | "dependencies": { 79 | "file-type": "^4.2.0" 80 | }, 81 | "engines": { 82 | "node": ">=4" 83 | } 84 | }, 85 | "node_modules/archive-type/node_modules/file-type": { 86 | "version": "4.4.0", 87 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", 88 | "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", 89 | "dev": true, 90 | "engines": { 91 | "node": ">=4" 92 | } 93 | }, 94 | "node_modules/arg": { 95 | "version": "4.1.3", 96 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 97 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 98 | "dev": true 99 | }, 100 | "node_modules/base64-js": { 101 | "version": "1.5.1", 102 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 103 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 104 | "dev": true, 105 | "funding": [ 106 | { 107 | "type": "github", 108 | "url": "https://github.com/sponsors/feross" 109 | }, 110 | { 111 | "type": "patreon", 112 | "url": "https://www.patreon.com/feross" 113 | }, 114 | { 115 | "type": "consulting", 116 | "url": "https://feross.org/support" 117 | } 118 | ] 119 | }, 120 | "node_modules/bl": { 121 | "version": "1.2.3", 122 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 123 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 124 | "dev": true, 125 | "dependencies": { 126 | "readable-stream": "^2.3.5", 127 | "safe-buffer": "^5.1.1" 128 | } 129 | }, 130 | "node_modules/buffer": { 131 | "version": "5.7.1", 132 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 133 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 134 | "dev": true, 135 | "funding": [ 136 | { 137 | "type": "github", 138 | "url": "https://github.com/sponsors/feross" 139 | }, 140 | { 141 | "type": "patreon", 142 | "url": "https://www.patreon.com/feross" 143 | }, 144 | { 145 | "type": "consulting", 146 | "url": "https://feross.org/support" 147 | } 148 | ], 149 | "dependencies": { 150 | "base64-js": "^1.3.1", 151 | "ieee754": "^1.1.13" 152 | } 153 | }, 154 | "node_modules/buffer-alloc": { 155 | "version": "1.2.0", 156 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 157 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 158 | "dev": true, 159 | "dependencies": { 160 | "buffer-alloc-unsafe": "^1.1.0", 161 | "buffer-fill": "^1.0.0" 162 | } 163 | }, 164 | "node_modules/buffer-alloc-unsafe": { 165 | "version": "1.1.0", 166 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 167 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 168 | "dev": true 169 | }, 170 | "node_modules/buffer-crc32": { 171 | "version": "0.2.13", 172 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 173 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 174 | "dev": true, 175 | "engines": { 176 | "node": "*" 177 | } 178 | }, 179 | "node_modules/buffer-fill": { 180 | "version": "1.0.0", 181 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 182 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 183 | "dev": true 184 | }, 185 | "node_modules/buffer-from": { 186 | "version": "1.1.1", 187 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 188 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 189 | "dev": true 190 | }, 191 | "node_modules/cacheable-request": { 192 | "version": "2.1.4", 193 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", 194 | "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", 195 | "dev": true, 196 | "dependencies": { 197 | "clone-response": "1.0.2", 198 | "get-stream": "3.0.0", 199 | "http-cache-semantics": "3.8.1", 200 | "keyv": "3.0.0", 201 | "lowercase-keys": "1.0.0", 202 | "normalize-url": "2.0.1", 203 | "responselike": "1.0.2" 204 | } 205 | }, 206 | "node_modules/cacheable-request/node_modules/get-stream": { 207 | "version": "3.0.0", 208 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 209 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 210 | "dev": true, 211 | "engines": { 212 | "node": ">=4" 213 | } 214 | }, 215 | "node_modules/cacheable-request/node_modules/lowercase-keys": { 216 | "version": "1.0.0", 217 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 218 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", 219 | "dev": true, 220 | "engines": { 221 | "node": ">=0.10.0" 222 | } 223 | }, 224 | "node_modules/chevrotain": { 225 | "version": "6.5.0", 226 | "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", 227 | "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", 228 | "dev": true, 229 | "dependencies": { 230 | "regexp-to-ast": "0.4.0" 231 | } 232 | }, 233 | "node_modules/clone-response": { 234 | "version": "1.0.2", 235 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 236 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 237 | "dev": true, 238 | "dependencies": { 239 | "mimic-response": "^1.0.0" 240 | } 241 | }, 242 | "node_modules/commander": { 243 | "version": "2.20.3", 244 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 245 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 246 | "dev": true 247 | }, 248 | "node_modules/content-disposition": { 249 | "version": "0.5.3", 250 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 251 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 252 | "dev": true, 253 | "dependencies": { 254 | "safe-buffer": "5.1.2" 255 | }, 256 | "engines": { 257 | "node": ">= 0.6" 258 | } 259 | }, 260 | "node_modules/core-util-is": { 261 | "version": "1.0.2", 262 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 263 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 264 | "dev": true 265 | }, 266 | "node_modules/decode-uri-component": { 267 | "version": "0.2.0", 268 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 269 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 270 | "dev": true, 271 | "engines": { 272 | "node": ">=0.10" 273 | } 274 | }, 275 | "node_modules/decompress": { 276 | "version": "4.2.1", 277 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 278 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 279 | "dev": true, 280 | "dependencies": { 281 | "decompress-tar": "^4.0.0", 282 | "decompress-tarbz2": "^4.0.0", 283 | "decompress-targz": "^4.0.0", 284 | "decompress-unzip": "^4.0.1", 285 | "graceful-fs": "^4.1.10", 286 | "make-dir": "^1.0.0", 287 | "pify": "^2.3.0", 288 | "strip-dirs": "^2.0.0" 289 | }, 290 | "engines": { 291 | "node": ">=4" 292 | } 293 | }, 294 | "node_modules/decompress-response": { 295 | "version": "3.3.0", 296 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 297 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 298 | "dev": true, 299 | "dependencies": { 300 | "mimic-response": "^1.0.0" 301 | }, 302 | "engines": { 303 | "node": ">=4" 304 | } 305 | }, 306 | "node_modules/decompress-tar": { 307 | "version": "4.1.1", 308 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 309 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 310 | "dev": true, 311 | "dependencies": { 312 | "file-type": "^5.2.0", 313 | "is-stream": "^1.1.0", 314 | "tar-stream": "^1.5.2" 315 | }, 316 | "engines": { 317 | "node": ">=4" 318 | } 319 | }, 320 | "node_modules/decompress-tar/node_modules/file-type": { 321 | "version": "5.2.0", 322 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 323 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 324 | "dev": true, 325 | "engines": { 326 | "node": ">=4" 327 | } 328 | }, 329 | "node_modules/decompress-tarbz2": { 330 | "version": "4.1.1", 331 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 332 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 333 | "dev": true, 334 | "dependencies": { 335 | "decompress-tar": "^4.1.0", 336 | "file-type": "^6.1.0", 337 | "is-stream": "^1.1.0", 338 | "seek-bzip": "^1.0.5", 339 | "unbzip2-stream": "^1.0.9" 340 | }, 341 | "engines": { 342 | "node": ">=4" 343 | } 344 | }, 345 | "node_modules/decompress-tarbz2/node_modules/file-type": { 346 | "version": "6.2.0", 347 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 348 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", 349 | "dev": true, 350 | "engines": { 351 | "node": ">=4" 352 | } 353 | }, 354 | "node_modules/decompress-targz": { 355 | "version": "4.1.1", 356 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 357 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 358 | "dev": true, 359 | "dependencies": { 360 | "decompress-tar": "^4.1.1", 361 | "file-type": "^5.2.0", 362 | "is-stream": "^1.1.0" 363 | }, 364 | "engines": { 365 | "node": ">=4" 366 | } 367 | }, 368 | "node_modules/decompress-targz/node_modules/file-type": { 369 | "version": "5.2.0", 370 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 371 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 372 | "dev": true, 373 | "engines": { 374 | "node": ">=4" 375 | } 376 | }, 377 | "node_modules/decompress-unzip": { 378 | "version": "4.0.1", 379 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 380 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", 381 | "dev": true, 382 | "dependencies": { 383 | "file-type": "^3.8.0", 384 | "get-stream": "^2.2.0", 385 | "pify": "^2.3.0", 386 | "yauzl": "^2.4.2" 387 | }, 388 | "engines": { 389 | "node": ">=4" 390 | } 391 | }, 392 | "node_modules/decompress-unzip/node_modules/file-type": { 393 | "version": "3.9.0", 394 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 395 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", 396 | "dev": true, 397 | "engines": { 398 | "node": ">=0.10.0" 399 | } 400 | }, 401 | "node_modules/decompress-unzip/node_modules/get-stream": { 402 | "version": "2.3.1", 403 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 404 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 405 | "dev": true, 406 | "dependencies": { 407 | "object-assign": "^4.0.1", 408 | "pinkie-promise": "^2.0.0" 409 | }, 410 | "engines": { 411 | "node": ">=0.10.0" 412 | } 413 | }, 414 | "node_modules/decompress-unzip/node_modules/pify": { 415 | "version": "2.3.0", 416 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 417 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 418 | "dev": true, 419 | "engines": { 420 | "node": ">=0.10.0" 421 | } 422 | }, 423 | "node_modules/decompress/node_modules/make-dir": { 424 | "version": "1.3.0", 425 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 426 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 427 | "dev": true, 428 | "dependencies": { 429 | "pify": "^3.0.0" 430 | }, 431 | "engines": { 432 | "node": ">=4" 433 | } 434 | }, 435 | "node_modules/decompress/node_modules/make-dir/node_modules/pify": { 436 | "version": "3.0.0", 437 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 438 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 439 | "dev": true, 440 | "engines": { 441 | "node": ">=4" 442 | } 443 | }, 444 | "node_modules/decompress/node_modules/pify": { 445 | "version": "2.3.0", 446 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 447 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 448 | "dev": true, 449 | "engines": { 450 | "node": ">=0.10.0" 451 | } 452 | }, 453 | "node_modules/diff": { 454 | "version": "4.0.2", 455 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 456 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 457 | "dev": true, 458 | "engines": { 459 | "node": ">=0.3.1" 460 | } 461 | }, 462 | "node_modules/download": { 463 | "version": "8.0.0", 464 | "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", 465 | "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", 466 | "dev": true, 467 | "dependencies": { 468 | "archive-type": "^4.0.0", 469 | "content-disposition": "^0.5.2", 470 | "decompress": "^4.2.1", 471 | "ext-name": "^5.0.0", 472 | "file-type": "^11.1.0", 473 | "filenamify": "^3.0.0", 474 | "get-stream": "^4.1.0", 475 | "got": "^8.3.1", 476 | "make-dir": "^2.1.0", 477 | "p-event": "^2.1.0", 478 | "pify": "^4.0.1" 479 | }, 480 | "engines": { 481 | "node": ">=10" 482 | } 483 | }, 484 | "node_modules/duplexer3": { 485 | "version": "0.1.4", 486 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 487 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 488 | "dev": true 489 | }, 490 | "node_modules/end-of-stream": { 491 | "version": "1.4.4", 492 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 493 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 494 | "dev": true, 495 | "dependencies": { 496 | "once": "^1.4.0" 497 | } 498 | }, 499 | "node_modules/escape-string-regexp": { 500 | "version": "1.0.5", 501 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 502 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 503 | "dev": true, 504 | "engines": { 505 | "node": ">=0.8.0" 506 | } 507 | }, 508 | "node_modules/ext-list": { 509 | "version": "2.2.2", 510 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 511 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 512 | "dev": true, 513 | "dependencies": { 514 | "mime-db": "^1.28.0" 515 | }, 516 | "engines": { 517 | "node": ">=0.10.0" 518 | } 519 | }, 520 | "node_modules/ext-name": { 521 | "version": "5.0.0", 522 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 523 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 524 | "dev": true, 525 | "dependencies": { 526 | "ext-list": "^2.0.0", 527 | "sort-keys-length": "^1.0.0" 528 | }, 529 | "engines": { 530 | "node": ">=4" 531 | } 532 | }, 533 | "node_modules/fd-slicer": { 534 | "version": "1.1.0", 535 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 536 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 537 | "dev": true, 538 | "dependencies": { 539 | "pend": "~1.2.0" 540 | } 541 | }, 542 | "node_modules/file-type": { 543 | "version": "11.1.0", 544 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", 545 | "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", 546 | "dev": true, 547 | "engines": { 548 | "node": ">=6" 549 | } 550 | }, 551 | "node_modules/filename-reserved-regex": { 552 | "version": "2.0.0", 553 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 554 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", 555 | "dev": true, 556 | "engines": { 557 | "node": ">=4" 558 | } 559 | }, 560 | "node_modules/filenamify": { 561 | "version": "3.0.0", 562 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", 563 | "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", 564 | "dev": true, 565 | "dependencies": { 566 | "filename-reserved-regex": "^2.0.0", 567 | "strip-outer": "^1.0.0", 568 | "trim-repeated": "^1.0.0" 569 | }, 570 | "engines": { 571 | "node": ">=6" 572 | } 573 | }, 574 | "node_modules/from2": { 575 | "version": "2.3.0", 576 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 577 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 578 | "dev": true, 579 | "dependencies": { 580 | "inherits": "^2.0.1", 581 | "readable-stream": "^2.0.0" 582 | } 583 | }, 584 | "node_modules/fs-constants": { 585 | "version": "1.0.0", 586 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 587 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 588 | "dev": true 589 | }, 590 | "node_modules/get-stream": { 591 | "version": "4.1.0", 592 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 593 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 594 | "dev": true, 595 | "dependencies": { 596 | "pump": "^3.0.0" 597 | }, 598 | "engines": { 599 | "node": ">=6" 600 | } 601 | }, 602 | "node_modules/got": { 603 | "version": "8.3.2", 604 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", 605 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", 606 | "dev": true, 607 | "dependencies": { 608 | "@sindresorhus/is": "^0.7.0", 609 | "cacheable-request": "^2.1.1", 610 | "decompress-response": "^3.3.0", 611 | "duplexer3": "^0.1.4", 612 | "get-stream": "^3.0.0", 613 | "into-stream": "^3.1.0", 614 | "is-retry-allowed": "^1.1.0", 615 | "isurl": "^1.0.0-alpha5", 616 | "lowercase-keys": "^1.0.0", 617 | "mimic-response": "^1.0.0", 618 | "p-cancelable": "^0.4.0", 619 | "p-timeout": "^2.0.1", 620 | "pify": "^3.0.0", 621 | "safe-buffer": "^5.1.1", 622 | "timed-out": "^4.0.1", 623 | "url-parse-lax": "^3.0.0", 624 | "url-to-options": "^1.0.1" 625 | }, 626 | "engines": { 627 | "node": ">=4" 628 | } 629 | }, 630 | "node_modules/got/node_modules/get-stream": { 631 | "version": "3.0.0", 632 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 633 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 634 | "dev": true, 635 | "engines": { 636 | "node": ">=4" 637 | } 638 | }, 639 | "node_modules/got/node_modules/pify": { 640 | "version": "3.0.0", 641 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 642 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 643 | "dev": true, 644 | "engines": { 645 | "node": ">=4" 646 | } 647 | }, 648 | "node_modules/graceful-fs": { 649 | "version": "4.2.6", 650 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 651 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 652 | "dev": true 653 | }, 654 | "node_modules/has-symbol-support-x": { 655 | "version": "1.4.2", 656 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 657 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", 658 | "dev": true, 659 | "engines": { 660 | "node": "*" 661 | } 662 | }, 663 | "node_modules/has-to-string-tag-x": { 664 | "version": "1.4.1", 665 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 666 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 667 | "dev": true, 668 | "dependencies": { 669 | "has-symbol-support-x": "^1.4.1" 670 | }, 671 | "engines": { 672 | "node": "*" 673 | } 674 | }, 675 | "node_modules/http-cache-semantics": { 676 | "version": "3.8.1", 677 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 678 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", 679 | "dev": true 680 | }, 681 | "node_modules/ieee754": { 682 | "version": "1.2.1", 683 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 684 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 685 | "dev": true, 686 | "funding": [ 687 | { 688 | "type": "github", 689 | "url": "https://github.com/sponsors/feross" 690 | }, 691 | { 692 | "type": "patreon", 693 | "url": "https://www.patreon.com/feross" 694 | }, 695 | { 696 | "type": "consulting", 697 | "url": "https://feross.org/support" 698 | } 699 | ] 700 | }, 701 | "node_modules/inherits": { 702 | "version": "2.0.4", 703 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 704 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 705 | "dev": true 706 | }, 707 | "node_modules/into-stream": { 708 | "version": "3.1.0", 709 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 710 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 711 | "dev": true, 712 | "dependencies": { 713 | "from2": "^2.1.1", 714 | "p-is-promise": "^1.1.0" 715 | }, 716 | "engines": { 717 | "node": ">=4" 718 | } 719 | }, 720 | "node_modules/is-natural-number": { 721 | "version": "4.0.1", 722 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 723 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", 724 | "dev": true 725 | }, 726 | "node_modules/is-object": { 727 | "version": "1.0.2", 728 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", 729 | "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", 730 | "dev": true, 731 | "funding": { 732 | "url": "https://github.com/sponsors/ljharb" 733 | } 734 | }, 735 | "node_modules/is-plain-obj": { 736 | "version": "1.1.0", 737 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 738 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 739 | "dev": true, 740 | "engines": { 741 | "node": ">=0.10.0" 742 | } 743 | }, 744 | "node_modules/is-retry-allowed": { 745 | "version": "1.2.0", 746 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 747 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", 748 | "dev": true, 749 | "engines": { 750 | "node": ">=0.10.0" 751 | } 752 | }, 753 | "node_modules/is-stream": { 754 | "version": "1.1.0", 755 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 756 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 757 | "dev": true, 758 | "engines": { 759 | "node": ">=0.10.0" 760 | } 761 | }, 762 | "node_modules/isarray": { 763 | "version": "1.0.0", 764 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 765 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 766 | "dev": true 767 | }, 768 | "node_modules/isurl": { 769 | "version": "1.0.0", 770 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 771 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 772 | "dev": true, 773 | "dependencies": { 774 | "has-to-string-tag-x": "^1.2.0", 775 | "is-object": "^1.0.1" 776 | }, 777 | "engines": { 778 | "node": ">= 4" 779 | } 780 | }, 781 | "node_modules/java-parser": { 782 | "version": "0.8.2", 783 | "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-0.8.2.tgz", 784 | "integrity": "sha512-YphTEk4zIpWAHqBriAdjlNnTEcEYQ2xBA8KOH5V7QxggNbxjkeEcKJjNYnQvqEue8+O1TLj7vfL0NVG6x5LGMw==", 785 | "dev": true, 786 | "dependencies": { 787 | "chevrotain": "6.5.0", 788 | "lodash": "4.17.20" 789 | } 790 | }, 791 | "node_modules/json-buffer": { 792 | "version": "3.0.0", 793 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 794 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 795 | "dev": true 796 | }, 797 | "node_modules/keyv": { 798 | "version": "3.0.0", 799 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", 800 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", 801 | "dev": true, 802 | "dependencies": { 803 | "json-buffer": "3.0.0" 804 | } 805 | }, 806 | "node_modules/lodash": { 807 | "version": "4.17.20", 808 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 809 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 810 | "dev": true 811 | }, 812 | "node_modules/lowercase-keys": { 813 | "version": "1.0.1", 814 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 815 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 816 | "dev": true, 817 | "engines": { 818 | "node": ">=0.10.0" 819 | } 820 | }, 821 | "node_modules/make-dir": { 822 | "version": "2.1.0", 823 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 824 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 825 | "dev": true, 826 | "dependencies": { 827 | "pify": "^4.0.1", 828 | "semver": "^5.6.0" 829 | }, 830 | "engines": { 831 | "node": ">=6" 832 | } 833 | }, 834 | "node_modules/make-error": { 835 | "version": "1.3.6", 836 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 837 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 838 | "dev": true 839 | }, 840 | "node_modules/mime-db": { 841 | "version": "1.48.0", 842 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 843 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", 844 | "dev": true, 845 | "engines": { 846 | "node": ">= 0.6" 847 | } 848 | }, 849 | "node_modules/mimic-response": { 850 | "version": "1.0.1", 851 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 852 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 853 | "dev": true, 854 | "engines": { 855 | "node": ">=4" 856 | } 857 | }, 858 | "node_modules/normalize-url": { 859 | "version": "2.0.1", 860 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", 861 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", 862 | "dev": true, 863 | "dependencies": { 864 | "prepend-http": "^2.0.0", 865 | "query-string": "^5.0.1", 866 | "sort-keys": "^2.0.0" 867 | }, 868 | "engines": { 869 | "node": ">=4" 870 | } 871 | }, 872 | "node_modules/normalize-url/node_modules/sort-keys": { 873 | "version": "2.0.0", 874 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", 875 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", 876 | "dev": true, 877 | "dependencies": { 878 | "is-plain-obj": "^1.0.0" 879 | }, 880 | "engines": { 881 | "node": ">=4" 882 | } 883 | }, 884 | "node_modules/object-assign": { 885 | "version": "4.1.1", 886 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 887 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 888 | "dev": true, 889 | "engines": { 890 | "node": ">=0.10.0" 891 | } 892 | }, 893 | "node_modules/once": { 894 | "version": "1.4.0", 895 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 896 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 897 | "dev": true, 898 | "dependencies": { 899 | "wrappy": "1" 900 | } 901 | }, 902 | "node_modules/p-cancelable": { 903 | "version": "0.4.1", 904 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", 905 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", 906 | "dev": true, 907 | "engines": { 908 | "node": ">=4" 909 | } 910 | }, 911 | "node_modules/p-event": { 912 | "version": "2.3.1", 913 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", 914 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", 915 | "dev": true, 916 | "dependencies": { 917 | "p-timeout": "^2.0.1" 918 | }, 919 | "engines": { 920 | "node": ">=6" 921 | } 922 | }, 923 | "node_modules/p-finally": { 924 | "version": "1.0.0", 925 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 926 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 927 | "dev": true, 928 | "engines": { 929 | "node": ">=4" 930 | } 931 | }, 932 | "node_modules/p-is-promise": { 933 | "version": "1.1.0", 934 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 935 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", 936 | "dev": true, 937 | "engines": { 938 | "node": ">=4" 939 | } 940 | }, 941 | "node_modules/p-timeout": { 942 | "version": "2.0.1", 943 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", 944 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", 945 | "dev": true, 946 | "dependencies": { 947 | "p-finally": "^1.0.0" 948 | }, 949 | "engines": { 950 | "node": ">=4" 951 | } 952 | }, 953 | "node_modules/pend": { 954 | "version": "1.2.0", 955 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 956 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 957 | "dev": true 958 | }, 959 | "node_modules/pify": { 960 | "version": "4.0.1", 961 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 962 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 963 | "dev": true, 964 | "engines": { 965 | "node": ">=6" 966 | } 967 | }, 968 | "node_modules/pinkie": { 969 | "version": "2.0.4", 970 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 971 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 972 | "dev": true, 973 | "engines": { 974 | "node": ">=0.10.0" 975 | } 976 | }, 977 | "node_modules/pinkie-promise": { 978 | "version": "2.0.1", 979 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 980 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 981 | "dev": true, 982 | "dependencies": { 983 | "pinkie": "^2.0.0" 984 | }, 985 | "engines": { 986 | "node": ">=0.10.0" 987 | } 988 | }, 989 | "node_modules/prepend-http": { 990 | "version": "2.0.0", 991 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 992 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 993 | "dev": true, 994 | "engines": { 995 | "node": ">=4" 996 | } 997 | }, 998 | "node_modules/prettier": { 999 | "version": "2.1.2", 1000 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", 1001 | "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", 1002 | "dev": true, 1003 | "bin": { 1004 | "prettier": "bin-prettier.js" 1005 | }, 1006 | "engines": { 1007 | "node": ">=10.13.0" 1008 | } 1009 | }, 1010 | "node_modules/process-nextick-args": { 1011 | "version": "2.0.1", 1012 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1013 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1014 | "dev": true 1015 | }, 1016 | "node_modules/pump": { 1017 | "version": "3.0.0", 1018 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1019 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1020 | "dev": true, 1021 | "dependencies": { 1022 | "end-of-stream": "^1.1.0", 1023 | "once": "^1.3.1" 1024 | } 1025 | }, 1026 | "node_modules/query-string": { 1027 | "version": "5.1.1", 1028 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 1029 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 1030 | "dev": true, 1031 | "dependencies": { 1032 | "decode-uri-component": "^0.2.0", 1033 | "object-assign": "^4.1.0", 1034 | "strict-uri-encode": "^1.0.0" 1035 | }, 1036 | "engines": { 1037 | "node": ">=0.10.0" 1038 | } 1039 | }, 1040 | "node_modules/readable-stream": { 1041 | "version": "2.3.7", 1042 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1043 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "core-util-is": "~1.0.0", 1047 | "inherits": "~2.0.3", 1048 | "isarray": "~1.0.0", 1049 | "process-nextick-args": "~2.0.0", 1050 | "safe-buffer": "~5.1.1", 1051 | "string_decoder": "~1.1.1", 1052 | "util-deprecate": "~1.0.1" 1053 | } 1054 | }, 1055 | "node_modules/regexp-to-ast": { 1056 | "version": "0.4.0", 1057 | "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", 1058 | "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", 1059 | "dev": true 1060 | }, 1061 | "node_modules/responselike": { 1062 | "version": "1.0.2", 1063 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1064 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1065 | "dev": true, 1066 | "dependencies": { 1067 | "lowercase-keys": "^1.0.0" 1068 | } 1069 | }, 1070 | "node_modules/safe-buffer": { 1071 | "version": "5.1.2", 1072 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1073 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1074 | "dev": true 1075 | }, 1076 | "node_modules/seek-bzip": { 1077 | "version": "1.0.6", 1078 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", 1079 | "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", 1080 | "dev": true, 1081 | "dependencies": { 1082 | "commander": "^2.8.1" 1083 | }, 1084 | "bin": { 1085 | "seek-bunzip": "bin/seek-bunzip", 1086 | "seek-table": "bin/seek-bzip-table" 1087 | } 1088 | }, 1089 | "node_modules/semver": { 1090 | "version": "5.7.1", 1091 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1092 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1093 | "dev": true, 1094 | "bin": { 1095 | "semver": "bin/semver" 1096 | } 1097 | }, 1098 | "node_modules/sort-keys": { 1099 | "version": "1.1.2", 1100 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 1101 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 1102 | "dev": true, 1103 | "dependencies": { 1104 | "is-plain-obj": "^1.0.0" 1105 | }, 1106 | "engines": { 1107 | "node": ">=0.10.0" 1108 | } 1109 | }, 1110 | "node_modules/sort-keys-length": { 1111 | "version": "1.0.1", 1112 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 1113 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 1114 | "dev": true, 1115 | "dependencies": { 1116 | "sort-keys": "^1.0.0" 1117 | }, 1118 | "engines": { 1119 | "node": ">=0.10.0" 1120 | } 1121 | }, 1122 | "node_modules/source-map": { 1123 | "version": "0.6.1", 1124 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1125 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1126 | "dev": true, 1127 | "engines": { 1128 | "node": ">=0.10.0" 1129 | } 1130 | }, 1131 | "node_modules/source-map-support": { 1132 | "version": "0.5.19", 1133 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1134 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1135 | "dev": true, 1136 | "dependencies": { 1137 | "buffer-from": "^1.0.0", 1138 | "source-map": "^0.6.0" 1139 | } 1140 | }, 1141 | "node_modules/strict-uri-encode": { 1142 | "version": "1.1.0", 1143 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 1144 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", 1145 | "dev": true, 1146 | "engines": { 1147 | "node": ">=0.10.0" 1148 | } 1149 | }, 1150 | "node_modules/string_decoder": { 1151 | "version": "1.1.1", 1152 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1153 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1154 | "dev": true, 1155 | "dependencies": { 1156 | "safe-buffer": "~5.1.0" 1157 | } 1158 | }, 1159 | "node_modules/strip-dirs": { 1160 | "version": "2.1.0", 1161 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 1162 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 1163 | "dev": true, 1164 | "dependencies": { 1165 | "is-natural-number": "^4.0.1" 1166 | } 1167 | }, 1168 | "node_modules/strip-outer": { 1169 | "version": "1.0.1", 1170 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 1171 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 1172 | "dev": true, 1173 | "dependencies": { 1174 | "escape-string-regexp": "^1.0.2" 1175 | }, 1176 | "engines": { 1177 | "node": ">=0.10.0" 1178 | } 1179 | }, 1180 | "node_modules/tar-stream": { 1181 | "version": "1.6.2", 1182 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 1183 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 1184 | "dev": true, 1185 | "dependencies": { 1186 | "bl": "^1.0.0", 1187 | "buffer-alloc": "^1.2.0", 1188 | "end-of-stream": "^1.0.0", 1189 | "fs-constants": "^1.0.0", 1190 | "readable-stream": "^2.3.0", 1191 | "to-buffer": "^1.1.1", 1192 | "xtend": "^4.0.0" 1193 | }, 1194 | "engines": { 1195 | "node": ">= 0.8.0" 1196 | } 1197 | }, 1198 | "node_modules/through": { 1199 | "version": "2.3.8", 1200 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1201 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1202 | "dev": true 1203 | }, 1204 | "node_modules/timed-out": { 1205 | "version": "4.0.1", 1206 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 1207 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 1208 | "dev": true, 1209 | "engines": { 1210 | "node": ">=0.10.0" 1211 | } 1212 | }, 1213 | "node_modules/to-buffer": { 1214 | "version": "1.1.1", 1215 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 1216 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", 1217 | "dev": true 1218 | }, 1219 | "node_modules/trim-repeated": { 1220 | "version": "1.0.0", 1221 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 1222 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 1223 | "dev": true, 1224 | "dependencies": { 1225 | "escape-string-regexp": "^1.0.2" 1226 | }, 1227 | "engines": { 1228 | "node": ">=0.10.0" 1229 | } 1230 | }, 1231 | "node_modules/ts-node": { 1232 | "version": "9.0.0", 1233 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", 1234 | "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", 1235 | "dev": true, 1236 | "dependencies": { 1237 | "arg": "^4.1.0", 1238 | "diff": "^4.0.1", 1239 | "make-error": "^1.1.1", 1240 | "source-map-support": "^0.5.17", 1241 | "yn": "3.1.1" 1242 | }, 1243 | "bin": { 1244 | "ts-node": "dist/bin.js", 1245 | "ts-node-script": "dist/bin-script.js", 1246 | "ts-node-transpile-only": "dist/bin-transpile.js", 1247 | "ts-script": "dist/bin-script-deprecated.js" 1248 | }, 1249 | "engines": { 1250 | "node": ">=10.0.0" 1251 | }, 1252 | "peerDependencies": { 1253 | "typescript": ">=2.7" 1254 | } 1255 | }, 1256 | "node_modules/typescript": { 1257 | "version": "4.1.2", 1258 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", 1259 | "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", 1260 | "dev": true, 1261 | "bin": { 1262 | "tsc": "bin/tsc", 1263 | "tsserver": "bin/tsserver" 1264 | }, 1265 | "engines": { 1266 | "node": ">=4.2.0" 1267 | } 1268 | }, 1269 | "node_modules/unbzip2-stream": { 1270 | "version": "1.4.3", 1271 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1272 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1273 | "dev": true, 1274 | "dependencies": { 1275 | "buffer": "^5.2.1", 1276 | "through": "^2.3.8" 1277 | } 1278 | }, 1279 | "node_modules/url-parse-lax": { 1280 | "version": "3.0.0", 1281 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1282 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1283 | "dev": true, 1284 | "dependencies": { 1285 | "prepend-http": "^2.0.0" 1286 | }, 1287 | "engines": { 1288 | "node": ">=4" 1289 | } 1290 | }, 1291 | "node_modules/url-to-options": { 1292 | "version": "1.0.1", 1293 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 1294 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", 1295 | "dev": true, 1296 | "engines": { 1297 | "node": ">= 4" 1298 | } 1299 | }, 1300 | "node_modules/util-deprecate": { 1301 | "version": "1.0.2", 1302 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1303 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1304 | "dev": true 1305 | }, 1306 | "node_modules/wrappy": { 1307 | "version": "1.0.2", 1308 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1309 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1310 | "dev": true 1311 | }, 1312 | "node_modules/xtend": { 1313 | "version": "4.0.2", 1314 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1315 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1316 | "dev": true, 1317 | "engines": { 1318 | "node": ">=0.4" 1319 | } 1320 | }, 1321 | "node_modules/yauzl": { 1322 | "version": "2.10.0", 1323 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1324 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1325 | "dev": true, 1326 | "dependencies": { 1327 | "buffer-crc32": "~0.2.3", 1328 | "fd-slicer": "~1.1.0" 1329 | } 1330 | }, 1331 | "node_modules/yn": { 1332 | "version": "3.1.1", 1333 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1334 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1335 | "dev": true, 1336 | "engines": { 1337 | "node": ">=6" 1338 | } 1339 | } 1340 | } 1341 | } 1342 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typed-bitwig-api", 3 | "version": "19.0.0", 4 | "repository": "joslarson/typed-bitwig-api", 5 | "description": "TypeScript definition file for the Bitwig Studio Control Surface Scripting API.", 6 | "types": "bitwig-api.d.ts", 7 | "scripts": { 8 | "build": "node -r ts-node/register src/main.ts && npm run check", 9 | "check": "tsc --noEmit bitwig-api.d.ts", 10 | "version": "npm run build && git add bitwig-api.d.ts" 11 | }, 12 | "author": "Joseph Larson", 13 | "license": "BSD-3-Clause", 14 | "devDependencies": { 15 | "@types/download": "6.2.4", 16 | "@types/node": "14.14.2", 17 | "@types/prettier": "2.1.5", 18 | "chevrotain": "6.5.0", 19 | "download": "^8.0.0", 20 | "java-parser": "0.8.2", 21 | "prettier": "2.1.2", 22 | "ts-node": "9.0.0", 23 | "typescript": "4.1.2" 24 | }, 25 | "prettier": { 26 | "trailingComma": "es5", 27 | "tabWidth": 2, 28 | "semi": true, 29 | "singleQuote": true 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/additional-types.d.ts.template: -------------------------------------------------------------------------------- 1 | declare namespace java { 2 | namespace nio { 3 | type ByteBuffer = any; 4 | } 5 | namespace util { 6 | type List = Array; 7 | type UUID = string; 8 | 9 | namespace func { 10 | type BooleanSupplier = { 11 | getAsBoolean(): boolean; 12 | }; 13 | type Consumer = { 14 | accept(t: T): void; 15 | andThen(after: Consumer): Consumer; 16 | }; 17 | type Supplier = { 18 | get(): T; 19 | }; 20 | type DoubleConsumer = { 21 | accept(double: number): void; 22 | andThen(after: DoubleConsumer): DoubleConsumer; 23 | }; 24 | type DoubleSupplier = { 25 | getAsDouble(): number; 26 | }; 27 | type IntConsumer = { 28 | accept(int: number): void; 29 | andThen(after: IntConsumer): IntConsumer; 30 | }; 31 | type IntSupplier = { 32 | getAsInt(): number; 33 | }; 34 | interface Function { 35 | andThen(after: Function): Function; 36 | apply(t: T): R; 37 | compose(before: Function): Function; 38 | } 39 | type IntFunction = { 40 | apply(value: number): R; 41 | }; 42 | } 43 | } 44 | } 45 | 46 | import API = com.bitwig.extension.controller.api; 47 | 48 | declare const host: API.ControllerHost; 49 | declare const loadAPI: typeof host.loadAPI; 50 | declare const load: typeof host.load; 51 | declare const println: typeof host.println; 52 | declare const errorln: typeof host.errorln; 53 | declare function dump(obj: any): void; 54 | -------------------------------------------------------------------------------- /src/build.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | 4 | import tspkg from 'typescript/package.json'; 5 | import { parse } from 'java-parser'; 6 | import prettier from 'prettier'; 7 | 8 | import pkg from '../package.json'; 9 | import { visit } from './visit'; 10 | import { renderTypeDeclarations } from './renderers/renderTypeDeclarations'; 11 | import { renderImportDeclarations } from './renderers/renderImportDeclarations'; 12 | import { applyMods } from './mods'; 13 | import { renderEnumDeclarations } from './renderers/renderEnumDeclarations'; 14 | 15 | const STD_OUT = Symbol('STD_OUT'); 16 | 17 | function convert(src: string, dest?: typeof STD_OUT | string) { 18 | const sourceCode = fs.readFileSync(src).toString(); 19 | const rootNode = parse(sourceCode); 20 | const ordinaryCompilationUnits = visit(rootNode, 'ordinaryCompilationUnit'); 21 | const { packageDeclaration, importDeclaration, typeDeclaration } = 22 | ordinaryCompilationUnits?.[0] || {}; 23 | 24 | const namespace = packageDeclaration?.[0].children.Identifier?.map( 25 | (id) => id.image 26 | ).join('.'); 27 | 28 | const children = [ 29 | renderImportDeclarations(importDeclaration), 30 | renderEnumDeclarations(rootNode), 31 | renderTypeDeclarations(typeDeclaration), 32 | ] 33 | .filter((c) => c) 34 | .join('\n'); 35 | 36 | let result = namespace 37 | ? `declare namespace ${namespace} {\n${children}}\n` 38 | : children; 39 | 40 | result = prettier.format(result, { 41 | parser: 'typescript', 42 | singleQuote: true, 43 | }); 44 | 45 | if (dest) { 46 | if (dest === STD_OUT) { 47 | console.log(result); 48 | } else { 49 | fs.writeFileSync(dest, result); 50 | } 51 | } 52 | 53 | return result; 54 | } 55 | 56 | function convertAll(src: string, dest: string) { 57 | const files = fs.readdirSync(src); 58 | files.forEach(function (file) { 59 | const newSrc = path.join(src, file); 60 | const newDest = path.join(dest, file); 61 | if (fs.statSync(newSrc).isDirectory()) { 62 | convertAll(newSrc, newDest); 63 | } else { 64 | if (file.endsWith('.java')) { 65 | if (file.endsWith('Exception.java')) { 66 | return; 67 | } 68 | if (!fs.existsSync(dest)) { 69 | fs.mkdirSync(dest, { recursive: true }); 70 | } 71 | const from = newSrc; 72 | const to = newDest.replace('.java', '.d.ts'); 73 | console.log( 74 | '◍ ./' + 75 | path.relative(path.join(__dirname, '..'), from) + 76 | '\n' + 77 | '┗━━━━► ./' + 78 | path.relative(path.join(__dirname, '..'), to) 79 | ); 80 | convert(newSrc, newDest.replace('.java', '.d.ts')); 81 | console.log(''); 82 | } 83 | } 84 | }); 85 | } 86 | 87 | type Declaration = { 88 | filename: string; 89 | filePath: string; 90 | namespace: string; 91 | declaration: string; 92 | }; 93 | 94 | function getDeclarations(src: string): Declaration[] { 95 | const declarations: Declaration[] = []; 96 | 97 | for (const nodeName of fs.readdirSync(src)) { 98 | const nodePath = path.join(src, nodeName); 99 | if (fs.statSync(nodePath).isDirectory()) { 100 | declarations.push(...getDeclarations(nodePath)); 101 | } else if (nodeName.endsWith('.d.ts')) { 102 | const fullDeclaration = fs.readFileSync(nodePath, 'utf-8'); 103 | const namespace = fullDeclaration.match(/namespace (.+) {/m)?.[1]; 104 | const declarationSansNamespace = fullDeclaration 105 | .trim() 106 | .split('\n') 107 | .slice(1, -1) 108 | .join('\n'); 109 | if (!namespace) throw new Error('Unable to find namespace'); 110 | declarations.push({ 111 | filename: nodeName, 112 | filePath: nodePath.split(path.join(__dirname, '..', 'types') + '/')[1], 113 | namespace, 114 | declaration: declarationSansNamespace, 115 | }); 116 | } 117 | } 118 | 119 | return declarations; 120 | } 121 | 122 | function bundleDeclarations(srcDir: string, outFile: string) { 123 | const declarations = getDeclarations(srcDir).reduce<{ 124 | [namespace: string]: Declaration[]; 125 | }>((acc, dec) => { 126 | if (!acc[dec.namespace]) acc[dec.namespace] = []; 127 | acc[dec.namespace].push(dec); 128 | return acc; 129 | }, {}); 130 | 131 | const namespaces = Object.keys(declarations).sort(); 132 | let result = `\ 133 | // Type definitions for Bitwig Studio Control Surface Scripting API v${ 134 | pkg.version.split('.')[0] 135 | } 136 | // Project: https://bitwig.com 137 | // Definitions by: Joseph Larson 138 | // TypeScript Version: ${tspkg.version}\n\n`; 139 | 140 | result += namespaces 141 | .map((ns) => { 142 | const nsDeclarations = declarations[ns] 143 | .sort((a, b) => a.filename.localeCompare(b.filename)) 144 | .map((dec) => { 145 | const comment = `// source: ${dec.filePath.replace( 146 | '.d.ts', 147 | '.java' 148 | )}`; 149 | return `${comment}\n\n${dec.declaration}\n`; 150 | }) 151 | .join('\n\n'); 152 | 153 | // remove duplicate imports 154 | const imports = new Set(); 155 | const dedupedImports = nsDeclarations 156 | .split('\n') 157 | .filter((l) => { 158 | const trimmedL = l.trim(); 159 | const importMatches = /^import \S+ = (\S+);/.exec(trimmedL); 160 | 161 | // skip non import lines 162 | if (!importMatches) return true; 163 | 164 | // Remove imports from the current namespace as they are not needed and conflict with the definition when bundling 165 | // Example: pulls 'com.bitwig.extension.api.graphics' out of 166 | // 'import GraphicsOutput = com.bitwig.extension.api.graphics.GraphicsOutput' 167 | const importNs = importMatches[1].split('.').slice(0, -1).join('.'); 168 | if (importNs === ns) return false; 169 | 170 | // Remove duplicate imports within a namespace 171 | if (imports.has(trimmedL)) { 172 | return false; 173 | } else { 174 | imports.add(trimmedL); 175 | return true; 176 | } 177 | }) 178 | .join('\n'); 179 | 180 | return `declare namespace ${ns} {\n${dedupedImports}\n}\n`; 181 | }) 182 | .join('\n'); 183 | result = 184 | result + 185 | '\n' + 186 | fs.readFileSync( 187 | path.join(__dirname, '..', 'src', 'additional-types.d.ts.template'), 188 | 'utf-8' 189 | ); 190 | try { 191 | result = prettier.format(result, { 192 | parser: 'typescript', 193 | singleQuote: true, 194 | }); 195 | } catch (e) { 196 | console.error('Failed to prettify:', e); 197 | } 198 | fs.writeFileSync(outFile, result); 199 | } 200 | 201 | const SRC_DIR = path.join(__dirname, '..', 'java_source'); 202 | const DEST_DIR = path.join(__dirname, '..', 'types'); 203 | 204 | export async function build() { 205 | convertAll(SRC_DIR, DEST_DIR); 206 | applyMods(); 207 | bundleDeclarations(DEST_DIR, path.join(__dirname, '..', 'bitwig-api.d.ts')); 208 | fs.rmSync(DEST_DIR, { recursive: true }); 209 | 210 | console.log('Bundled into bitwig-api.d.ts'); 211 | } 212 | 213 | if (require.main === module) build(); 214 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import download from 'download'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | const spawn = require('child_process').spawnSync; 5 | 6 | import pkg from '../package.json'; 7 | import { build } from './build'; 8 | 9 | const API_VERSION = parseInt(pkg.version.split('.')[0]); 10 | 11 | function downloadApiSource(version: number) { 12 | return download( 13 | `https://maven.bitwig.com/com/bitwig/extension-api/${version}/extension-api-${version}-sources.jar`, 14 | 'java_source', 15 | { extract: true } 16 | ); 17 | } 18 | 19 | async function main(fullBuild = true) { 20 | if (fullBuild) { 21 | console.log('full build...'); 22 | 23 | fs.rmSync('java_source', { recursive: true, force: true }); 24 | 25 | try { 26 | await downloadApiSource(API_VERSION); 27 | fs.rmSync('java_source/com/bitwig/flt', { recursive: true, force: true }); 28 | } catch (e) { 29 | console.error(`Error: Unable to fetch API v${API_VERSION} source files.`); 30 | return; 31 | } 32 | } else { 33 | console.log('minimal build...'); 34 | } 35 | 36 | await build(); 37 | 38 | console.log('done.'); 39 | } 40 | 41 | main(process.argv.slice(2).indexOf('-t') === -1); 42 | -------------------------------------------------------------------------------- /src/mods.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | 4 | type Mod = { 5 | file: string; 6 | search: string | RegExp; 7 | replace: string; 8 | }; 9 | 10 | const mods: Mod[] = [ 11 | // ignore invalid method interface method extensions 12 | ...['SoloValue', 'RangedValue', 'IntegerValue', 'StringArrayValue'].map( 13 | (interfaceName) => ({ 14 | file: `com/bitwig/extension/controller/api/${interfaceName}.d.ts`, 15 | search: new RegExp(`^([ ]*)(interface ${interfaceName})`, 'm'), 16 | replace: '$1// @ts-ignore\n$1$2', 17 | }) 18 | ), 19 | { 20 | file: 'com/bitwig/extension/controller/api/ControllerHost.d.ts', 21 | search: 22 | 'scheduleTask(callback: () => void, args: object, delay: number): void;', 23 | replace: 24 | 'scheduleTask(callback: (...args: T) => void, args: T, delay: number): void;', 25 | }, 26 | { 27 | file: 'com/bitwig/extension/controller/api/NoteInput.d.ts', 28 | search: /table: object\[\]/gm, 29 | replace: 'table: number[]', 30 | }, 31 | { 32 | file: 'com/bitwig/extension/controller/api/Application.d.ts', 33 | search: /PANEL_LAYOUT_(.+): string;/gm, 34 | replace: "PANEL_$1_ARRANGE: '$1';", 35 | }, 36 | { 37 | file: 'com/bitwig/extension/controller/api/Application.d.ts', 38 | search: /static (\/\*\*)/gm, 39 | replace: '$1', 40 | }, 41 | ]; 42 | 43 | export const applyMods = () => { 44 | mods.forEach(({ file: relPath, search, replace }) => { 45 | const absPath = path.join(__dirname, '..', 'types', relPath); 46 | const file = fs.readFileSync(absPath, 'utf-8'); 47 | const result = file.replace(search, replace); 48 | fs.writeFileSync(absPath, result); 49 | }); 50 | }; 51 | -------------------------------------------------------------------------------- /src/renderers/renderEnumDeclarations.ts: -------------------------------------------------------------------------------- 1 | import { AnyCstNode } from '../types'; 2 | import { visit } from '../visit'; 3 | 4 | export function renderEnumDeclarations(node: AnyCstNode) { 5 | const enumDecs = visit(node, 'enumDeclaration'); 6 | 7 | const enums = enumDecs 8 | .map((ed) => { 9 | const name = ed.typeIdentifier?.[0].children.Identifier?.[0].image; 10 | const body = ed.enumBody?.[0].children.enumConstantList?.[0].children.enumConstant 11 | ?.map((c, i) => `${c.children.Identifier?.[0].image} = ${i},`) 12 | .join('\n'); 13 | return `enum ${name} {\n${body}\n}\n`; 14 | }) 15 | .join('\n'); 16 | 17 | return enums; 18 | } 19 | -------------------------------------------------------------------------------- /src/renderers/renderImportDeclarations.ts: -------------------------------------------------------------------------------- 1 | import { CstNode } from 'chevrotain'; 2 | import { ImportDeclarationCstNode } from 'java-parser'; 3 | import { visit } from '../visit'; 4 | import { ignoredImports } from './util'; 5 | 6 | export function renderImportDeclarations(nodes?: ImportDeclarationCstNode[]) { 7 | if (!nodes) return ''; 8 | 9 | const imports = nodes.map((node) => 10 | visit(node as CstNode, 'packageOrTypeName')[0].Identifier.map( 11 | (id) => id.image 12 | ) 13 | ); 14 | return imports 15 | .map((parts) => { 16 | const importPathString = parts.join('.').replace('.function.', '.func.'); 17 | if (ignoredImports.includes(importPathString)) { 18 | return ''; 19 | } 20 | return `import ${parts.slice(-1)[0]} = ${importPathString};\n`; 21 | }) 22 | .join(''); 23 | } 24 | -------------------------------------------------------------------------------- /src/renderers/renderTypeDeclarations/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ConstructorDeclarationCstNode, 3 | InterfaceMethodDeclarationCstNode, 4 | MethodDeclarationCstNode, 5 | ResultCtx, 6 | TypeDeclarationCstNode, 7 | } from 'java-parser'; 8 | import { AnyCstNode } from '../../types'; 9 | import { visit } from '../../visit'; 10 | import { getTypeArgs, typeOverrides } from '../util'; 11 | import { renderUnannType } from './renderUnannType'; 12 | 13 | const getTypeKind = ( 14 | node: TypeDeclarationCstNode 15 | ): 'interface' | 'class' | 'enum' => { 16 | if (node.children.interfaceDeclaration) { 17 | return 'interface'; 18 | } else if ( 19 | node.children.classDeclaration?.[0].children.normalClassDeclaration 20 | ) { 21 | return 'class'; 22 | } else if (node.children.classDeclaration?.[0].children.enumDeclaration) { 23 | return 'enum'; 24 | } else { 25 | throw new Error('Unhandled type kind'); 26 | } 27 | }; 28 | 29 | const getTypeDocstring = (node: TypeDeclarationCstNode) => { 30 | return node.leadingComments?.[0]?.image as string | undefined; 31 | }; 32 | 33 | const getTypeParams = (node: AnyCstNode): string => { 34 | const typeParams = visit(node, 'typeParameter'); 35 | const params = typeParams 36 | .map((tp) => { 37 | const paramName = tp.typeIdentifier?.[0].children.Identifier?.[0].image; 38 | const extendsName = 39 | tp.typeBound?.[0].children.classOrInterfaceType?.[0].children 40 | .classType?.[0].children.Identifier?.[0].image; 41 | const extendsArgs = extendsName 42 | ? getTypeArgs( 43 | tp.typeBound?.[0].children.classOrInterfaceType?.[0].children 44 | .classType?.[0]! 45 | ) 46 | : ''; 47 | 48 | return `${paramName}${ 49 | extendsName 50 | ? ` extends ${extendsName}${extendsArgs} = ${extendsName}${extendsArgs}` 51 | : '' 52 | }`; 53 | }) 54 | .join(', '); 55 | 56 | return params ? `<${params}>` : ''; 57 | }; 58 | 59 | const getTypeName = (node: TypeDeclarationCstNode) => { 60 | const typeName = ( 61 | visit(node, 'normalInterfaceDeclaration')?.[0] || 62 | visit(node, 'normalClassDeclaration')?.[0] || 63 | visit(node, 'enumDeclaration')?.[0] 64 | )?.typeIdentifier?.[0].children.Identifier?.[0].image; 65 | 66 | const typeParams = getTypeParams(node); 67 | 68 | if (!typeName) { 69 | throw new Error('Failed to get type name'); 70 | } 71 | 72 | return `${typeName}${typeParams}`; 73 | }; 74 | 75 | const getTypeParents = (node: TypeDeclarationCstNode): string[] => { 76 | const interfaceParents = node.children.interfaceDeclaration?.[0].children?.normalInterfaceDeclaration?.[0].children.extendsInterfaces?.[0].children.interfaceTypeList?.[0].children.interfaceType?.map( 77 | (extInt) => { 78 | const name = extInt.children.classType[0].children.Identifier[0].image; 79 | const typeArgs = getTypeArgs(extInt); 80 | 81 | return `${name}${typeArgs}`; 82 | } 83 | ); 84 | const classParent = 85 | node.children?.classDeclaration?.[0]?.children.normalClassDeclaration?.[0] 86 | .children?.superclass?.[0].children.classType?.[0].children 87 | .Identifier?.[0].image; 88 | const classParentArgs = getTypeArgs( 89 | node.children?.classDeclaration?.[0]?.children.normalClassDeclaration?.[0] 90 | .children?.superclass?.[0].children.classType?.[0] 91 | ); 92 | if (interfaceParents?.[0] === 'ObjectProxy') { 93 | console.log('test'); 94 | } 95 | return interfaceParents 96 | ? interfaceParents 97 | : classParent 98 | ? [`${classParent}${classParentArgs}`] 99 | : []; 100 | }; 101 | 102 | const getResultType = (node: ResultCtx) => { 103 | if (node.Void) { 104 | return 'void'; 105 | } else if (node.unannType?.[0]) { 106 | return renderUnannType(node.unannType?.[0]); 107 | } else { 108 | throw new Error('Unhandled result type'); 109 | } 110 | }; 111 | 112 | const renderMethodDeclaration = ( 113 | node?: InterfaceMethodDeclarationCstNode | MethodDeclarationCstNode, 114 | isCallback?: boolean 115 | ) => { 116 | if (!node) return ''; 117 | const isStatic = 118 | 'methodModifier' in node.children && 119 | !!node.children.methodModifier?.find((n) => n.children.Static); 120 | const name = 121 | node.children.methodHeader?.[0].children.methodDeclarator?.[0].children 122 | .Identifier?.[0].image; 123 | const result = getResultType( 124 | node.children.methodHeader?.[0].children.result?.[0].children 125 | ); 126 | const args = visit(node, 'formalParameter') 127 | .map((ctx) => { 128 | const isArityType = !!ctx.variableArityParameter; 129 | let name = 130 | ctx.variableParaRegularParameter?.[0].children.variableDeclaratorId?.[0] 131 | .children.Identifier?.[0].image || 132 | ctx.variableArityParameter?.[0].children.Identifier?.[0].image; 133 | if (name === 'function') name = 'func'; 134 | const type = renderUnannType( 135 | ctx.variableParaRegularParameter?.[0].children.unannType?.[0] || 136 | ctx.variableArityParameter?.[0]?.children?.unannType?.[0]! 137 | ); 138 | return `${isArityType ? '...' : ''}${name}: ${type}${ 139 | isArityType ? '[]' : '' 140 | }`; 141 | }) 142 | .join(', '); 143 | 144 | return `${isStatic ? 'static ' : ''}${ 145 | isCallback ? '' : name 146 | }(${args}): ${result}\n`; 147 | }; 148 | 149 | const renderConstructorDeclaration = (node?: ConstructorDeclarationCstNode) => { 150 | if (!node) return ''; 151 | const args = visit(node, 'variableParaRegularParameter') 152 | .map((ctx) => { 153 | const name = ctx.variableDeclaratorId?.[0].children.Identifier?.[0].image; 154 | const type = renderUnannType(ctx.unannType?.[0]); 155 | return `${name}: ${type}`; 156 | }) 157 | .join(', '); 158 | 159 | return `constructor(${args})\n`; 160 | }; 161 | 162 | const renderTypeBody = (node: TypeDeclarationCstNode, isCallback?: boolean) => { 163 | const interfaceBody = visit(node, 'interfaceBody')?.[0] 164 | ?.interfaceMemberDeclaration; 165 | const classBody = visit(node, 'classBody')?.[0]?.classBodyDeclaration; 166 | 167 | const members: string[] = []; 168 | if (interfaceBody) { 169 | interfaceBody.forEach((member) => { 170 | if (member.children.interfaceMethodDeclaration?.[0]) { 171 | // handle methods 172 | // @ts-ignore 173 | const docstring = member?.leadingComments?.[0].image; 174 | const method = renderMethodDeclaration( 175 | member.children.interfaceMethodDeclaration[0], 176 | isCallback 177 | ); 178 | 179 | members.push([docstring, method].filter((m) => m).join('\n')); 180 | } else if (member.children.constantDeclaration?.[0]) { 181 | const docstring = member?.leadingComments?.[0].image; 182 | const name = visit(member, 'variableDeclaratorId')?.[0].Identifier?.[0] 183 | .image; 184 | const type = renderUnannType( 185 | visit(member, 'constantDeclaration')?.[0].unannType?.[0] 186 | ); 187 | const isStatic = !!visit( 188 | member, 189 | 'constantDeclaration' 190 | )?.[0].constantModifier?.find((n) => n.children.Static); 191 | members.push( 192 | `${isStatic ? 'static ' : ''}${ 193 | docstring ? `${docstring}\n` : '' 194 | }${name}: ${type};\n` 195 | ); 196 | } else if (member.children.classDeclaration) { 197 | if ( 198 | member.children.classDeclaration?.[0].children.normalClassDeclaration 199 | ) { 200 | console.warn('Warning: Skipped inner class declaration.'); 201 | } 202 | } else if (member.children.interfaceDeclaration) { 203 | console.warn('Warning: Skipped inner interface declaration.'); 204 | } else if ( 205 | Object.keys(member.children).length === 1 && 206 | member.children.Semicolon 207 | ) { 208 | return ''; 209 | } else { 210 | console.log(node); 211 | throw new Error('Unhandled interface member type'); 212 | } 213 | }); 214 | } else if (classBody) { 215 | classBody.map((member) => { 216 | if ( 217 | member.children.classMemberDeclaration?.[0].children 218 | .methodDeclaration?.[0] 219 | ) { 220 | // handle methods 221 | // @ts-ignore 222 | const docstring = member?.leadingComments?.[0].image; 223 | const method = renderMethodDeclaration( 224 | member.children.classMemberDeclaration[0].children 225 | .methodDeclaration[0], 226 | isCallback 227 | ); 228 | 229 | members.push([docstring, method].filter((m) => m).join('\n')); 230 | } else if (member.children.constructorDeclaration?.[0]) { 231 | const docstring = member?.leadingComments?.[0].image; 232 | const constructor = renderConstructorDeclaration( 233 | member.children.constructorDeclaration?.[0] 234 | ); 235 | members.push([docstring, constructor].filter((m) => m).join('\n')); 236 | } else if ( 237 | member.children.classMemberDeclaration?.[0].children.fieldDeclaration 238 | ) { 239 | const docstring = member?.leadingComments?.[0].image; 240 | const name = visit(member, 'variableDeclaratorId')?.[0].Identifier?.[0] 241 | .image; 242 | const isStatic = !!visit( 243 | member, 244 | 'fieldDeclaration' 245 | )?.[0].fieldModifier?.find((n) => n.children.Static); 246 | 247 | const type = renderUnannType( 248 | visit(member, 'fieldDeclaration')?.[0].unannType?.[0] 249 | ); 250 | members.push( 251 | `${isStatic ? 'static ' : ''}${ 252 | docstring ? `${docstring}\n` : '' 253 | }${name}: ${type};\n` 254 | ); 255 | } else { 256 | throw new Error('Unhandled class member type'); 257 | } 258 | }); 259 | } 260 | 261 | return members.join('\n'); 262 | }; 263 | 264 | const renderTypeDeclaration = (node: TypeDeclarationCstNode) => { 265 | if ( 266 | node.children.interfaceDeclaration?.[0].children.annotationTypeDeclaration 267 | ) { 268 | console.warn('Warning: Skipping annotation type.'); 269 | return ''; 270 | } 271 | const type = { 272 | kind: getTypeKind(node), 273 | docstring: getTypeDocstring(node), 274 | name: getTypeName(node), 275 | parents: getTypeParents(node), 276 | }; 277 | 278 | // handle enums separately 279 | if (type.kind === 'enum') return ''; 280 | 281 | const isCallback = 282 | type.name.endsWith('Callback') || type.name.includes('Callback<'); 283 | 284 | return `${type.docstring ? `${type.docstring}\n` : ''}${type.kind} ${ 285 | type.name 286 | }${ 287 | type.parents.length ? ` extends ${type.parents.join(',')}` : '' 288 | } {\n${renderTypeBody(node, isCallback)}}\n`; 289 | }; 290 | 291 | export function renderTypeDeclarations(nodes?: TypeDeclarationCstNode[]) { 292 | if (!nodes) return ''; 293 | 294 | const types = nodes.map(renderTypeDeclaration); 295 | 296 | return types.join('\n'); 297 | } 298 | -------------------------------------------------------------------------------- /src/renderers/renderTypeDeclarations/renderUnannType.ts: -------------------------------------------------------------------------------- 1 | import { UnannTypeCstNode } from 'java-parser'; 2 | import { visit } from '../../visit'; 3 | import { getTypeArgs, typeOverrides } from '../util'; 4 | 5 | export const renderUnannType = (node: UnannTypeCstNode) => { 6 | if (node.children.unannPrimitiveType?.[0]) { 7 | return node.children.unannPrimitiveType[0].children.Boolean?.[0] 8 | ? 'boolean' 9 | : 'number'; 10 | } else if (node.children.unannReferenceType?.[0]) { 11 | const name = visit(node, 'unannClassType')?.[0].Identifier?.[0].image; 12 | const typeArgs = getTypeArgs(node); 13 | const isArrayOfType = node.children.unannReferenceType?.[0].children.dims; 14 | 15 | if (!name) throw new Error('unann type name not found'); 16 | 17 | return `${typeOverrides[name] || `${name}${typeArgs}`}${ 18 | isArrayOfType ? '[]' : '' 19 | }`; 20 | } else { 21 | throw new Error('Unhandled unann type'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/renderers/util.ts: -------------------------------------------------------------------------------- 1 | import { AnyCstNode } from '../types'; 2 | import { visit } from '../visit'; 3 | 4 | export const typeOverrides: { [javaType: string]: string } = { 5 | String: 'string', 6 | Byte: 'number', 7 | Short: 'number', 8 | Integer: 'number', 9 | Long: 'number', 10 | Float: 'number', 11 | Double: 'number', 12 | Boolean: 'boolean', 13 | BigDecimal: 'number', 14 | BigInteger: 'number', 15 | Number: 'number', 16 | Void: 'void', 17 | Object: 'object', 18 | Runnable: '() => void', 19 | JSObject: '() => void', 20 | Future: 'unknown', 21 | StringBuilder: 'object', 22 | }; 23 | 24 | export const ignoredImports = [ 25 | 'java.util.Objects', 26 | 'java.util.Collections', 27 | 'java.util.ArrayList', 28 | 'java.util.concurrent.Callable', 29 | 'com.bitwig.extension.api.opensoundcontrol.OscNode', 30 | 'com.bitwig.extension.api.opensoundcontrol.OscMethod', 31 | 'java.util.concurrent.Future', 32 | 'java.io.IOException', 33 | 'java.lang.annotation.Retention', 34 | 'java.lang.annotation.RetentionPolicy', 35 | 'java.nio.charset.StandardCharsets', 36 | 'java.util.Arrays', 37 | 'jdk.nashorn.api.scripting.JSObject', 38 | ]; 39 | 40 | export const getTypeArgs = (node?: AnyCstNode): string => { 41 | if (!node) return ''; 42 | const typeArguments = visit(node, 'typeArgument', 'referenceType'); 43 | const args = typeArguments 44 | .map((ta) => { 45 | // @ts-ignore 46 | const isArrayOfType = ta.dims; 47 | const classType = ta.classOrInterfaceType?.[0].children.classType?.[0]; 48 | const name = classType?.children.Identifier?.[0].image!; 49 | 50 | if (typeOverrides[name]) 51 | return `${typeOverrides[name]}${isArrayOfType ? '[]' : ''}`; 52 | 53 | const args = classType?.children.typeArguments 54 | ? getTypeArgs(classType?.children.typeArguments?.[0]) 55 | : ''; 56 | 57 | return `${name}${args}${isArrayOfType ? '[]' : ''}`; 58 | }) 59 | .join(', '); 60 | 61 | return args ? `<${args}>` : ''; 62 | }; 63 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { CstNodeLocation } from 'chevrotain'; 2 | 3 | export type AnyCstNode = { 4 | name: string; 5 | children: any; 6 | location?: CstNodeLocation; 7 | fullName?: string; 8 | }; 9 | 10 | declare module 'chevrotain/lib/chevrotain' { 11 | interface CstNode { 12 | leadingComments?: IToken[]; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/visit.ts: -------------------------------------------------------------------------------- 1 | import { 2 | JavaCstVisitorWithDefaults, 3 | BaseJavaCstVisitorWithDefaults, 4 | } from 'java-parser'; 5 | 6 | import { AnyCstNode } from './types'; 7 | 8 | type Last< 9 | T extends (keyof JavaCstVisitorWithDefaults)[] 10 | > = T extends [...infer I, infer L] ? L : never; 11 | 12 | type VisitorKey = Exclude< 13 | keyof JavaCstVisitorWithDefaults, 14 | 'visit' | 'validateVisitor' 15 | >; 16 | 17 | type CtxFromKey = Parameters< 18 | JavaCstVisitorWithDefaults[K] 19 | >[0]; 20 | 21 | const isCstNode = (value: any): value is AnyCstNode => 22 | typeof value === 'object' && 'name' in value && 'children' in value; 23 | 24 | export const visit = ( 25 | node: AnyCstNode, 26 | ...path: T 27 | ): CtxFromKey>[] => { 28 | const result: CtxFromKey[] = []; 29 | 30 | class Collector extends BaseJavaCstVisitorWithDefaults { 31 | [path[0]](ctx: CtxFromKey) { 32 | result.push(ctx); 33 | } 34 | } 35 | 36 | const collector = new Collector(); 37 | 38 | collector.visit(node); 39 | 40 | if (path.length === 1) { 41 | return result; 42 | } 43 | 44 | const cstList: AnyCstNode[] = []; 45 | for (const ctx of result) { 46 | for (const maybeCstList of Object.values(ctx)) { 47 | if (Array.isArray(maybeCstList)) { 48 | cstList.push( 49 | ...maybeCstList.filter((maybeCst: any) => isCstNode(maybeCst)) 50 | ); 51 | } 52 | } 53 | } 54 | 55 | // @ts-ignore 56 | return [].concat(...cstList.map((cst) => visit(cst, ...path.slice(1)))); 57 | }; 58 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "resolveJsonModule": true, 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true 10 | } 11 | } 12 | --------------------------------------------------------------------------------