From 52c3b70d0fd2ec3106418b789c00b9b07fe4bf1e Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Fri, 3 Oct 2025 11:17:41 +0200 Subject: [PATCH 1/2] feat: create a utils to assert a folder exists --- .../modules/snapshot/snapshot.services.ts | 25 ++---------------- src/utils/fs.utils.ts | 26 +++++++++++++++++-- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/services/modules/snapshot/snapshot.services.ts b/src/services/modules/snapshot/snapshot.services.ts index 89cfc0b9..dbc600c8 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 {assertNonNullishValidFolder} 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 + assertNonNullishValidFolder(folder); const {snapshotId} = await loadSnapshotAndAssertOverwrite({canisterId, segment}); diff --git a/src/utils/fs.utils.ts b/src/utils/fs.utils.ts index 9a2af8e7..ec36f0bb 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 assertNonNullishValidFolder: ( + 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); + } +}; From 86e94f2f8bbfbda1f18ae51741faec0b6a047b3c Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Fri, 3 Oct 2025 11:18:12 +0200 Subject: [PATCH 2/2] refactor: rename --- src/services/modules/snapshot/snapshot.services.ts | 4 ++-- src/utils/fs.utils.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/modules/snapshot/snapshot.services.ts b/src/services/modules/snapshot/snapshot.services.ts index dbc600c8..e7409184 100644 --- a/src/services/modules/snapshot/snapshot.services.ts +++ b/src/services/modules/snapshot/snapshot.services.ts @@ -10,7 +10,7 @@ import { } from '../../../api/ic.api'; import type {AssetKey} from '../../../types/asset-key'; import {displaySegment} from '../../../utils/display.utils'; -import {assertNonNullishValidFolder} from '../../../utils/fs.utils'; +import {assertNonNullishFolderExists} from '../../../utils/fs.utils'; import {confirmAndExit} from '../../../utils/prompt.utils'; import { loadSnapshotAndAssertExist, @@ -129,7 +129,7 @@ export const uploadSnapshot = async ({ const canisterId = Principal.fromText(cId); const folder = nextArg({args, option: '--dir'}); - assertNonNullishValidFolder(folder); + assertNonNullishFolderExists(folder); const {snapshotId} = await loadSnapshotAndAssertOverwrite({canisterId, segment}); diff --git a/src/utils/fs.utils.ts b/src/utils/fs.utils.ts index ec36f0bb..b86f4f0a 100644 --- a/src/utils/fs.utils.ts +++ b/src/utils/fs.utils.ts @@ -49,7 +49,7 @@ export const readTemplateFile = async ({ return await readFile(join(__dirname, sourceFolder, template), 'utf-8'); }; -export const assertNonNullishValidFolder: ( +export const assertNonNullishFolderExists: ( folder?: string ) => asserts folder is NonNullable = (folder?: string): void => { if (isEmptyString(folder)) {