Skip to content

Commit 4f5de08

Browse files
introduce --version flag to bulk operations CLI
1 parent 3969017 commit 4f5de08

File tree

7 files changed

+75
-5
lines changed

7 files changed

+75
-5
lines changed

packages/app/src/cli/commands/app/bulk/execute.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export default class BulkExecute extends AppLinkedCommand {
5252
variableFile: flags['variable-file'],
5353
watch: flags.watch,
5454
outputFile: flags['output-file'],
55+
version: flags.version,
5556
})
5657

5758
return {app: appContextResult.app}

packages/app/src/cli/flags.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ export const bulkOperationFlags = {
7272
description: 'The file path where results should be written. If not specified, results will be written to STDOUT.',
7373
env: 'SHOPIFY_FLAG_OUTPUT_FILE',
7474
}),
75+
version: Flags.string({
76+
description: 'The API version to use for the bulk operation. If not specified, uses the latest stable version.',
77+
env: 'SHOPIFY_FLAG_VERSION',
78+
}),
7579
}

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ describe('executeBulkOperation', () => {
7575
expect(runBulkOperationQuery).toHaveBeenCalledWith({
7676
adminSession: mockAdminSession,
7777
query,
78+
version: undefined,
7879
})
7980
expect(runBulkOperationMutation).not.toHaveBeenCalled()
8081
})
@@ -96,6 +97,7 @@ describe('executeBulkOperation', () => {
9697
expect(runBulkOperationQuery).toHaveBeenCalledWith({
9798
adminSession: mockAdminSession,
9899
query,
100+
version: undefined,
99101
})
100102
expect(runBulkOperationMutation).not.toHaveBeenCalled()
101103
})
@@ -118,6 +120,7 @@ describe('executeBulkOperation', () => {
118120
adminSession: mockAdminSession,
119121
query: mutation,
120122
variablesJsonl: undefined,
123+
version: undefined,
121124
})
122125
expect(runBulkOperationQuery).not.toHaveBeenCalled()
123126
})
@@ -142,6 +145,54 @@ describe('executeBulkOperation', () => {
142145
adminSession: mockAdminSession,
143146
query: mutation,
144147
variablesJsonl: '{"input":{"id":"gid://shopify/Product/123","tags":["test"]}}',
148+
version: undefined,
149+
})
150+
})
151+
152+
test('passes version parameter to runBulkOperationQuery when version is provided', async () => {
153+
const query = '{ products { edges { node { id } } } }'
154+
const version = '2025-01'
155+
const mockResponse: BulkOperationRunQueryMutation['bulkOperationRunQuery'] = {
156+
bulkOperation: createdBulkOperation,
157+
userErrors: [],
158+
}
159+
vi.mocked(runBulkOperationQuery).mockResolvedValue(mockResponse)
160+
161+
await executeBulkOperation({
162+
remoteApp: mockRemoteApp,
163+
storeFqdn,
164+
query,
165+
version,
166+
})
167+
168+
expect(runBulkOperationQuery).toHaveBeenCalledWith({
169+
adminSession: mockAdminSession,
170+
query,
171+
version,
172+
})
173+
})
174+
175+
test('passes version parameter to runBulkOperationMutation when version is provided', async () => {
176+
const mutation = 'mutation productUpdate($input: ProductInput!) { productUpdate(input: $input) { product { id } } }'
177+
const version = '2025-01'
178+
const mockResponse: BulkOperationRunMutationMutation['bulkOperationRunMutation'] = {
179+
bulkOperation: createdBulkOperation,
180+
userErrors: [],
181+
}
182+
vi.mocked(runBulkOperationMutation).mockResolvedValue(mockResponse)
183+
184+
await executeBulkOperation({
185+
remoteApp: mockRemoteApp,
186+
storeFqdn,
187+
query: mutation,
188+
version,
189+
})
190+
191+
expect(runBulkOperationMutation).toHaveBeenCalledWith({
192+
adminSession: mockAdminSession,
193+
query: mutation,
194+
variablesJsonl: undefined,
195+
version,
145196
})
146197
})
147198

@@ -269,6 +320,7 @@ describe('executeBulkOperation', () => {
269320
adminSession: mockAdminSession,
270321
query: mutation,
271322
variablesJsonl: variables.join('\n'),
323+
version: undefined,
272324
})
273325
})
274326
})

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ interface ExecuteBulkOperationInput {
1919
variableFile?: string
2020
watch?: boolean
2121
outputFile?: string
22+
version?: string
2223
}
2324

2425
async function parseVariablesToJsonl(variables?: string[], variableFile?: string): Promise<string | undefined> {
@@ -39,7 +40,7 @@ async function parseVariablesToJsonl(variables?: string[], variableFile?: string
3940
}
4041

4142
export async function executeBulkOperation(input: ExecuteBulkOperationInput): Promise<void> {
42-
const {remoteApp, storeFqdn, query, variables, variableFile, outputFile, watch = false} = input
43+
const {remoteApp, storeFqdn, query, variables, variableFile, outputFile, watch = false, version} = input
4344

4445
renderInfo({
4546
headline: 'Starting bulk operation.',
@@ -56,8 +57,8 @@ export async function executeBulkOperation(input: ExecuteBulkOperationInput): Pr
5657
validateGraphQLDocument(query, variablesJsonl)
5758

5859
const bulkOperationResponse = isMutation(query)
59-
? await runBulkOperationMutation({adminSession, query, variablesJsonl})
60-
: await runBulkOperationQuery({adminSession, query})
60+
? await runBulkOperationMutation({adminSession, query, variablesJsonl, version})
61+
: await runBulkOperationQuery({adminSession, query, version})
6162

6263
if (bulkOperationResponse?.userErrors?.length) {
6364
const errorMessages = bulkOperationResponse.userErrors

packages/app/src/cli/services/bulk-operations/run-mutation.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ interface BulkOperationRunMutationOptions {
1111
adminSession: AdminSession
1212
query: string
1313
variablesJsonl?: string
14+
version?: string
1415
}
1516

1617
export async function runBulkOperationMutation(
1718
options: BulkOperationRunMutationOptions,
1819
): Promise<BulkOperationRunMutationMutation['bulkOperationRunMutation']> {
19-
const {adminSession, query: mutation, variablesJsonl} = options
20+
const {adminSession, query: mutation, variablesJsonl, version} = options
2021

2122
const stagedUploadPath = await stageFile({
2223
adminSession,
@@ -30,6 +31,7 @@ export async function runBulkOperationMutation(
3031
mutation,
3132
stagedUploadPath,
3233
},
34+
version,
3335
})
3436

3537
return response.bulkOperationRunMutation

packages/app/src/cli/services/bulk-operations/run-query.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ import {AdminSession} from '@shopify/cli-kit/node/session'
88
interface BulkOperationRunQueryOptions {
99
adminSession: AdminSession
1010
query: string
11+
version?: string
1112
}
1213

1314
export async function runBulkOperationQuery(
1415
options: BulkOperationRunQueryOptions,
1516
): Promise<BulkOperationRunQueryMutation['bulkOperationRunQuery']> {
16-
const {adminSession, query} = options
17+
const {adminSession, query, version} = options
1718

1819
const response = await adminRequestDoc<BulkOperationRunQueryMutation, {query: string}>({
1920
query: BulkOperationRunQuery,
2021
session: adminSession,
2122
variables: {query},
23+
version,
2224
})
2325

2426
return response.bulkOperationRunQuery

packages/cli/oclif.manifest.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,14 @@
202202
"name": "verbose",
203203
"type": "boolean"
204204
},
205+
"version": {
206+
"description": "The API version to use for the bulk operation. If not specified, uses the latest stable version.",
207+
"env": "SHOPIFY_FLAG_VERSION",
208+
"hasDynamicHelp": false,
209+
"multiple": false,
210+
"name": "version",
211+
"type": "option"
212+
},
205213
"watch": {
206214
"allowNo": false,
207215
"description": "Wait for bulk operation results before exiting.",

0 commit comments

Comments
 (0)