Skip to content

Commit 1ffab0d

Browse files
committed
centralize GraphQL validation
1 parent 8d398cd commit 1ffab0d

File tree

4 files changed

+24
-21
lines changed

4 files changed

+24
-21
lines changed

packages/app/src/cli/services/bulk-operations/execute-bulk-operation.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@ import {formatBulkOperationStatus} from './format-bulk-operation-status.js'
55
import {downloadBulkOperationResults} from './download-bulk-operation-results.js'
66
import {extractBulkOperationId} from './bulk-operation-status.js'
77
import {BULK_OPERATIONS_MIN_API_VERSION} from './constants.js'
8-
import {
9-
createAdminSessionAsApp,
10-
validateSingleOperation,
11-
formatOperationInfo,
12-
resolveApiVersion,
13-
} from '../graphql/common.js'
8+
import {createAdminSessionAsApp, formatOperationInfo, resolveApiVersion} from '../graphql/common.js'
149
import {OrganizationApp, Organization} from '../../models/organization.js'
1510
import {renderSuccess, renderInfo, renderError, renderWarning, TokenItem} from '@shopify/cli-kit/node/ui'
1611
import {outputContent, outputToken, outputResult} from '@shopify/cli-kit/node/output'
@@ -71,7 +66,7 @@ export async function executeBulkOperation(input: ExecuteBulkOperationInput): Pr
7166

7267
const variablesJsonl = await parseVariablesToJsonl(variables, variableFile)
7368

74-
validateGraphQLDocument(query, variablesJsonl)
69+
validateBulkOperationVariables(query, variablesJsonl)
7570

7671
renderInfo({
7772
headline: 'Starting bulk operation.',
@@ -208,9 +203,10 @@ function resultsContainUserErrors(results: string): boolean {
208203
})
209204
}
210205

211-
function validateGraphQLDocument(graphqlOperation: string, variablesJsonl?: string): void {
212-
validateSingleOperation(graphqlOperation)
213-
206+
/**
207+
* Validates bulk operation-specific constraints for variables.
208+
*/
209+
function validateBulkOperationVariables(graphqlOperation: string, variablesJsonl?: string): void {
214210
if (!isMutation(graphqlOperation) && variablesJsonl) {
215211
throw new AbortError(
216212
outputContent`The ${outputToken.yellow('--variables')} and ${outputToken.yellow(

packages/app/src/cli/services/execute-operation.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import {
2-
createAdminSessionAsApp,
3-
validateSingleOperation,
4-
resolveApiVersion,
5-
formatOperationInfo,
6-
} from './graphql/common.js'
1+
import {createAdminSessionAsApp, resolveApiVersion, formatOperationInfo} from './graphql/common.js'
72
import {OrganizationApp, Organization} from '../models/organization.js'
83
import {renderSuccess, renderError, renderInfo, renderSingleTask} from '@shopify/cli-kit/node/ui'
94
import {outputContent, outputToken, outputResult} from '@shopify/cli-kit/node/output'
@@ -89,8 +84,6 @@ export async function executeOperation(input: ExecuteOperationInput): Promise<vo
8984

9085
const parsedVariables = await parseVariables(variables, variableFile)
9186

92-
validateSingleOperation(query)
93-
9487
try {
9588
const result = await renderSingleTask({
9689
title: outputContent`Executing GraphQL operation`,

packages/app/src/cli/utilities/execute-command-helpers.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import {prepareAppStoreContext, prepareExecuteContext} from './execute-command-helpers.js'
22
import {linkedAppContext} from '../services/app-context.js'
33
import {storeContext} from '../services/store-context.js'
4-
import {readStdinString} from '@shopify/cli-kit/node/system'
4+
import {validateSingleOperation} from '../services/graphql/common.js'
55
import {readFile, fileExists} from '@shopify/cli-kit/node/fs'
6+
import {readStdinString} from '@shopify/cli-kit/node/system'
67
import {describe, test, expect, vi, beforeEach} from 'vitest'
78

89
vi.mock('../services/app-context.js')
910
vi.mock('../services/store-context.js')
10-
vi.mock('@shopify/cli-kit/node/system')
1111
vi.mock('@shopify/cli-kit/node/fs')
12+
vi.mock('@shopify/cli-kit/node/system')
13+
vi.mock('../services/graphql/common.js', () => ({
14+
validateSingleOperation: vi.fn(),
15+
}))
1216

1317
describe('prepareAppStoreContext', () => {
1418
const mockFlags = {
@@ -206,4 +210,10 @@ describe('prepareExecuteContext', () => {
206210
expect(readStdinString).toHaveBeenCalled()
207211
expect(result.query).toBe(stdinQuery)
208212
})
213+
214+
test('validates GraphQL query using validateSingleOperation', async () => {
215+
await prepareExecuteContext(mockFlags)
216+
217+
expect(validateSingleOperation).toHaveBeenCalledWith(mockFlags.query)
218+
})
209219
})

packages/app/src/cli/utilities/execute-command-helpers.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {linkedAppContext, LoadedAppContextOutput} from '../services/app-context.js'
22
import {storeContext} from '../services/store-context.js'
3+
import {validateSingleOperation} from '../services/graphql/common.js'
34
import {OrganizationStore} from '../models/organization.js'
45
import {readStdinString} from '@shopify/cli-kit/node/system'
56
import {AbortError} from '@shopify/cli-kit/node/error'
@@ -54,7 +55,7 @@ export async function prepareAppStoreContext(flags: AppStoreContextFlags): Promi
5455

5556
/**
5657
* Prepares the execution context for GraphQL operations.
57-
* Handles query input from flag, file, or stdin, and sets up app and store contexts.
58+
* Handles query input from flag, file, or stdin, validates GraphQL syntax, and sets up app and store contexts.
5859
*
5960
* @param flags - Command flags containing configuration options.
6061
* @param commandName - Name of the command for error messages (e.g., 'execute', 'bulk execute').
@@ -87,6 +88,9 @@ export async function prepareExecuteContext(
8788
)
8889
}
8990

91+
// Validate GraphQL syntax and ensure single operation
92+
validateSingleOperation(query)
93+
9094
const {appContextResult, store} = await prepareAppStoreContext(flags)
9195

9296
return {query, appContextResult, store}

0 commit comments

Comments
 (0)