declapract
Version:
A tool to declaratively define best practices, maintainable evolve them, and scalably enforce them.
95 lines (94 loc) • 3.43 kB
TypeScript
import { DomainObject } from 'domain-objects';
import Joi from 'joi';
import { FileCheckContext } from './FileCheckContext';
import { ProjectCheckContext } from './ProjectCheckContext';
export declare enum FileCheckPurpose {
BAD_PRACTICE = "BAD_PRACTICE",
BEST_PRACTICE = "BEST_PRACTICE"
}
export declare enum FileCheckType {
/**
* simply checks that the file exists, without considering contents
*/
EXISTS = "EXISTS",
/**
* checks that the file contents equal the declared contents
*
* e.g., `expect(foundContents).toEqual(declaredContents)`
*
* (default when file contents are declared)
*/
EQUALS = "EQUALS",
/**
* check that the file contents contain the declared contents
*
* e.g., `expect(foundContents).toContain(declaredContents)`
*/
CONTAINS = "CONTAINS",
/**
* check that the file contents satisfy a custom check function
*
* (default when the `.declapract.ts` file exports a `check` function)
*/
CUSTOM = "CUSTOM"
}
export declare const isOfFileCheckType: import("type-fns").AssessWithAssure<string | number | symbol, FileCheckType>;
/**
* a file check function is used to evaluate whether a file fails or passes a declaration
*
* a file check function either:
* - returns successfully
* - throws an error with the message containing the reason that the check failed
*
* for example
* ```ts
* export const check = (contents: string | null) => expect(contents).toEqual(bestPracticeContents);
* ```
*/
export type FileCheckFunction = (contents: string | null, context: FileCheckContext) => Promise<void> | void;
/**
* a file fix function is used to automatically fix files that fail your declared practices
*
* a file fix function can declare:
* - what the "fixed" file contents would be (including `null` to delete the file)
* - what the "fixed" relative file path would be
* - a combination of the above
*
* _note: it is **critical** that this function runs without mutating anything, as this function is run when planning even before the user requests to apply it. it should only declare **what** the final state would be, not actually do anything_
*/
export type FileFixFunction = (contents: string | null, context: FileCheckContext) => {
relativeFilePath?: string;
contents?: string | null;
} | Promise<{
relativeFilePath?: string;
contents?: string | null;
}>;
/**
* a file contents function is used to dynamically define the best practice contents based on the context of the project
*
* for example
* ```ts
* export const contents: FileContentsFunction = (context) => {
* if (context.projectPractices.includes('terraform')) return X
* else return Y
* }
* ```
*/
export type FileContentsFunction = (context: ProjectCheckContext) => Promise<string> | string;
/**
* a file check declaration is an object that defines how to check whether a file meets the declared criteria
*
* specifies which file and what to check for
*/
export interface FileCheckDeclaration {
pathGlob: string;
purpose: FileCheckPurpose;
type: FileCheckType;
required: boolean;
check: FileCheckFunction;
fix: FileFixFunction | null;
contents: FileContentsFunction | null;
}
export declare class FileCheckDeclaration extends DomainObject<FileCheckDeclaration> implements FileCheckDeclaration {
static schema: Joi.ObjectSchema<any>;
}