diff --git a/src/services/modules/snapshot/snapshot.services.ts b/src/services/modules/snapshot/snapshot.services.ts index 89cfc0b9..e7409184 100644 --- a/src/services/modules/snapshot/snapshot.services.ts +++ b/src/services/modules/snapshot/snapshot.services.ts @@ -1,10 +1,7 @@ import type {snapshot_id} from '@dfinity/ic-management'; import {encodeSnapshotId} from '@dfinity/ic-management'; import {Principal} from '@dfinity/principal'; -import {isEmptyString} from '@dfinity/utils'; import {nextArg} from '@junobuild/cli-tools'; -import {red, yellow} from 'kleur'; -import {existsSync, lstatSync} from 'node:fs'; import ora from 'ora'; import { deleteCanisterSnapshot, @@ -13,6 +10,7 @@ import { } from '../../../api/ic.api'; import type {AssetKey} from '../../../types/asset-key'; import {displaySegment} from '../../../utils/display.utils'; +import {assertNonNullishFolderExists} from '../../../utils/fs.utils'; import {confirmAndExit} from '../../../utils/prompt.utils'; import { loadSnapshotAndAssertExist, @@ -131,26 +129,7 @@ export const uploadSnapshot = async ({ const canisterId = Principal.fromText(cId); const folder = nextArg({args, option: '--dir'}); - - if (isEmptyString(folder)) { - console.log( - `You did not provide a ${yellow('directory')} that contains metadata.json and chunks to upload.` - ); - return; - } - - if (!existsSync(folder)) { - console.log(`The directory ${yellow('directory')} does not exist.`); - return; - } - - if (!lstatSync(folder).isDirectory()) { - console.log(red(`${folder} is not a directory.`)); - return; - } - - // TODO: extract assertions - // TODO: more assertion like is there a metadata.json and chunk files + assertNonNullishFolderExists(folder); const {snapshotId} = await loadSnapshotAndAssertOverwrite({canisterId, segment}); diff --git a/src/utils/fs.utils.ts b/src/utils/fs.utils.ts index 9a2af8e7..b86f4f0a 100644 --- a/src/utils/fs.utils.ts +++ b/src/utils/fs.utils.ts @@ -1,5 +1,6 @@ -import {yellow} from 'kleur'; -import {existsSync} from 'node:fs'; +import {isEmptyString} from '@dfinity/utils'; +import {red, yellow} from 'kleur'; +import {existsSync, lstatSync} from 'node:fs'; import {copyFile as fsCopyFile, readFile} from 'node:fs/promises'; import {dirname, join, relative} from 'node:path'; import {fileURLToPath} from 'node:url'; @@ -47,3 +48,24 @@ export const readTemplateFile = async ({ }): Promise => { return await readFile(join(__dirname, sourceFolder, template), 'utf-8'); }; + +export const assertNonNullishFolderExists: ( + folder?: string +) => asserts folder is NonNullable = (folder?: string): void => { + if (isEmptyString(folder)) { + console.log( + `You did not provide a ${yellow('directory')} that contains metadata.json and chunks to upload.` + ); + process.exit(1); + } + + if (!existsSync(folder)) { + console.log(`The directory ${yellow('directory')} does not exist.`); + process.exit(1); + } + + if (!lstatSync(folder).isDirectory()) { + console.log(red(`${folder} is not a directory.`)); + process.exit(1); + } +};