Skip to content

Commit 3d61b1b

Browse files
skelley-tonodacrem
authored andcommitted
Confirm export prompt now shows overwrite prompt if file exists
1 parent e81e08a commit 3d61b1b

File tree

4 files changed

+56
-10
lines changed

4 files changed

+56
-10
lines changed

packages/store/src/prompts/confirm_export.test.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {describe, expect, vi, test} from 'vitest'
55
vi.mock('@shopify/cli-kit/node/ui')
66

77
describe('confirmExportPrompt', () => {
8-
test('returns true when user confirms', async () => {
8+
test('returns true when user confirms export to new file', async () => {
99
const toFile = 'data.sqlite'
1010
const fromStore = 'shop.myshopify.com'
1111
const message = `Export data from ${fromStore} to ${toFile}?`
@@ -14,7 +14,7 @@ describe('confirmExportPrompt', () => {
1414

1515
vi.mocked(renderConfirmationPrompt).mockResolvedValue(true)
1616

17-
const result = await confirmExportPrompt(fromStore, toFile)
17+
const result = await confirmExportPrompt(fromStore, toFile, false)
1818

1919
expect(renderConfirmationPrompt).toHaveBeenCalledWith({
2020
message,
@@ -24,11 +24,41 @@ describe('confirmExportPrompt', () => {
2424
expect(result).toBe(true)
2525
})
2626

27-
test('returns false when user cancels', async () => {
27+
test('returns false when user cancels export to new file', async () => {
2828
const toFile = 'export.sqlite'
2929
const fromStore = 'test-shop.myshopify.com'
3030
vi.mocked(renderConfirmationPrompt).mockResolvedValue(false)
31-
const result = await confirmExportPrompt(fromStore, toFile)
31+
const result = await confirmExportPrompt(fromStore, toFile, false)
32+
expect(result).toBe(false)
33+
})
34+
35+
test('returns true when user confirms export to existing file', async () => {
36+
const toFile = 'data.sqlite'
37+
const fromStore = 'shop.myshopify.com'
38+
const message = [
39+
`Export data from ${fromStore} to ${toFile}`,
40+
{warn: `\n"${toFile}" already exists do you want to overwrite it?`},
41+
]
42+
const confirmationMessage = 'Yes, export and overwrite'
43+
const cancellationMessage = 'Cancel'
44+
45+
vi.mocked(renderConfirmationPrompt).mockResolvedValue(true)
46+
47+
const result = await confirmExportPrompt(fromStore, toFile, true)
48+
49+
expect(renderConfirmationPrompt).toHaveBeenCalledWith({
50+
message,
51+
confirmationMessage,
52+
cancellationMessage,
53+
})
54+
expect(result).toBe(true)
55+
})
56+
57+
test('returns false when user cancels export to existing file', async () => {
58+
const toFile = 'export.sqlite'
59+
const fromStore = 'test-shop.myshopify.com'
60+
vi.mocked(renderConfirmationPrompt).mockResolvedValue(false)
61+
const result = await confirmExportPrompt(fromStore, toFile, true)
3262
expect(result).toBe(false)
3363
})
3464
})
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import {renderConfirmationPrompt} from '@shopify/cli-kit/node/ui'
22

3-
export async function confirmExportPrompt(fromStore: string, toFile: string): Promise<boolean> {
3+
export async function confirmExportPrompt(fromStore: string, toFile: string, fileExists: boolean): Promise<boolean> {
4+
const message = fileExists
5+
? [
6+
`Export data from ${fromStore} to ${toFile}`,
7+
{warn: `\n"${toFile}" already exists do you want to overwrite it?`},
8+
]
9+
: `Export data from ${fromStore} to ${toFile}?`
10+
11+
const confirmationMessage = fileExists ? 'Yes, export and overwrite' : 'Yes, export'
12+
413
return renderConfirmationPrompt({
5-
message: `Export data from ${fromStore} to ${toFile}?`,
6-
confirmationMessage: 'Yes, export',
14+
message,
15+
confirmationMessage,
716
cancellationMessage: 'Cancel',
817
})
918
}

packages/store/src/services/store/operations/store-export.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ import {OperationError, ErrorCodes} from '../errors/errors.js'
1414
import {confirmExportPrompt} from '../../../prompts/confirm_export.js'
1515
import {describe, vi, expect, test, beforeEach} from 'vitest'
1616
import {renderTasks} from '@shopify/cli-kit/node/ui'
17+
import {fileExistsSync} from '@shopify/cli-kit/node/fs'
1718

1819
vi.mock('../utils/result-file-handler.js')
1920
vi.mock('@shopify/cli-kit/node/ui')
21+
vi.mock('@shopify/cli-kit/node/fs')
2022
vi.mock('../../../prompts/copy_info.js')
2123
vi.mock('../../../prompts/export_results.js')
2224
vi.mock('../../../prompts/confirm_export.js')
@@ -54,13 +56,16 @@ describe('StoreExportOperation', () => {
5456
operation: mockCompletedOperation,
5557
isComplete: true,
5658
})
59+
60+
vi.mocked(fileExistsSync).mockReturnValue(false)
5761
})
5862

5963
test('should show confirm prompt before export', async () => {
64+
vi.mocked(fileExistsSync).mockReturnValue(true)
6065
vi.mocked(confirmExportPrompt).mockResolvedValue(true)
6166
await operation.execute('source.myshopify.com', 'export.sqlite', {})
6267

63-
expect(confirmExportPrompt).toHaveBeenCalledWith('source.myshopify.com', 'export.sqlite')
68+
expect(confirmExportPrompt).toHaveBeenCalledWith('source.myshopify.com', 'export.sqlite', true)
6469
expect(renderExportResult).toHaveBeenCalled()
6570
})
6671

@@ -75,7 +80,7 @@ describe('StoreExportOperation', () => {
7580
vi.mocked(confirmExportPrompt).mockResolvedValue(true)
7681
await operation.execute('source.myshopify.com', 'output.sqlite', {})
7782

78-
expect(confirmExportPrompt).toHaveBeenCalledWith('source.myshopify.com', 'output.sqlite')
83+
expect(confirmExportPrompt).toHaveBeenCalledWith('source.myshopify.com', 'output.sqlite', false)
7984
expect(renderCopyInfo).toHaveBeenCalledWith('Export Operation', 'source.myshopify.com', 'output.sqlite')
8085
expect(renderExportResult).toHaveBeenCalledWith('source.myshopify.com', mockCompletedOperation)
8186
expect(mockResultFileHandler.promptAndHandleResultFile).toHaveBeenCalledWith(

packages/store/src/services/store/operations/store-export.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {renderExportResult} from '../../../prompts/export_results.js'
1313
import {confirmExportPrompt} from '../../../prompts/confirm_export.js'
1414
import {Task, renderTasks} from '@shopify/cli-kit/node/ui'
1515
import {outputInfo} from '@shopify/cli-kit/node/output'
16+
import {fileExistsSync} from '@shopify/cli-kit/node/fs'
1617

1718
export class StoreExportOperation implements StoreOperation {
1819
fromArg: string | undefined
@@ -36,7 +37,8 @@ export class StoreExportOperation implements StoreOperation {
3637
const apiShopId = await this.validateShop(sourceShopDomain)
3738

3839
if (!flags['no-prompt']) {
39-
if (!(await confirmExportPrompt(sourceShopDomain, toFile))) {
40+
const fileExists = fileExistsSync(toFile)
41+
if (!(await confirmExportPrompt(sourceShopDomain, toFile, fileExists))) {
4042
outputInfo('Exiting.')
4143
process.exit(0)
4244
}

0 commit comments

Comments
 (0)