calibre
Version:
Performance monitoring with Synthetic testing, Chrome UX Report, and Real User Metrics
97 lines (84 loc) • 2.4 kB
JavaScript
import ora from 'ora'
import columnify from 'columnify'
import { pages } from '../../api/rum.js'
import { humaniseError } from '../../utils/api-error.js'
import { options } from '../../utils/cli.js'
import { rumFilterOptions } from '../../utils/rum-options.js'
import { format } from '../../utils/formatters/index.js'
import { colorByGrading } from '../../views/grading.js'
const main = async args => {
let result
let spinner
if (!args.json) {
spinner = ora('Connecting to Calibre').start()
}
try {
result = await pages(args)
if (args.json) return console.log(JSON.stringify(result, null, 2))
} catch (e) {
if (args.json) return console.error(e)
spinner.fail()
throw new Error(humaniseError(e))
}
if (!result.aggregate || result.aggregate.length === 0) {
spinner.fail(
'No RUM page data available. Check that RUM is enabled for this site with: calibre rum config --site=<slug>'
)
return
}
spinner.succeed(`${result.totalCount} pages`)
const formatters = new Map(
(result.metrics || []).map(m => [m.value, m.formatter])
)
const rows = result.aggregate.map(entry => {
const data = new Map(Object.entries(entry))
const fmt = key =>
colorByGrading(
data.get(key) !== null
? format({ formatter: formatters.get(key), value: data.get(key) })
: null,
data.get(`${key}Grading`)
)
return {
path: entry.path || '—',
sessions: entry.sessionCount || entry.count,
lcp: fmt('lcp'),
cls: fmt('cls'),
inp: fmt('inp')
}
})
console.log(
columnify(rows, {
columnSplitter: ' | '
})
)
if (result.aggregate.length >= args.limit) {
console.log(
`\nTo see more pages, run: calibre rum pages --site=${args.site} --offset=${args.offset + args.limit}`
)
}
}
const command = 'pages [options]'
const describe = 'Display Real User Metrics (RUM) page-level breakdown.'
const handler = main
const builder = {
site: options.site,
json: options.json,
...rumFilterOptions,
limit: {
describe: 'Number of pages to display.',
default: 25,
type: 'number'
},
offset: {
describe: 'Number of pages to skip.',
default: 0,
type: 'number'
},
sortBy: {
describe: 'Sort pages by field.',
default: 'sessionCount',
type: 'string'
}
}
export { command, describe, handler, builder }