UNPKG

declapract

Version:

A tool to declaratively define best practices, maintainable evolve them, and scalably enforce them.

108 lines 6.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFileCheckDeclaration = void 0; const domain_1 = require("../../../../../domain"); const doesFileExist_1 = require("../../../../../utils/fileio/doesFileExist"); const readFileAsync_1 = require("../../../../../utils/fileio/readFileAsync"); const UnexpectedCodePathError_1 = require("../../../../UnexpectedCodePathError"); const compile_1 = require("../../../../commands/compile"); const containsCheck_1 = require("./checkMethods/containsCheck"); const existsCheck_1 = require("./checkMethods/existsCheck"); const strictEqualsCheck_1 = require("./checkMethods/strictEqualsCheck"); const fixContainsJSONByReplacingAndAddingKeyValues_1 = require("./fixMethods/fixContainsJSONByReplacingAndAddingKeyValues"); const fixContainsWhenFileDoesntExistBySettingDeclaredContents_1 = require("./fixMethods/fixContainsWhenFileDoesntExistBySettingDeclaredContents"); const fixEqualsBySettingDeclaredContents_1 = require("./fixMethods/fixEqualsBySettingDeclaredContents"); const getHydratedCheckInputsForFile_1 = require("./getHydratedCheckInputsForFile"); const getFileCheckDeclaration = async ({ purpose, declaredProjectDirectory, declaredFileCorePath, }) => { // get check inputs, if declared const { declaredCheckInputs, declaredFixFunction, declaredContentsFunction } = await (0, getHydratedCheckInputsForFile_1.getHydratedCheckInputsForFile)({ declaredFileCorePath, declaredProjectDirectory, }); // get declared best practice contents, if declared const contentsFilePath = `${declaredProjectDirectory}/${declaredFileCorePath}`; // its the same path. i.e., the contents for `tsconfig.ts` are declared under `tsconfig.ts`) const contentsFileExists = await (0, doesFileExist_1.doesFileExist)({ filePath: contentsFilePath, }); const declaredContents = await (async () => { if (declaredContentsFunction) return declaredContentsFunction; if (contentsFileExists) return () => (0, readFileAsync_1.readFileAsync)({ filePath: contentsFilePath }); return null; })(); // define the common attributes const pathGlob = (0, compile_1.deserializeGlobPathFromNpmPackaging)(declaredFileCorePath); // its the path relative to the project root (note that this path can is technically a glob (e.g., can be `src/**/*.ts`)) const required = !declaredCheckInputs?.optional; // if not explicitly opted-in to be optional, then its required // define the check fns // define the fix fns const strictEqualsFix = purpose === domain_1.FileCheckPurpose.BEST_PRACTICE ? fixEqualsBySettingDeclaredContents_1.fixEqualsBySettingDeclaredContents : null; // TODO: think of a fix for bad practice case const containsFix = (() => { if (!declaredContents) return null; // contains fixes can only be defined when declared contents are defined (side note: we shouldn't be needing a contains fix otherwise, since contains type only occurs if there is a file) if (purpose === domain_1.FileCheckPurpose.BEST_PRACTICE) { if (pathGlob.endsWith('.json')) return fixContainsJSONByReplacingAndAddingKeyValues_1.fixContainsJSONByReplacingAndAddingKeyValues; return fixContainsWhenFileDoesntExistBySettingDeclaredContents_1.fixContainsWhenFileDoesntExistBySettingDeclaredContents; } return null; // otherwise, no fix })(); const existsFix = purpose === domain_1.FileCheckPurpose.BAD_PRACTICE ? () => ({ contents: null }) // to fix it for BAD_PRACTICE, just make the file not exist : null; // define what check type it is, based on the inputs + defaults const type = (() => { // if no input file, then default to equals check if (!declaredCheckInputs) { if (!declaredContents) throw new UnexpectedCodePathError_1.UnexpectedCodePathError('no hydrated input but also no contents. why are we even evaluating this file then?'); return domain_1.FileCheckType.EQUALS; // default to "equals"; } // if a custom check fn was defined, then check type = custom if (declaredCheckInputs.function) return domain_1.FileCheckType.CUSTOM; // if user specified a type, use it if (declaredCheckInputs.type) return declaredCheckInputs.type; // since user did not specify a type, see if we can default to equals if (declaredContents) return domain_1.FileCheckType.EQUALS; // otherwise, default to an existence check return domain_1.FileCheckType.EXISTS; })(); // define the check and fix based on the type const checkForType = (() => { if (type === domain_1.FileCheckType.EQUALS) return strictEqualsCheck_1.strictEqualsCheck; if (type === domain_1.FileCheckType.CUSTOM) return declaredCheckInputs.function; if (type === domain_1.FileCheckType.CONTAINS) return containsCheck_1.containsCheck; if (type === domain_1.FileCheckType.EXISTS) return existsCheck_1.existsCheck; throw new UnexpectedCodePathError_1.UnexpectedCodePathError('should have a check for each type defined'); })(); const fixForType = (() => { if (type === domain_1.FileCheckType.EQUALS) return strictEqualsFix; if (type === domain_1.FileCheckType.CONTAINS) return containsFix; if (type === domain_1.FileCheckType.EXISTS) return existsFix; return null; })(); // return the check based on what we've found for it return new domain_1.FileCheckDeclaration({ pathGlob, required, purpose, type, check: checkForType, fix: declaredFixFunction ?? fixForType, contents: declaredContents, }); }; exports.getFileCheckDeclaration = getFileCheckDeclaration; //# sourceMappingURL=getFileCheckDeclaration.js.map