diff --git a/services/web/bin/routes b/services/web/bin/routes index 33bdeb713d..2cf77e966c 100755 --- a/services/web/bin/routes +++ b/services/web/bin/routes @@ -5,7 +5,8 @@ const acornWalk = require('acorn-walk') const fs = require('fs') const _ = require('lodash') const glob = require('glob') -print = console.log +const escodegen = require('escodegen') +const print = console.log const Methods = new Set([ 'get', @@ -16,7 +17,7 @@ const Methods = new Set([ 'connect', 'options', 'trace', - 'patch' + 'patch', ]) const isMethod = str => { @@ -32,14 +33,15 @@ const routerCall = callExpression => { return false } const routerName = callee.object.name - if ( // Match known names for the Express routers: app, webRouter, whateverRouter, etc... + if ( + // Match known names for the Express routers: app, webRouter, whateverRouter, etc... isMethod(property.name) && (routerName === 'app' || routerName.match('^.*[rR]outer$')) ) { return { routerName: routerName, method: property.name, - args: args + args: args, } } else { return null @@ -47,10 +49,7 @@ const routerCall = callExpression => { } const formatMethodCall = expression => { - if (!expression.object || !expression.property) { - return '????' - } - return `${expression.object.name}.${expression.property.name}` + return escodegen.generate(expression, { format: { compact: true } }) } const parseAndPrintRoutesSync = path => { @@ -62,12 +61,11 @@ const parseAndPrintRoutesSync = path => { const call = routerCall(node) if (call) { const firstArg = _.first(call.args) - const lastArg = _.last(call.args) try { print( ` ${formatRouterName(call.routerName)}\t .${call.method} \t: ${ firstArg.value - } => ${formatMethodCall(lastArg)}` + } => ${call.args.slice(1).map(formatMethodCall).join(' => ')}` ) } catch (e) { print('>> Error') @@ -76,15 +74,15 @@ const parseAndPrintRoutesSync = path => { process.exit(1) } } - } + }, }) } const routerNameMapping = { - 'privateApiRouter': 'privateApi', - 'publicApiRouter': 'publicApi' + privateApiRouter: 'privateApi', + publicApiRouter: 'publicApi', } -const formatRouterName = (name) => { +const formatRouterName = name => { return routerNameMapping[name] || name } @@ -92,7 +90,7 @@ const main = () => { // Take an optional filter to apply to file names const filter = process.argv[2] || null - if (filter && (filter === '--help' || filter == 'help')) { + if (filter && (filter === '--help' || filter === 'help')) { print('') print(' Usage: bin/routes [filter]') print(' Examples:') @@ -104,7 +102,11 @@ const main = () => { // Find all routers glob('*[rR]outer.js', { matchBase: true }, (err, files) => { - for (file of files) { + if (err) { + console.error(err) + process.exit(1) + } + for (const file of files) { if (file.match('^node_modules.*$') || file.match('.*/public/.*')) { continue } diff --git a/services/web/package-lock.json b/services/web/package-lock.json index 0f47c77ed3..759fe46282 100644 --- a/services/web/package-lock.json +++ b/services/web/package-lock.json @@ -18859,9 +18859,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "source-map": { @@ -26506,7 +26506,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -29917,17 +29917,17 @@ "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha512-oCOQ8AIC2ciLy/sE2ehafRBleBgDLvzGhBRRev87sP7ovnbvQfqpc3XFI0DhHey2OfVoNV91W+GPC6B3540/5Q==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "ordered-read-streams": { @@ -31645,7 +31645,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "prepend-http": { @@ -38050,7 +38050,7 @@ "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "~1.1.2" diff --git a/services/web/package.json b/services/web/package.json index 66e832313b..4654e1bc29 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -34,7 +34,8 @@ "lint:fix": "eslint --fix .", "extract-translations": "i18next-scanner", "migrations": "east", - "storybook": "start-storybook -p 6006 -s ./public" + "storybook": "start-storybook -p 6006 -s ./public", + "routes": "bin/routes" }, "browserslist": [ "last 1 year", @@ -226,6 +227,7 @@ "copy-webpack-plugin": "^5.1.1", "css-loader": "^3.5.2", "es6-promise": "^4.2.8", + "escodegen": "^2.0.0", "eslint": "^8.2.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.3", @@ -288,4 +290,4 @@ "webpack-merge": "^4.2.2", "worker-loader": "^2.0.0" } -} +} \ No newline at end of file