├── .gitignore ├── README.md ├── bin └── mvn-search ├── output.gif ├── package-lock.json ├── package.json └── src └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `mvn-search` - command-line tool for searching maven central 2 | 3 | This is a utility for developers who prefer searching maven dependencies in the command line instead of the web UI of 4 | search.maven.org 5 | 6 | ![Searching demo](output.gif "Searching demo") 7 | 8 | ## Installation 9 | 10 | Prerequisite: node `10.9.0` or newer should be installed. 11 | 12 | 17 | 18 | ```bash 19 | npm install -g @erosb/mvn-search 20 | ``` 21 | 22 | ## Usage: `mvn-search ` 23 | 24 | This will list the found artifacts with their latest version numbers. After selecting the coordinates the tool displays 25 | the maven `` tag to be pasted into the `pom.xml`. 26 | 27 | 28 | ### Examples: 29 | 30 | * `mvn-search hibernate-validator` 31 | * `mvn-search g:org.slf4j` 32 | 33 | -------------------------------------------------------------------------------- /bin/mvn-search: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import yargs from 'yargs'; 3 | import { search } from "../src/index.js" 4 | const args = yargs 5 | .scriptName('mvn-search') 6 | .usage('$0 [args] ', 'search for maven dependency', (yargs) => { 7 | yargs.positional('query-string', { 8 | describe: 'the dependency you search for', 9 | type: 'string' 10 | }) 11 | }) 12 | .option('format', { 13 | alias: 'f', 14 | description: 'Define in which format to print dependency. (gradle, gradlekts, gradlegroovy, maven, sbt)', 15 | type: 'string', 16 | default: 'maven' 17 | }) 18 | .help() 19 | .alias('help', 'h') 20 | .argv; 21 | 22 | search(args['query-string'], args.format); 23 | -------------------------------------------------------------------------------- /output.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erosb/mvn-search/f0acea35baac6e890439b5472ca4d2d2d7c42186/output.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@erosb/mvn-search", 3 | "version": "0.0.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@erosb/mvn-search", 9 | "version": "0.0.5", 10 | "license": "MIT", 11 | "dependencies": { 12 | "clipboardy": "^2.3.0", 13 | "esm": "^3.2.25", 14 | "inquirer": "^7.3.3", 15 | "yargs": "^15.4.1" 16 | }, 17 | "bin": { 18 | "mvn-search": "bin/mvn-search" 19 | } 20 | }, 21 | "node_modules/@types/color-name": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 24 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 25 | }, 26 | "node_modules/ansi-escapes": { 27 | "version": "4.3.1", 28 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 29 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 30 | "dependencies": { 31 | "type-fest": "^0.11.0" 32 | }, 33 | "engines": { 34 | "node": ">=8" 35 | }, 36 | "funding": { 37 | "url": "https://github.com/sponsors/sindresorhus" 38 | } 39 | }, 40 | "node_modules/ansi-regex": { 41 | "version": "5.0.1", 42 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 43 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 44 | "engines": { 45 | "node": ">=8" 46 | } 47 | }, 48 | "node_modules/ansi-styles": { 49 | "version": "4.2.1", 50 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 51 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 52 | "dependencies": { 53 | "@types/color-name": "^1.1.1", 54 | "color-convert": "^2.0.1" 55 | }, 56 | "engines": { 57 | "node": ">=8" 58 | }, 59 | "funding": { 60 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 61 | } 62 | }, 63 | "node_modules/arch": { 64 | "version": "2.1.2", 65 | "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", 66 | "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", 67 | "funding": [ 68 | { 69 | "type": "github", 70 | "url": "https://github.com/sponsors/feross" 71 | }, 72 | { 73 | "type": "patreon", 74 | "url": "https://www.patreon.com/feross" 75 | }, 76 | { 77 | "type": "consulting", 78 | "url": "https://feross.org/support" 79 | } 80 | ] 81 | }, 82 | "node_modules/camelcase": { 83 | "version": "5.3.1", 84 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 85 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 86 | "engines": { 87 | "node": ">=6" 88 | } 89 | }, 90 | "node_modules/chalk": { 91 | "version": "4.1.0", 92 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 93 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 94 | "dependencies": { 95 | "ansi-styles": "^4.1.0", 96 | "supports-color": "^7.1.0" 97 | }, 98 | "engines": { 99 | "node": ">=10" 100 | }, 101 | "funding": { 102 | "url": "https://github.com/chalk/chalk?sponsor=1" 103 | } 104 | }, 105 | "node_modules/chardet": { 106 | "version": "0.7.0", 107 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 108 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 109 | }, 110 | "node_modules/cli-cursor": { 111 | "version": "3.1.0", 112 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 113 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 114 | "dependencies": { 115 | "restore-cursor": "^3.1.0" 116 | }, 117 | "engines": { 118 | "node": ">=8" 119 | } 120 | }, 121 | "node_modules/cli-width": { 122 | "version": "3.0.0", 123 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 124 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 125 | "engines": { 126 | "node": ">= 10" 127 | } 128 | }, 129 | "node_modules/clipboardy": { 130 | "version": "2.3.0", 131 | "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", 132 | "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", 133 | "dependencies": { 134 | "arch": "^2.1.1", 135 | "execa": "^1.0.0", 136 | "is-wsl": "^2.1.1" 137 | }, 138 | "engines": { 139 | "node": ">=8" 140 | } 141 | }, 142 | "node_modules/cliui": { 143 | "version": "6.0.0", 144 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 145 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 146 | "dependencies": { 147 | "string-width": "^4.2.0", 148 | "strip-ansi": "^6.0.0", 149 | "wrap-ansi": "^6.2.0" 150 | } 151 | }, 152 | "node_modules/color-convert": { 153 | "version": "2.0.1", 154 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 155 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 156 | "dependencies": { 157 | "color-name": "~1.1.4" 158 | }, 159 | "engines": { 160 | "node": ">=7.0.0" 161 | } 162 | }, 163 | "node_modules/color-name": { 164 | "version": "1.1.4", 165 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 166 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 167 | }, 168 | "node_modules/cross-spawn": { 169 | "version": "6.0.5", 170 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 171 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 172 | "dependencies": { 173 | "nice-try": "^1.0.4", 174 | "path-key": "^2.0.1", 175 | "semver": "^5.5.0", 176 | "shebang-command": "^1.2.0", 177 | "which": "^1.2.9" 178 | }, 179 | "engines": { 180 | "node": ">=4.8" 181 | } 182 | }, 183 | "node_modules/decamelize": { 184 | "version": "1.2.0", 185 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 186 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 187 | "engines": { 188 | "node": ">=0.10.0" 189 | } 190 | }, 191 | "node_modules/emoji-regex": { 192 | "version": "8.0.0", 193 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 194 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 195 | }, 196 | "node_modules/end-of-stream": { 197 | "version": "1.4.4", 198 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 199 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 200 | "dependencies": { 201 | "once": "^1.4.0" 202 | } 203 | }, 204 | "node_modules/escape-string-regexp": { 205 | "version": "1.0.5", 206 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 207 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 208 | "engines": { 209 | "node": ">=0.8.0" 210 | } 211 | }, 212 | "node_modules/esm": { 213 | "version": "3.2.25", 214 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 215 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", 216 | "engines": { 217 | "node": ">=6" 218 | } 219 | }, 220 | "node_modules/execa": { 221 | "version": "1.0.0", 222 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 223 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 224 | "dependencies": { 225 | "cross-spawn": "^6.0.0", 226 | "get-stream": "^4.0.0", 227 | "is-stream": "^1.1.0", 228 | "npm-run-path": "^2.0.0", 229 | "p-finally": "^1.0.0", 230 | "signal-exit": "^3.0.0", 231 | "strip-eof": "^1.0.0" 232 | }, 233 | "engines": { 234 | "node": ">=6" 235 | } 236 | }, 237 | "node_modules/external-editor": { 238 | "version": "3.1.0", 239 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 240 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 241 | "dependencies": { 242 | "chardet": "^0.7.0", 243 | "iconv-lite": "^0.4.24", 244 | "tmp": "^0.0.33" 245 | }, 246 | "engines": { 247 | "node": ">=4" 248 | } 249 | }, 250 | "node_modules/figures": { 251 | "version": "3.2.0", 252 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 253 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 254 | "dependencies": { 255 | "escape-string-regexp": "^1.0.5" 256 | }, 257 | "engines": { 258 | "node": ">=8" 259 | }, 260 | "funding": { 261 | "url": "https://github.com/sponsors/sindresorhus" 262 | } 263 | }, 264 | "node_modules/find-up": { 265 | "version": "4.1.0", 266 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 267 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 268 | "dependencies": { 269 | "locate-path": "^5.0.0", 270 | "path-exists": "^4.0.0" 271 | }, 272 | "engines": { 273 | "node": ">=8" 274 | } 275 | }, 276 | "node_modules/get-caller-file": { 277 | "version": "2.0.5", 278 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 279 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 280 | "engines": { 281 | "node": "6.* || 8.* || >= 10.*" 282 | } 283 | }, 284 | "node_modules/get-stream": { 285 | "version": "4.1.0", 286 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 287 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 288 | "dependencies": { 289 | "pump": "^3.0.0" 290 | }, 291 | "engines": { 292 | "node": ">=6" 293 | } 294 | }, 295 | "node_modules/has-flag": { 296 | "version": "4.0.0", 297 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 298 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 299 | "engines": { 300 | "node": ">=8" 301 | } 302 | }, 303 | "node_modules/iconv-lite": { 304 | "version": "0.4.24", 305 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 306 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 307 | "dependencies": { 308 | "safer-buffer": ">= 2.1.2 < 3" 309 | }, 310 | "engines": { 311 | "node": ">=0.10.0" 312 | } 313 | }, 314 | "node_modules/inquirer": { 315 | "version": "7.3.3", 316 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", 317 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 318 | "dependencies": { 319 | "ansi-escapes": "^4.2.1", 320 | "chalk": "^4.1.0", 321 | "cli-cursor": "^3.1.0", 322 | "cli-width": "^3.0.0", 323 | "external-editor": "^3.0.3", 324 | "figures": "^3.0.0", 325 | "lodash": "^4.17.19", 326 | "mute-stream": "0.0.8", 327 | "run-async": "^2.4.0", 328 | "rxjs": "^6.6.0", 329 | "string-width": "^4.1.0", 330 | "strip-ansi": "^6.0.0", 331 | "through": "^2.3.6" 332 | }, 333 | "engines": { 334 | "node": ">=8.0.0" 335 | } 336 | }, 337 | "node_modules/is-docker": { 338 | "version": "2.1.1", 339 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", 340 | "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", 341 | "bin": { 342 | "is-docker": "cli.js" 343 | }, 344 | "engines": { 345 | "node": ">=8" 346 | }, 347 | "funding": { 348 | "url": "https://github.com/sponsors/sindresorhus" 349 | } 350 | }, 351 | "node_modules/is-fullwidth-code-point": { 352 | "version": "3.0.0", 353 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 354 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 355 | "engines": { 356 | "node": ">=8" 357 | } 358 | }, 359 | "node_modules/is-stream": { 360 | "version": "1.1.0", 361 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 362 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 363 | "engines": { 364 | "node": ">=0.10.0" 365 | } 366 | }, 367 | "node_modules/is-wsl": { 368 | "version": "2.2.0", 369 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 370 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 371 | "dependencies": { 372 | "is-docker": "^2.0.0" 373 | }, 374 | "engines": { 375 | "node": ">=8" 376 | } 377 | }, 378 | "node_modules/isexe": { 379 | "version": "2.0.0", 380 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 381 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 382 | }, 383 | "node_modules/locate-path": { 384 | "version": "5.0.0", 385 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 386 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 387 | "dependencies": { 388 | "p-locate": "^4.1.0" 389 | }, 390 | "engines": { 391 | "node": ">=8" 392 | } 393 | }, 394 | "node_modules/lodash": { 395 | "version": "4.17.19", 396 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 397 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 398 | }, 399 | "node_modules/mimic-fn": { 400 | "version": "2.1.0", 401 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 402 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 403 | "engines": { 404 | "node": ">=6" 405 | } 406 | }, 407 | "node_modules/mute-stream": { 408 | "version": "0.0.8", 409 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 410 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 411 | }, 412 | "node_modules/nice-try": { 413 | "version": "1.0.5", 414 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 415 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 416 | }, 417 | "node_modules/npm-run-path": { 418 | "version": "2.0.2", 419 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 420 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 421 | "dependencies": { 422 | "path-key": "^2.0.0" 423 | }, 424 | "engines": { 425 | "node": ">=4" 426 | } 427 | }, 428 | "node_modules/once": { 429 | "version": "1.4.0", 430 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 431 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 432 | "dependencies": { 433 | "wrappy": "1" 434 | } 435 | }, 436 | "node_modules/onetime": { 437 | "version": "5.1.2", 438 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 439 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 440 | "dependencies": { 441 | "mimic-fn": "^2.1.0" 442 | }, 443 | "engines": { 444 | "node": ">=6" 445 | }, 446 | "funding": { 447 | "url": "https://github.com/sponsors/sindresorhus" 448 | } 449 | }, 450 | "node_modules/os-tmpdir": { 451 | "version": "1.0.2", 452 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 453 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 454 | "engines": { 455 | "node": ">=0.10.0" 456 | } 457 | }, 458 | "node_modules/p-finally": { 459 | "version": "1.0.0", 460 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 461 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 462 | "engines": { 463 | "node": ">=4" 464 | } 465 | }, 466 | "node_modules/p-limit": { 467 | "version": "2.3.0", 468 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 469 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 470 | "dependencies": { 471 | "p-try": "^2.0.0" 472 | }, 473 | "engines": { 474 | "node": ">=6" 475 | }, 476 | "funding": { 477 | "url": "https://github.com/sponsors/sindresorhus" 478 | } 479 | }, 480 | "node_modules/p-locate": { 481 | "version": "4.1.0", 482 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 483 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 484 | "dependencies": { 485 | "p-limit": "^2.2.0" 486 | }, 487 | "engines": { 488 | "node": ">=8" 489 | } 490 | }, 491 | "node_modules/p-try": { 492 | "version": "2.2.0", 493 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 494 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 495 | "engines": { 496 | "node": ">=6" 497 | } 498 | }, 499 | "node_modules/path-exists": { 500 | "version": "4.0.0", 501 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 502 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 503 | "engines": { 504 | "node": ">=8" 505 | } 506 | }, 507 | "node_modules/path-key": { 508 | "version": "2.0.1", 509 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 510 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 511 | "engines": { 512 | "node": ">=4" 513 | } 514 | }, 515 | "node_modules/pump": { 516 | "version": "3.0.0", 517 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 518 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 519 | "dependencies": { 520 | "end-of-stream": "^1.1.0", 521 | "once": "^1.3.1" 522 | } 523 | }, 524 | "node_modules/require-directory": { 525 | "version": "2.1.1", 526 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 527 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 528 | "engines": { 529 | "node": ">=0.10.0" 530 | } 531 | }, 532 | "node_modules/require-main-filename": { 533 | "version": "2.0.0", 534 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 535 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 536 | }, 537 | "node_modules/restore-cursor": { 538 | "version": "3.1.0", 539 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 540 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 541 | "dependencies": { 542 | "onetime": "^5.1.0", 543 | "signal-exit": "^3.0.2" 544 | }, 545 | "engines": { 546 | "node": ">=8" 547 | } 548 | }, 549 | "node_modules/run-async": { 550 | "version": "2.4.1", 551 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 552 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 553 | "engines": { 554 | "node": ">=0.12.0" 555 | } 556 | }, 557 | "node_modules/rxjs": { 558 | "version": "6.6.2", 559 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", 560 | "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", 561 | "dependencies": { 562 | "tslib": "^1.9.0" 563 | }, 564 | "engines": { 565 | "npm": ">=2.0.0" 566 | } 567 | }, 568 | "node_modules/safer-buffer": { 569 | "version": "2.1.2", 570 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 571 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 572 | }, 573 | "node_modules/semver": { 574 | "version": "5.7.1", 575 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 576 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 577 | "bin": { 578 | "semver": "bin/semver" 579 | } 580 | }, 581 | "node_modules/set-blocking": { 582 | "version": "2.0.0", 583 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 584 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 585 | }, 586 | "node_modules/shebang-command": { 587 | "version": "1.2.0", 588 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 589 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 590 | "dependencies": { 591 | "shebang-regex": "^1.0.0" 592 | }, 593 | "engines": { 594 | "node": ">=0.10.0" 595 | } 596 | }, 597 | "node_modules/shebang-regex": { 598 | "version": "1.0.0", 599 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 600 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 601 | "engines": { 602 | "node": ">=0.10.0" 603 | } 604 | }, 605 | "node_modules/signal-exit": { 606 | "version": "3.0.3", 607 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 608 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 609 | }, 610 | "node_modules/string-width": { 611 | "version": "4.2.0", 612 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 613 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 614 | "dependencies": { 615 | "emoji-regex": "^8.0.0", 616 | "is-fullwidth-code-point": "^3.0.0", 617 | "strip-ansi": "^6.0.0" 618 | }, 619 | "engines": { 620 | "node": ">=8" 621 | } 622 | }, 623 | "node_modules/strip-ansi": { 624 | "version": "6.0.0", 625 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 626 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 627 | "dependencies": { 628 | "ansi-regex": "^5.0.0" 629 | }, 630 | "engines": { 631 | "node": ">=8" 632 | } 633 | }, 634 | "node_modules/strip-eof": { 635 | "version": "1.0.0", 636 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 637 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 638 | "engines": { 639 | "node": ">=0.10.0" 640 | } 641 | }, 642 | "node_modules/supports-color": { 643 | "version": "7.1.0", 644 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 645 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 646 | "dependencies": { 647 | "has-flag": "^4.0.0" 648 | }, 649 | "engines": { 650 | "node": ">=8" 651 | } 652 | }, 653 | "node_modules/through": { 654 | "version": "2.3.8", 655 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 656 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 657 | }, 658 | "node_modules/tmp": { 659 | "version": "0.0.33", 660 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 661 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 662 | "dependencies": { 663 | "os-tmpdir": "~1.0.2" 664 | }, 665 | "engines": { 666 | "node": ">=0.6.0" 667 | } 668 | }, 669 | "node_modules/tslib": { 670 | "version": "1.13.0", 671 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 672 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" 673 | }, 674 | "node_modules/type-fest": { 675 | "version": "0.11.0", 676 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 677 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 678 | "engines": { 679 | "node": ">=8" 680 | }, 681 | "funding": { 682 | "url": "https://github.com/sponsors/sindresorhus" 683 | } 684 | }, 685 | "node_modules/which": { 686 | "version": "1.3.1", 687 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 688 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 689 | "dependencies": { 690 | "isexe": "^2.0.0" 691 | }, 692 | "bin": { 693 | "which": "bin/which" 694 | } 695 | }, 696 | "node_modules/which-module": { 697 | "version": "2.0.0", 698 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 699 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 700 | }, 701 | "node_modules/wrap-ansi": { 702 | "version": "6.2.0", 703 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 704 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 705 | "dependencies": { 706 | "ansi-styles": "^4.0.0", 707 | "string-width": "^4.1.0", 708 | "strip-ansi": "^6.0.0" 709 | }, 710 | "engines": { 711 | "node": ">=8" 712 | } 713 | }, 714 | "node_modules/wrappy": { 715 | "version": "1.0.2", 716 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 717 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 718 | }, 719 | "node_modules/y18n": { 720 | "version": "4.0.0", 721 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 722 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 723 | }, 724 | "node_modules/yargs": { 725 | "version": "15.4.1", 726 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 727 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 728 | "dependencies": { 729 | "cliui": "^6.0.0", 730 | "decamelize": "^1.2.0", 731 | "find-up": "^4.1.0", 732 | "get-caller-file": "^2.0.1", 733 | "require-directory": "^2.1.1", 734 | "require-main-filename": "^2.0.0", 735 | "set-blocking": "^2.0.0", 736 | "string-width": "^4.2.0", 737 | "which-module": "^2.0.0", 738 | "y18n": "^4.0.0", 739 | "yargs-parser": "^18.1.2" 740 | }, 741 | "engines": { 742 | "node": ">=8" 743 | } 744 | }, 745 | "node_modules/yargs-parser": { 746 | "version": "18.1.3", 747 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 748 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 749 | "dependencies": { 750 | "camelcase": "^5.0.0", 751 | "decamelize": "^1.2.0" 752 | }, 753 | "engines": { 754 | "node": ">=6" 755 | } 756 | } 757 | } 758 | } 759 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@erosb/mvn-search", 3 | "version": "0.0.5", 4 | "description": "CLI to search the Maven dependencies", 5 | "main": "src/index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "bin": { 11 | "@erosb/mvn-search": "bin/mvn-search", 12 | "mvn-search": "bin/mvn-search" 13 | }, 14 | "publishConfig": { 15 | "access": "public" 16 | }, 17 | "keywords": [ 18 | "cli", 19 | "mvn", 20 | "search", 21 | "java", 22 | "dependency" 23 | ], 24 | "repository": { 25 | "url": "https://github.com/erosb/mvn-search" 26 | }, 27 | "author": "Bence Eros", 28 | "license": "MIT", 29 | "dependencies": { 30 | "clipboardy": "^2.3.0", 31 | "esm": "^3.2.25", 32 | "inquirer": "^7.3.3", 33 | "yargs": "^15.4.1" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import inquirer from "inquirer"; 2 | import clipboardy from "clipboardy"; 3 | 4 | let lastSearchResults; 5 | let searchTerm; 6 | let dependencyFormat; 7 | 8 | function formatDependency(dependency) { 9 | switch (dependencyFormat.toLowerCase()) { 10 | case 'gradlekts': 11 | case 'gradle': 12 | return formatDependencyGradleKotlin(dependency); 13 | case 'gradlegroovy': 14 | return formatDependencyGradleGroovy(dependency); 15 | case 'sbt': 16 | return formatDependencySbt(dependency); 17 | case 'maven': 18 | default: 19 | return formatDependencyXml(dependency); 20 | } 21 | } 22 | 23 | function formatDependencyXml(dependency) { 24 | return ` 25 | 26 | ${dependency.groupId} 27 | ${dependency.artifactId} 28 | ${dependency.versions[0]} 29 | 30 | `; 31 | } 32 | 33 | function formatDependencyGradleKotlin(dependency) { 34 | return ` 35 | implementation("${dependency.groupId}:${dependency.artifactId}:${dependency.versions[0]}") 36 | `; 37 | } 38 | 39 | function formatDependencyGradleGroovy(dependency) { 40 | return ` 41 | implementation '${dependency.groupId}:${dependency.artifactId}:${dependency.versions[0]}' 42 | `; 43 | } 44 | 45 | function formatDependencySbt(dependency) { 46 | return ` 47 | libraryDependencies += "${dependency.groupId}" % "${dependency.artifactId}" % "${dependency.versions[0]}" 48 | `; 49 | } 50 | 51 | function versionSearchResponseArrived(resp) { 52 | const hits = JSON.parse(resp).response.docs; 53 | if (hits.length === 0) { 54 | console.log("no result"); 55 | return; 56 | } 57 | let needle = hits[0]; 58 | const filtered = lastSearchResults.filter(e => e.groupId === needle.g && e.artifactId === needle.a); 59 | if (filtered.length === 0) { 60 | console.warn(`could not find ${needle.groupId}:${needle.artifactId}`); 61 | return; 62 | } 63 | const target = filtered[0]; 64 | hits.forEach(e => target.versions.push(e.v)); 65 | console.log(target.versions) 66 | } 67 | 68 | function mvnSearchResponseArrived(resp) { 69 | const hits = JSON.parse(resp).response.docs; 70 | 71 | if (hits.length === 0) { 72 | console.error(`no results`) 73 | newSearch(); 74 | return; 75 | } 76 | 77 | lastSearchResults = hits.map(val => { 78 | return { 79 | groupId: val.g, 80 | artifactId: val.a, 81 | packaging: val.p, 82 | versions: [val.latestVersion] 83 | }; 84 | }); 85 | 86 | const choices = lastSearchResults.map(result => { 87 | return { 88 | name: result.groupId + ":" + result.artifactId + ":" + result.versions[0], 89 | value: result 90 | }; 91 | 92 | }); 93 | inquirer.prompt({ 94 | type: "list", 95 | name: "coordinates", 96 | "pageSize": 30, 97 | choices 98 | }).then(answers => { 99 | const ans = answers.coordinates; 100 | console.log(formatDependency(ans)); 101 | inquirer.prompt([ 102 | { 103 | "type": "list", 104 | "name": "action", 105 | "choices": [ 106 | { 107 | "name": "Copy to clipboard", 108 | "value": "copyToClipboard" 109 | }, 110 | { 111 | "name": "Search older versions", 112 | "value": "searchOlderVersions" 113 | }, 114 | { 115 | "name": "Start a new search", 116 | "value": "newSearch" 117 | }, 118 | { 119 | "name": "quit", 120 | "value": "quit" 121 | } 122 | ] 123 | } 124 | ]).then(answers => { 125 | const action = answers.action; 126 | switch (action) { 127 | case "quit": 128 | break; 129 | case "newSearch": 130 | newSearch(); 131 | break; 132 | case "copyToClipboard": 133 | clipboardy.writeSync(formatDependency(ans)) 134 | break; 135 | case "searchOlderVersions": 136 | fetch("https://search.maven.org/solrsearch/select?rows=98&q=g:" + ans.groupId + "+AND+a:" + ans.artifactId + "&core=gav") 137 | .then(resp => resp.text()) 138 | .then(versionSearchResponseArrived); 139 | break; 140 | } 141 | }); 142 | }); 143 | } 144 | 145 | function newSearch() { 146 | inquirer.prompt([ 147 | { 148 | "type": "input", 149 | "name": "search term" 150 | } 151 | ]).then(answer => startSearch(answer["search term"])); 152 | } 153 | 154 | function startSearch(searchTerm) { 155 | fetch("https://search.maven.org/solrsearch/select?rows=100&q=" + searchTerm).then(resp => resp.text()) 156 | .then(mvnSearchResponseArrived); 157 | } 158 | 159 | export function search(term, format) { 160 | searchTerm = term || ''; 161 | dependencyFormat = format || 'maven'; 162 | if (searchTerm.trim() === "") { 163 | newSearch(); 164 | } else { 165 | startSearch(searchTerm); 166 | } 167 | } 168 | --------------------------------------------------------------------------------