Skip to content

Commit 3249375

Browse files
ryancbahanclaude
andcommitted
Refactor app validation errors: result-based parsing, structured error data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 86abe0f commit 3249375

2 files changed

Lines changed: 21 additions & 12 deletions

File tree

packages/app/src/cli/commands/app/config/validate.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {validateApp} from '../../../services/validate.js'
33
import AppLinkedCommand, {AppLinkedCommandOutput} from '../../../utilities/app-linked-command.js'
44
import {linkedAppContext} from '../../../services/app-context.js'
55
import {globalFlags, jsonFlag} from '@shopify/cli-kit/node/cli'
6+
import {AbortError, AbortSilentError} from '@shopify/cli-kit/node/error'
7+
import {outputResult, stringifyMessage, unstyled} from '@shopify/cli-kit/node/output'
68

79
export default class Validate extends AppLinkedCommand {
810
static summary = 'Validate your app configuration and extensions.'
@@ -20,13 +22,24 @@ export default class Validate extends AppLinkedCommand {
2022
public async run(): Promise<AppLinkedCommandOutput> {
2123
const {flags} = await this.parse(Validate)
2224

23-
const {app} = await linkedAppContext({
24-
directory: flags.path,
25-
clientId: flags['client-id'],
26-
forceRelink: flags.reset,
27-
userProvidedConfigName: flags.config,
28-
unsafeTolerateErrors: true,
29-
})
25+
let app
26+
try {
27+
const context = await linkedAppContext({
28+
directory: flags.path,
29+
clientId: flags['client-id'],
30+
forceRelink: flags.reset,
31+
userProvidedConfigName: flags.config,
32+
unsafeTolerateErrors: true,
33+
})
34+
app = context.app
35+
} catch (err) {
36+
if (err instanceof AbortError && flags.json) {
37+
const message = unstyled(stringifyMessage(err.message)).trim()
38+
outputResult(JSON.stringify({valid: false, errors: [{message}]}, null, 2))
39+
throw new AbortSilentError()
40+
}
41+
throw err
42+
}
3043

3144
await validateApp(app, {json: flags.json})
3245

packages/app/src/cli/models/app/loader.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,7 @@ export async function loadAppFromContext<TModuleSpec extends ExtensionSpecificat
293293

294294
const configResult = await parseConfigurationFile(configSchema, configurationPath, rawConfig)
295295
if (configResult.errors) {
296-
throw new AbortError(
297-
outputContent`${outputToken.errorText('Validation errors')} in ${outputToken.path(
298-
configurationPath,
299-
)}:\n\n${configResult.errors.map(formatConfigurationError).join('\n')}`,
300-
)
296+
throw new AbortError(configResult.errors.map(formatConfigurationError).join('\n'))
301297
}
302298
const configuration = configResult.data
303299

0 commit comments

Comments
 (0)