@saiforceone/dirt-cli
Version:
Official CLI Utility for the D.I.R.T stack
134 lines (120 loc) • 3.82 kB
text/typescript
/**
* @description Advanced command execution for the D.I.R.T CLI
*/
// imports for dirt check / checkDirt
import { existsSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { platform } from 'node:os';
import path from 'node:path';
import DIRTProjectConfig = DIRTStackCLI.DIRTProjectConfig;
import DIRTCheckResponse = DIRTStackCLI.DIRTCheckResponse;
import {
DIRT_PROJECT_FOLDER_NAME,
DIRT_PROJECT_CONFIG_FILE_NAME,
} from './constants/feConstants.js';
import ConsoleLogger from './utils/ConsoleLogger.js';
import { normalizeWinFilePath } from './utils/fileUtils.js';
/**
* // todo: extract this function
* @function cliInfo
* @description Helper function that prints out CLI version and other details
*/
export async function cliInfo(): Promise<void> {
const currentFileUrl = import.meta.url;
let packagePath = path.resolve(
path.normalize(new URL(currentFileUrl).pathname),
'../../package.json'
);
if (platform() === 'win32') {
packagePath = normalizeWinFilePath(packagePath);
}
// get the file and read it
try {
const _packageData = await readFile(packagePath, {
encoding: 'utf-8',
});
const packageData = JSON.parse(_packageData);
ConsoleLogger.printMessage(
`D.I.R.T Stack CLI Version: ${packageData['version']}`
);
} catch (e) {
ConsoleLogger.printMessage(
`Failed to read CLI info with error: ${(e as Error).message}`,
'error'
);
}
}
// check if we are in a DIRT project
// todo: extract this function
/**
* @function checkDirt
* @description Helper function that runs to ensure that the command is being
* run from a dirt project folder. This might be overkill...or not.
* @returns boolean
*/
export async function checkDirt(): Promise<DIRTCheckResponse> {
// get the current dir
const currentDir = process.cwd();
// check for the files and folders
const dirtSettingsFile = path.join(
currentDir,
DIRT_PROJECT_FOLDER_NAME,
DIRT_PROJECT_CONFIG_FILE_NAME
);
if (!existsSync(dirtSettingsFile)) return { success: false };
try {
const fileContents = await readFile(dirtSettingsFile, {
encoding: 'utf-8',
});
const configData = JSON.parse(fileContents) as DIRTProjectConfig;
// frontend check
if (!['react', 'vue'].includes(configData.projectConfig.frontend)) {
ConsoleLogger.printMessage(
'Invalid frontend option in config file',
'error'
);
return { success: false };
}
// database option check
if (
!['None', 'sqlite', 'mysql', 'postgresql'].includes(
configData.projectConfig.databaseOption
)
) {
ConsoleLogger.printMessage(
'Invalid database option in config file',
'error'
);
return { success: false };
}
return {
success: true,
frontendOption: configData.projectConfig.frontend,
};
} catch (e) {
ConsoleLogger.printMessage(
`Failed to read settings file with error: ${(e as Error).message}`,
'error'
);
return { success: false };
}
}
/**
* @function advCli
* @description Advanced CLI command runner. An example of advanced command
* execution would look like npx create-dirt-stack --exec <command name>
* where <command name> could be something like "create-app contact_list"
* @param {Array<string>} args
*/
export async function advCli(args: Array<string>) {
ConsoleLogger.printMessage('Checking CLI project...');
const isValidProject = await checkDirt();
ConsoleLogger.printMessage(
isValidProject
? 'Looks like this is a valid dirt cli project'
: 'This does not seem to be a valid dirt cli project',
isValidProject ? 'success' : 'error'
);
if (!isValidProject) return;
ConsoleLogger.printMessage(`Command and args: ${args}`);
}