All files / if-merge/util args.ts

100% Statements 38/38
100% Branches 6/6
100% Functions 2/2
100% Lines 37/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 731x 1x   1x 1x 1x   1x       1x   1x 1x 1x 1x         1x 7x 7x   2x 1x   1x     1x             1x 7x   5x   5x 2x 2x 1x     1x     3x 5x 5x 5x   5x 1x     4x 1x     3x 3x       1x    
import {parse} from 'ts-command-line-args';
import {ERRORS} from '@grnsft/if-core/utils';
 
import {isFileExists, isDirectoryExists} from '../../common/util/fs';
import {prependFullFilePath, runHelpCommand} from '../../common/util/helpers';
import {checkIfFileIsYaml} from '../../common/util/yaml';
 
import {STRINGS as COMMON_STRINGS} from '../../common/config';
 
import {IFMergeArgs} from '../types/process-args';
 
import {CONFIG, STRINGS} from '../config';
 
const {ParseCliParamsError, InvalidDirectoryError, CliSourceFileError} = ERRORS;
const {ARGS, HELP} = CONFIG;
const {MANIFEST_IS_NOT_YAML} = STRINGS;
const {MANIFEST_NOT_FOUND, DIRECTORY_NOT_FOUND} = COMMON_STRINGS;
 
/**
 * Parses `if-merge` process arguments.
 */
const validateAndParseIfMergeArgs = () => {
  try {
    return parse<IFMergeArgs>(ARGS, HELP);
  } catch (error) {
    if (error instanceof Error) {
      console.log(error.message);
 
      runHelpCommand('if-merge');
    }
 
    throw error;
  }
};
 
/**
 * Checks if the `manifests` command is provided and they are valid manifests files or a folder.
 */
export const parseIfMergeArgs = async () => {
  const {manifests, output, name, description} = validateAndParseIfMergeArgs();
 
  const manifestsWithFullPath = [];
 
  if (manifests.length === 1) {
    const isDirectory = await isDirectoryExists(manifests[0]);
    if (!isDirectory) {
      throw new InvalidDirectoryError(DIRECTORY_NOT_FOUND);
    }
 
    return {manifests, output, name, description};
  }
 
  for await (const manifest of manifests) {
    const response = prependFullFilePath(manifest);
    const isManifestFileExists = await isFileExists(response);
    const isYamlFile = checkIfFileIsYaml(response);
 
    if (!isManifestFileExists) {
      throw new ParseCliParamsError(`${manifest} ${MANIFEST_NOT_FOUND}`);
    }
 
    if (!isYamlFile) {
      throw new CliSourceFileError(MANIFEST_IS_NOT_YAML(manifest));
    }
 
    if (checkIfFileIsYaml(manifest)) {
      manifestsWithFullPath.push(response);
    }
  }
 
  return {manifests: manifestsWithFullPath, output, name, description};
};