Skip to content

Commit 82fe2d6

Browse files
committed
feat(info): add --json output
1 parent e35dd95 commit 82fe2d6

2 files changed

Lines changed: 46 additions & 6 deletions

File tree

‎packages/nuxt-cli/src/commands/info.ts‎

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import { defineCommand } from 'citty'
1010

1111
import{detectPackageManager}from'nypm'
1212
import{readPackageJSON}from'pkg-types'
13+
import{camelCase}from'scule'
1314
import{isBun,isDeno,isMinimal}from'std-env'
1415
import{writeText}from'tinyclip'
1516
import{versionasnuxiVersion}from'../../package.json'
1617

1718
import{getBuilder}from'../utils/banner'
1819
import{resolveCatalogEntry}from'../utils/catalog'
20+
import{withDirectStdout}from'../utils/console'
1921
import{formatInfoBox}from'../utils/formatting'
2022
import{tryResolveNuxt}from'../utils/kit'
2123
import{logger}from'../utils/logger'
@@ -28,13 +30,33 @@ import { rootDirArgs } from './_shared'
2830

2931
constLEADING_SLASH_RE=/^\//
3032

33+
/** JSON key for each display label, so `--json` output stays stable if a label is reworded. */
34+
constJSON_KEYS: Record<string,string>={
35+
'Operating system': 'operatingSystem',
36+
'CPU': 'cpu',
37+
'Bun version': 'bunVersion',
38+
'Deno version': 'denoVersion',
39+
'Node.js version': 'nodeVersion',
40+
'nuxt/cli version': 'cliVersion',
41+
'Package manager': 'packageManager',
42+
'Nuxt version': 'nuxtVersion',
43+
'Nitro version': 'nitroVersion',
44+
'Builder': 'builder',
45+
'Config': 'config',
46+
'Modules': 'modules',
47+
}
48+
3149
exportdefaultdefineCommand({
3250
meta: {
3351
name: 'info',
3452
description: 'Get information about Nuxt project',
3553
},
3654
args: {
3755
...rootDirArgs,
56+
json: {
57+
type: 'boolean',
58+
description: 'Print project info as JSON',
59+
},
3860
},
3961
asyncrun(ctx){
4062
constcwd=resolveRootDir(ctx.args)
@@ -63,13 +85,15 @@ export default defineCommand({
6385
constspecifier=Array.isArray(module) ? module[0] : module
6486
constpackageName=typeofspecifier==='string'&&getPackageName(specifier)
6587
constversion=packageName&&awaitgetDepVersion(packageName)
66-
return`\`${version ? `${name}@${version}` : name}\``
88+
returnversion ? `${name}@${version}` : name
6789
}))
6890
const[modules,nuxtVersion='-',nitroVersion]=awaitPromise.all([
6991
modulesPromise,
7092
getDepVersion('nuxt').then(version=>version||getDepVersion('nuxt-nightly')),
7193
resolveNitroVersion(cwd,getDepVersion),
7294
])
95+
constconfigKeys=Object.keys(nuxtConfig).sort()
96+
constmoduleNames=modules.filter(module=>module!==null)
7397
constbuilder=nuxtConfig.builder||'vite'
7498
constpackageManager=detectedPackageManager
7599
? `${detectedPackageManager.name}@${getPackageManagerVersion(detectedPackageManager.command)}`
@@ -95,11 +119,23 @@ export default defineCommand({
95119
'Nuxt version': nuxtVersion,
96120
'Nitro version': nitroVersion,
97121
'Builder': builderInfo.name==='custom' ? 'custom' : `${builderInfo.name.toLowerCase()}@${builderInfo.version}`,
98-
'Config': Object.keys(nuxtConfig)
99-
.map(key=>`\`${key}\``)
100-
.sort()
101-
.join(', '),
102-
'Modules': modules.filter(module=>module!==null).join(', '),
122+
'Config': configKeys.map(key=>`\`${key}\``).join(', '),
123+
'Modules': moduleNames.map(name=>`\`${name}\``).join(', '),
124+
}
125+
126+
if(ctx.args.json){
127+
// Arrays come from the source values rather than the rendered string, so a
128+
// key or module path containing `, ` stays a single entry.
129+
constlists: Record<string,string[]>={config: configKeys,modules: moduleNames}
130+
constpayload=JSON.stringify({
131+
rootDir: nuxtConfig.rootDir||cwd,
132+
...Object.fromEntries(Object.entries(infoObj).map(([label,value])=>{
133+
constkey=JSON_KEYS[label]??camelCase(label)
134+
return[key,lists[key]??(value?.replaceAll('`','')||null)]
135+
})),
136+
},null,2)
137+
awaitwithDirectStdout(()=>process.stdout.write(`${payload}\n`))
138+
return
103139
}
104140

105141
logger.info(`Nuxt root directory: ${styleText('cyan',nuxtConfig.rootDir||cwd)}\n`)

‎packages/nuxt-cli/test/unit/help.spec.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,10 @@ describe('help', () => {
279279
ARGUMENTS
280280
281281
ROOTDIR The root directory of your Nuxt project (default: .)
282+
283+
OPTIONS
284+
285+
--json Print project info as JSON
282286
"
283287
`)
284288
})

0 commit comments

Comments
 (0)