├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── index.ts └── plugin.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.ipr 2 | *.iws 3 | *.iml 4 | dist/* 5 | # Built using tsc 6 | plugin.js 7 | 8 | # Logs 9 | logs 10 | *.log 11 | npm-debug.log* 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 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 | # Optional npm cache directory 41 | .npm 42 | 43 | # Optional REPL history 44 | .node_repl_history 45 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ipr 2 | *.iws 3 | *.iml 4 | node_modules 5 | typings 6 | typings.json 7 | tsconfig.json 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Chris Thielen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## typedoc-plugin-external-module-map 2 | 3 | ### What 4 | 5 | A plugin for [Typedoc](http://typedoc.org) 6 | 7 | When trying to unify documentation for multiple modules residing inside a shared source repository, the default way Typedoc assignes top-level 8 | module names might not satisfy. 9 | 10 | This plugin allows you to specify a regular expression with a capture group. This is then used to collect related items into one module. 11 | 12 | This plugin is inspired by, and based on, https://github.com/christopherthielen/typedoc-plugin-external-module-name , but does not require you to 13 | add additional annotations to each .ts file in your project. 14 | 15 | 16 | Suppose you have 17 | ``` 18 | module/@mycompany/thing1/index.ts 19 | module/@mycompany/thing1/src/otherfiles.ts 20 | module/@mycompany/thing2/index.ts 21 | module/@mycompany/thing2/src/otherfiles.ts 22 | ``` 23 | 24 | Typedoc will create four "External Modules", named for each .ts file. 25 | 26 | - "@mycompany/thing1/index" 27 | - "@mycompany/thing1/src/otherfiles" 28 | - "@mycompany/thing2/index" 29 | - "@mycompany/thing1/src/otherfiles" 30 | 31 | This plugin allows each file to specify the Typedoc External Module its code should belong to. 32 | If multiple files belong to the same module, they are merged. 33 | 34 | This allows more control over the modules that Typedoc generates. 35 | Instead of the four modules above, we could group them into two: 36 | 37 | - thing1 38 | - thing2 39 | 40 | ### Installing 41 | 42 | Typedoc 0.4 has the ability to discover and load typedoc plugins found in node_modules. 43 | Simply install the plugin and run typedoc. 44 | 45 | However, Typedoc 0.24 did away with that, so now you have to specify it explicitly every time. 46 | 47 | ``` 48 | npm install --save typedoc-plugin-external-module-map 49 | typedoc --plugin typedoc-plugin-external-module-map 50 | ``` 51 | 52 | 53 | ### Usage 54 | 55 | This plugin adds a new input option 56 | ``` 57 | --external-modulemap ".*\/modules\/@mycompany\/([\\w\\-_]+)\/" 58 | ``` 59 | 60 | If you specify it from the command line, be sure to escape the input string so bash doesn't expand it. 61 | 62 | It is probably easier to create a typedoc options file (typedoc.json) and add it there: 63 | 64 | ``` 65 | { 66 | "name": "My Library", 67 | "mode": "modules", 68 | "out": "doc", 69 | "theme": "default", 70 | "ignoreCompilerErrors": "false", 71 | "preserveConstEnums": "true", 72 | "exclude": "*.spec.ts", 73 | "external-modulemap": ".*\/modules\/@mycompany\/([\\w\\-_]+)\/", 74 | "stripInternal": "false" 75 | } 76 | ``` 77 | 78 | If your pattern is not expressable in a single regexp, you can provide an array of regexps in the .json file. First to match will return the value. 79 | 80 | Example: 81 | ``` 82 | { 83 | "name": "My Library", 84 | "mode": "modules", 85 | "out": "doc", 86 | "theme": "default", 87 | "ignoreCompilerErrors": "false", 88 | "preserveConstEnums": "true", 89 | "exclude": "*.spec.ts", 90 | "external-modulemap": [ 91 | ".*/(types/[\\w\\-_]+)/", 92 | ".*/(core/decorators/[\\w\\-_]+)/", 93 | ".*/subfolder/(core/[\\w\\-_]+)/", 94 | ], 95 | "stripInternal": "false" 96 | } 97 | ``` 98 | 99 | 100 | ### Entrypoint Strategy "Packages" 101 | 102 | The new features in Typedoc of `"entryPointStrategy": "packages"`, or using `@group` or `@category` with the appropriate base plugins have mostly superseeded this plugin, but there are still a few cases in which it makes sense. Ie if you have sub-packages, or multiple entry points. 103 | 104 | In these cases, you use the entrypoint strategy for the top level navigation, and then in the individual projects, place a typedoc.json with the external-modulemap configuration specific to the package. 105 | 106 | The configuration will *not* be picked up from the top-level typedoc.json 107 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typedoc-plugin-external-module-map", 3 | "version": "2.2.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "typedoc-plugin-external-module-map", 9 | "version": "2.2.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@types/node": "^20.14.14" 13 | }, 14 | "devDependencies": { 15 | "typedoc": "^0.27.0", 16 | "typescript": "^5.6.0" 17 | }, 18 | "peerDependencies": { 19 | "typedoc": ">=0.27 <2.0" 20 | } 21 | }, 22 | "node_modules/@gerrit0/mini-shiki": { 23 | "version": "1.27.2", 24 | "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", 25 | "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", 26 | "dev": true, 27 | "license": "MIT", 28 | "dependencies": { 29 | "@shikijs/engine-oniguruma": "^1.27.2", 30 | "@shikijs/types": "^1.27.2", 31 | "@shikijs/vscode-textmate": "^10.0.1" 32 | } 33 | }, 34 | "node_modules/@shikijs/engine-oniguruma": { 35 | "version": "1.29.2", 36 | "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", 37 | "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", 38 | "dev": true, 39 | "license": "MIT", 40 | "dependencies": { 41 | "@shikijs/types": "1.29.2", 42 | "@shikijs/vscode-textmate": "^10.0.1" 43 | } 44 | }, 45 | "node_modules/@shikijs/types": { 46 | "version": "1.29.2", 47 | "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", 48 | "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", 49 | "dev": true, 50 | "license": "MIT", 51 | "dependencies": { 52 | "@shikijs/vscode-textmate": "^10.0.1", 53 | "@types/hast": "^3.0.4" 54 | } 55 | }, 56 | "node_modules/@shikijs/vscode-textmate": { 57 | "version": "10.0.2", 58 | "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", 59 | "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", 60 | "dev": true, 61 | "license": "MIT" 62 | }, 63 | "node_modules/@types/hast": { 64 | "version": "3.0.4", 65 | "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 66 | "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 67 | "dev": true, 68 | "license": "MIT", 69 | "dependencies": { 70 | "@types/unist": "*" 71 | } 72 | }, 73 | "node_modules/@types/node": { 74 | "version": "20.14.14", 75 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", 76 | "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", 77 | "dependencies": { 78 | "undici-types": "~5.26.4" 79 | } 80 | }, 81 | "node_modules/@types/unist": { 82 | "version": "3.0.3", 83 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 84 | "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 85 | "dev": true, 86 | "license": "MIT" 87 | }, 88 | "node_modules/argparse": { 89 | "version": "2.0.1", 90 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 91 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 92 | "dev": true 93 | }, 94 | "node_modules/balanced-match": { 95 | "version": "1.0.2", 96 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 97 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 98 | "dev": true 99 | }, 100 | "node_modules/brace-expansion": { 101 | "version": "2.0.1", 102 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 103 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 104 | "dev": true, 105 | "dependencies": { 106 | "balanced-match": "^1.0.0" 107 | } 108 | }, 109 | "node_modules/entities": { 110 | "version": "4.5.0", 111 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 112 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 113 | "dev": true, 114 | "engines": { 115 | "node": ">=0.12" 116 | }, 117 | "funding": { 118 | "url": "https://github.com/fb55/entities?sponsor=1" 119 | } 120 | }, 121 | "node_modules/linkify-it": { 122 | "version": "5.0.0", 123 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", 124 | "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", 125 | "dev": true, 126 | "dependencies": { 127 | "uc.micro": "^2.0.0" 128 | } 129 | }, 130 | "node_modules/lunr": { 131 | "version": "2.3.9", 132 | "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", 133 | "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", 134 | "dev": true, 135 | "license": "MIT" 136 | }, 137 | "node_modules/markdown-it": { 138 | "version": "14.1.0", 139 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", 140 | "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", 141 | "dev": true, 142 | "dependencies": { 143 | "argparse": "^2.0.1", 144 | "entities": "^4.4.0", 145 | "linkify-it": "^5.0.0", 146 | "mdurl": "^2.0.0", 147 | "punycode.js": "^2.3.1", 148 | "uc.micro": "^2.1.0" 149 | }, 150 | "bin": { 151 | "markdown-it": "bin/markdown-it.mjs" 152 | } 153 | }, 154 | "node_modules/mdurl": { 155 | "version": "2.0.0", 156 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", 157 | "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", 158 | "dev": true 159 | }, 160 | "node_modules/minimatch": { 161 | "version": "9.0.5", 162 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 163 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 164 | "dev": true, 165 | "dependencies": { 166 | "brace-expansion": "^2.0.1" 167 | }, 168 | "engines": { 169 | "node": ">=16 || 14 >=14.17" 170 | }, 171 | "funding": { 172 | "url": "https://github.com/sponsors/isaacs" 173 | } 174 | }, 175 | "node_modules/punycode.js": { 176 | "version": "2.3.1", 177 | "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", 178 | "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", 179 | "dev": true, 180 | "engines": { 181 | "node": ">=6" 182 | } 183 | }, 184 | "node_modules/typedoc": { 185 | "version": "0.27.9", 186 | "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", 187 | "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", 188 | "dev": true, 189 | "license": "Apache-2.0", 190 | "dependencies": { 191 | "@gerrit0/mini-shiki": "^1.24.0", 192 | "lunr": "^2.3.9", 193 | "markdown-it": "^14.1.0", 194 | "minimatch": "^9.0.5", 195 | "yaml": "^2.6.1" 196 | }, 197 | "bin": { 198 | "typedoc": "bin/typedoc" 199 | }, 200 | "engines": { 201 | "node": ">= 18" 202 | }, 203 | "peerDependencies": { 204 | "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x" 205 | } 206 | }, 207 | "node_modules/typescript": { 208 | "version": "5.8.2", 209 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 210 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 211 | "dev": true, 212 | "license": "Apache-2.0", 213 | "bin": { 214 | "tsc": "bin/tsc", 215 | "tsserver": "bin/tsserver" 216 | }, 217 | "engines": { 218 | "node": ">=14.17" 219 | } 220 | }, 221 | "node_modules/uc.micro": { 222 | "version": "2.1.0", 223 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", 224 | "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", 225 | "dev": true 226 | }, 227 | "node_modules/undici-types": { 228 | "version": "5.26.5", 229 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 230 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 231 | }, 232 | "node_modules/yaml": { 233 | "version": "2.7.0", 234 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 235 | "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 236 | "dev": true, 237 | "license": "ISC", 238 | "bin": { 239 | "yaml": "bin.mjs" 240 | }, 241 | "engines": { 242 | "node": ">= 14" 243 | } 244 | } 245 | }, 246 | "dependencies": { 247 | "@gerrit0/mini-shiki": { 248 | "version": "1.27.2", 249 | "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", 250 | "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", 251 | "dev": true, 252 | "requires": { 253 | "@shikijs/engine-oniguruma": "^1.27.2", 254 | "@shikijs/types": "^1.27.2", 255 | "@shikijs/vscode-textmate": "^10.0.1" 256 | } 257 | }, 258 | "@shikijs/engine-oniguruma": { 259 | "version": "1.29.2", 260 | "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", 261 | "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", 262 | "dev": true, 263 | "requires": { 264 | "@shikijs/types": "1.29.2", 265 | "@shikijs/vscode-textmate": "^10.0.1" 266 | } 267 | }, 268 | "@shikijs/types": { 269 | "version": "1.29.2", 270 | "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", 271 | "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", 272 | "dev": true, 273 | "requires": { 274 | "@shikijs/vscode-textmate": "^10.0.1", 275 | "@types/hast": "^3.0.4" 276 | } 277 | }, 278 | "@shikijs/vscode-textmate": { 279 | "version": "10.0.2", 280 | "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", 281 | "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", 282 | "dev": true 283 | }, 284 | "@types/hast": { 285 | "version": "3.0.4", 286 | "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 287 | "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 288 | "dev": true, 289 | "requires": { 290 | "@types/unist": "*" 291 | } 292 | }, 293 | "@types/node": { 294 | "version": "20.14.14", 295 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", 296 | "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", 297 | "requires": { 298 | "undici-types": "~5.26.4" 299 | } 300 | }, 301 | "@types/unist": { 302 | "version": "3.0.3", 303 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 304 | "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 305 | "dev": true 306 | }, 307 | "argparse": { 308 | "version": "2.0.1", 309 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 310 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 311 | "dev": true 312 | }, 313 | "balanced-match": { 314 | "version": "1.0.2", 315 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 316 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 317 | "dev": true 318 | }, 319 | "brace-expansion": { 320 | "version": "2.0.1", 321 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 322 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 323 | "dev": true, 324 | "requires": { 325 | "balanced-match": "^1.0.0" 326 | } 327 | }, 328 | "entities": { 329 | "version": "4.5.0", 330 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 331 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 332 | "dev": true 333 | }, 334 | "linkify-it": { 335 | "version": "5.0.0", 336 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", 337 | "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", 338 | "dev": true, 339 | "requires": { 340 | "uc.micro": "^2.0.0" 341 | } 342 | }, 343 | "lunr": { 344 | "version": "2.3.9", 345 | "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", 346 | "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", 347 | "dev": true 348 | }, 349 | "markdown-it": { 350 | "version": "14.1.0", 351 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", 352 | "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", 353 | "dev": true, 354 | "requires": { 355 | "argparse": "^2.0.1", 356 | "entities": "^4.4.0", 357 | "linkify-it": "^5.0.0", 358 | "mdurl": "^2.0.0", 359 | "punycode.js": "^2.3.1", 360 | "uc.micro": "^2.1.0" 361 | } 362 | }, 363 | "mdurl": { 364 | "version": "2.0.0", 365 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", 366 | "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", 367 | "dev": true 368 | }, 369 | "minimatch": { 370 | "version": "9.0.5", 371 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 372 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 373 | "dev": true, 374 | "requires": { 375 | "brace-expansion": "^2.0.1" 376 | } 377 | }, 378 | "punycode.js": { 379 | "version": "2.3.1", 380 | "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", 381 | "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", 382 | "dev": true 383 | }, 384 | "typedoc": { 385 | "version": "0.27.9", 386 | "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", 387 | "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", 388 | "dev": true, 389 | "requires": { 390 | "@gerrit0/mini-shiki": "^1.24.0", 391 | "lunr": "^2.3.9", 392 | "markdown-it": "^14.1.0", 393 | "minimatch": "^9.0.5", 394 | "yaml": "^2.6.1" 395 | } 396 | }, 397 | "typescript": { 398 | "version": "5.8.2", 399 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 400 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 401 | "dev": true 402 | }, 403 | "uc.micro": { 404 | "version": "2.1.0", 405 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", 406 | "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", 407 | "dev": true 408 | }, 409 | "undici-types": { 410 | "version": "5.26.5", 411 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 412 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 413 | }, 414 | "yaml": { 415 | "version": "2.7.0", 416 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 417 | "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 418 | "dev": true 419 | } 420 | } 421 | } 422 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typedoc-plugin-external-module-map", 3 | "version": "2.2.0", 4 | "description": "Specify the Typedoc Module of a file using a regular expression on the filename", 5 | "type": "module", 6 | "main": "./dist/index.js", 7 | "exports": "./dist/index.js", 8 | "types": "./dist/index.d.ts", 9 | "files": [ 10 | "dist/" 11 | ], 12 | 13 | "scripts": { 14 | "build": "tsc", 15 | "prepublish": "npm run build" 16 | }, 17 | "keywords": [ 18 | "typedocplugin", 19 | "typedoc" 20 | ], 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/asgerjensen/typedoc-plugin-external-module-map" 24 | }, 25 | "author": "Asger Jensen ", 26 | "license": "MIT", 27 | "peerDependencies": { 28 | "typedoc": ">=0.27 <2.0" 29 | }, 30 | "devDependencies": { 31 | "typedoc": "^0.27.0", 32 | "typescript": "^5.6.0" 33 | }, 34 | "dependencies": { 35 | "@types/node": "^20.14.14" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Application, ParameterType, PageEvent, RendererEvent } from 'typedoc'; 2 | import { ExternalModuleMapPlugin } from './plugin.js' 3 | 4 | const TYPEDOC_VERSION = Application.VERSION; 5 | 6 | export const pluginOptions = (app: Application) => ({ 7 | options: () => { 8 | return { 9 | externalModuleMap: app.options.getValue('external-modulemap') as string| string[] 10 | } 11 | }, 12 | }); 13 | 14 | 15 | export function load(app: Application) { 16 | 17 | app.options.addDeclaration({ 18 | name: 'external-modulemap', 19 | help: 'Inline rewrite map', 20 | type: ParameterType.Mixed, 21 | }); 22 | 23 | (new ExternalModuleMapPlugin()).initialize(app); 24 | } -------------------------------------------------------------------------------- /src/plugin.ts: -------------------------------------------------------------------------------- 1 | import { Application, ContainerReflection, Context, Converter, Reflection, ReflectionKind } from "typedoc"; 2 | 3 | /** 4 | * This plugin allows you to provide a mapping regexp between your source folder structure, and the module that should be 5 | * reported in typedoc. It will match the first capture group of your regex and use that as the module name. 6 | * 7 | * Based on https://github.com/christopherthielen/typedoc-plugin-external-module-name 8 | * 9 | * 10 | */ 11 | export class ExternalModuleMapPlugin { 12 | /** List of module reflections which are models to rename */ 13 | private moduleRenames = new Array(); 14 | private externalmap: string | string[] = ''; 15 | private mapRegExs = new Array(); 16 | private isMappingEnabled = false ; 17 | 18 | initialize(app: Application) { 19 | app.converter.on(Converter.EVENT_BEGIN, this.onBegin.bind(this)); 20 | app.converter.on(Converter.EVENT_CREATE_DECLARATION, this.onDeclarationBegin.bind(this)); 21 | app.converter.on(Converter.EVENT_RESOLVE_BEGIN, this.onBeginResolve.bind(this)); 22 | } 23 | 24 | /** 25 | * Triggered when the converter begins converting a project. 26 | * 27 | * @param context The context object describing the current state the converter is in. 28 | */ 29 | private onBegin(this: ExternalModuleMapPlugin, context: Context) { 30 | this.moduleRenames = []; 31 | //this.options.read(); 32 | this.externalmap = context.converter.application.options.getValue("external-modulemap") as (string | string[]); 33 | if (!!this.externalmap) { 34 | try { 35 | console.log("INFO: applying regexp ", this.externalmap, " to calculate module names"); 36 | this.mapRegExs = Array.isArray(this.externalmap) ? this.externalmap.map(reg => new RegExp(reg)) : [new RegExp(this.externalmap)]; 37 | this.isMappingEnabled = true; 38 | console.log("INFO: Enabled", this.isMappingEnabled); 39 | } catch (e) { 40 | console.log("WARN: external map not recognized. Not processing.", e); 41 | } 42 | } 43 | } 44 | 45 | private onDeclarationBegin(this: ExternalModuleMapPlugin, context: Context, reflection: Reflection, node?: any) { 46 | 47 | if (!this.isMappingEnabled) { 48 | return; 49 | } 50 | 51 | if (!(reflection.kindOf(ReflectionKind.SomeModule))) { 52 | return; 53 | } 54 | 55 | const symbol = reflection.project.getSymbolFromReflection(reflection); 56 | 57 | for (const node of symbol?.declarations || []) { 58 | const sourceFile = node.getSourceFile(); 59 | const fileName = sourceFile.fileName; 60 | 61 | let match; 62 | for (const reg of this.mapRegExs) { 63 | match = reg.exec(fileName); 64 | if (null != match) { 65 | break; 66 | } 67 | } 68 | if (null != match) { 69 | console.log(' Mapping ', fileName, ' ==> ', match[1]); 70 | this.moduleRenames.push({ 71 | renameTo: match[1], 72 | reflection: reflection 73 | }); 74 | } 75 | } 76 | } 77 | 78 | /** 79 | * Triggered when the converter begins resolving a project. 80 | * 81 | * @param context The context object describing the current state the converter is in. 82 | */ 83 | private onBeginResolve(this: ExternalModuleMapPlugin, context: Context) { 84 | let projRefs: any = context.project.reflections; 85 | let refsArray: Reflection[] = Object.keys(projRefs).reduce((m:any, k:any) => { m.push(projRefs[k]); return m.filter( (y:any) => y instanceof ContainerReflection); }, []); 86 | 87 | // Process each rename 88 | this.moduleRenames.forEach(item => { 89 | let renaming = item.reflection; 90 | // Find an existing module that already has the "rename to" name. Use it as the merge target. 91 | let mergeTarget = 92 | refsArray.filter(ref => ref.kind === renaming.kind && ref.name === item.renameTo)[0]; 93 | 94 | // If there wasn't a merge target, just change the name of the current module and exit. 95 | if (!mergeTarget) { 96 | renaming.name = item.renameTo; 97 | return; 98 | } 99 | 100 | if (!mergeTarget.children) { 101 | mergeTarget.children = []; 102 | } 103 | 104 | // Since there is a merge target, relocate all the renaming module's children to the mergeTarget. 105 | let childrenOfRenamed = refsArray.filter(ref => ref.parent === renaming); 106 | childrenOfRenamed.forEach((ref: Reflection) => { 107 | // update links in both directions 108 | 109 | //console.log(' merging ', mergeTarget, ref); 110 | ref.parent = mergeTarget; 111 | if (mergeTarget && mergeTarget.children) { 112 | mergeTarget.children.push(ref) 113 | } 114 | }); 115 | 116 | 117 | // Now that all the children have been relocated to the mergeTarget, delete the empty module 118 | // Make sure the module being renamed doesn't have children, or they will be deleted 119 | if (renaming.children) 120 | renaming.children.length = 0; 121 | 122 | context.project.removeReflection(renaming); 123 | }); 124 | } 125 | } 126 | 127 | interface ModuleRename { 128 | renameTo: string; 129 | reflection: ContainerReflection; 130 | } 131 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2018", 4 | "module": "node16", 5 | "isolatedModules": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "skipLibCheck": true, 9 | "strict": true, 10 | "sourceMap": true, 11 | "outDir": "dist", 12 | "verbatimModuleSyntax": true, 13 | }, 14 | "include": [ 15 | "src/*.ts" 16 | ], 17 | "exclude": [ 18 | "node_modules" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@gerrit0/mini-shiki@^1.24.0": 6 | version "1.27.2" 7 | resolved "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz" 8 | integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== 9 | dependencies: 10 | "@shikijs/engine-oniguruma" "^1.27.2" 11 | "@shikijs/types" "^1.27.2" 12 | "@shikijs/vscode-textmate" "^10.0.1" 13 | 14 | "@shikijs/engine-oniguruma@^1.27.2": 15 | version "1.29.2" 16 | resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz" 17 | integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== 18 | dependencies: 19 | "@shikijs/types" "1.29.2" 20 | "@shikijs/vscode-textmate" "^10.0.1" 21 | 22 | "@shikijs/types@^1.27.2", "@shikijs/types@1.29.2": 23 | version "1.29.2" 24 | resolved "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz" 25 | integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== 26 | dependencies: 27 | "@shikijs/vscode-textmate" "^10.0.1" 28 | "@types/hast" "^3.0.4" 29 | 30 | "@shikijs/vscode-textmate@^10.0.1": 31 | version "10.0.2" 32 | resolved "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz" 33 | integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== 34 | 35 | "@types/hast@^3.0.4": 36 | version "3.0.4" 37 | resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" 38 | integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== 39 | dependencies: 40 | "@types/unist" "*" 41 | 42 | "@types/node@^20.14.14": 43 | version "20.14.14" 44 | resolved "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz" 45 | integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ== 46 | dependencies: 47 | undici-types "~5.26.4" 48 | 49 | "@types/unist@*": 50 | version "3.0.3" 51 | resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" 52 | integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== 53 | 54 | argparse@^2.0.1: 55 | version "2.0.1" 56 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 57 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 58 | 59 | balanced-match@^1.0.0: 60 | version "1.0.2" 61 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 62 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 63 | 64 | brace-expansion@^2.0.1: 65 | version "2.0.1" 66 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 67 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 68 | dependencies: 69 | balanced-match "^1.0.0" 70 | 71 | entities@^4.4.0: 72 | version "4.5.0" 73 | resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" 74 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 75 | 76 | linkify-it@^5.0.0: 77 | version "5.0.0" 78 | resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" 79 | integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== 80 | dependencies: 81 | uc.micro "^2.0.0" 82 | 83 | lunr@^2.3.9: 84 | version "2.3.9" 85 | resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" 86 | integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 87 | 88 | markdown-it@^14.1.0: 89 | version "14.1.0" 90 | resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" 91 | integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== 92 | dependencies: 93 | argparse "^2.0.1" 94 | entities "^4.4.0" 95 | linkify-it "^5.0.0" 96 | mdurl "^2.0.0" 97 | punycode.js "^2.3.1" 98 | uc.micro "^2.1.0" 99 | 100 | mdurl@^2.0.0: 101 | version "2.0.0" 102 | resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" 103 | integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== 104 | 105 | minimatch@^9.0.5: 106 | version "9.0.5" 107 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" 108 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 109 | dependencies: 110 | brace-expansion "^2.0.1" 111 | 112 | punycode.js@^2.3.1: 113 | version "2.3.1" 114 | resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" 115 | integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== 116 | 117 | typedoc@^0.27.0: 118 | version "0.27.9" 119 | resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz" 120 | integrity sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw== 121 | dependencies: 122 | "@gerrit0/mini-shiki" "^1.24.0" 123 | lunr "^2.3.9" 124 | markdown-it "^14.1.0" 125 | minimatch "^9.0.5" 126 | yaml "^2.6.1" 127 | 128 | typescript@^5.6.0, "typescript@5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x": 129 | version "5.8.2" 130 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz" 131 | integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== 132 | 133 | uc.micro@^2.0.0, uc.micro@^2.1.0: 134 | version "2.1.0" 135 | resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" 136 | integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== 137 | 138 | undici-types@~5.26.4: 139 | version "5.26.5" 140 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" 141 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 142 | 143 | yaml@^2.6.1: 144 | version "2.7.0" 145 | resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" 146 | integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== 147 | --------------------------------------------------------------------------------