eslint-plugin-project-structure
Version:
Powerful ESLint plugin with rules to help you achieve a scalable, consistent, and well-structured project. Create your own framework! Define your folder structure, file composition, advanced naming conventions, and create independent modules. Take your pr
153 lines (142 loc) • 5.02 kB
TypeScript
import * as _typescript_eslint_utils_dist_ts_eslint from '@typescript-eslint/utils/dist/ts-eslint';
type RegexParameters = Record<string, string>;
type Pattern = string | (string | string[])[];
type ImportPattern = string | string[];
interface Module {
name: string;
pattern: Pattern;
errorMessage?: string;
allowImportsFrom: ImportPattern[];
allowExternalImports?: boolean;
}
type Paths = Record<string, string[]>;
interface PathAliases {
baseUrl: string;
paths: Paths;
}
interface IndependentModulesConfig {
tsconfigPath?: string;
pathAliases?: PathAliases;
extensions?: string[];
reusableImportPatterns?: Record<string, ImportPattern[]>;
modules: Module[];
debugMode?: boolean;
packageRoot?: string;
}
type SelectorType = "class" | "variable" | "variableExpression" | "propertyDefinition" | "function" | "arrowFunction" | "type" | "interface" | "enum";
interface VariableExpression {
type: "variableExpression";
limitTo: string | string[];
}
type Selector = SelectorType | VariableExpression;
type ScopeAll = "fileExport" | "fileRoot" | "nestedSelectors" | "file";
interface PositionIndex {
index: number;
sorting?: "az" | "none";
}
interface Rule$1 {
selector: Selector | Selector[];
scope?: ScopeAll | ScopeAll[];
positionIndex?: number | PositionIndex;
filenamePartsToRemove?: string | string[];
format?: string[] | string;
}
type CustomErrors = Partial<Record<SelectorType, string>>;
interface RootSelectorLimit {
selector: SelectorType | SelectorType[];
limit: number | {
max?: number;
min?: number;
};
}
interface AllowOnlySpecifiedSelectors {
error?: CustomErrors;
fileRoot?: boolean | CustomErrors;
fileExport?: boolean | CustomErrors;
nestedSelectors?: boolean | CustomErrors;
}
interface FileRules {
filePattern: Pattern;
allowOnlySpecifiedSelectors?: AllowOnlySpecifiedSelectors | boolean;
rootSelectorsLimits?: RootSelectorLimit[];
rules?: Rule$1[];
}
interface FileCompositionConfig {
projectRoot?: string;
regexParameters?: RegexParameters;
filesRules: FileRules[];
}
interface Rule<T extends string = string> {
ruleId?: T;
name?: string;
enforceExistence?: string[] | string;
children?: Rule<T>[];
}
interface FolderRecursionRule<T extends string = string> extends Rule<T> {
folderRecursionLimit?: number;
}
interface LongPathsInfo {
maxLength?: number;
root?: string;
countFromSystemRoot?: boolean;
mode: "warn" | "error";
}
interface FolderStructureConfig<T extends string = string> {
ignorePatterns?: Pattern;
longPathsInfo?: LongPathsInfo | false;
structureRoot?: string;
projectRoot?: string;
structure: Rule<T> | Rule<T>[];
rules?: Record<T, FolderRecursionRule<T>>;
regexParameters?: RegexParameters;
}
interface ParserReturn {
ast: {
type: string;
start: number;
end: number;
loc: {
start: {
line: number;
column: number;
};
end: {
line: number;
column: number;
};
};
tokens: never[];
comments: never[];
range: number[];
sourceType: string;
body: never[];
};
scopeManager: null;
visitorKeys: null;
}
interface ParserProps {
meta: {
name: string;
};
parseForESLint: () => ParserReturn;
}
declare const parser: ParserProps;
declare const createIndependentModules: (config: IndependentModulesConfig) => IndependentModulesConfig;
declare const createFolderStructure: <R extends Record<string, FolderRecursionRule<keyof R & string>>>(config: {
longPathsInfo?: LongPathsInfo | false;
structureRoot?: string;
projectRoot?: string;
structure: Rule<keyof R & string> | Rule<keyof R & string>[];
rules?: R;
ignorePatterns?: Pattern;
regexParameters?: RegexParameters;
}) => FolderStructureConfig<keyof R & string>;
declare const createFileComposition: (config: FileCompositionConfig) => FileCompositionConfig;
declare const projectStructurePlugin: {
rules: {
"folder-structure": _typescript_eslint_utils_dist_ts_eslint.RuleModule<"error", [FolderStructureConfig<string>] | [], unknown, _typescript_eslint_utils_dist_ts_eslint.RuleListener>;
"file-composition": _typescript_eslint_utils_dist_ts_eslint.RuleModule<"invalidName" | "invalidPosition" | "prohibitedSelectorRoot" | "prohibitedSelectorNested" | "prohibitedSelectorExport" | "rootSelectorsLimits", [] | [FileCompositionConfig], unknown, _typescript_eslint_utils_dist_ts_eslint.RuleListener>;
"independent-modules": _typescript_eslint_utils_dist_ts_eslint.RuleModule<"error", [] | [IndependentModulesConfig], unknown, _typescript_eslint_utils_dist_ts_eslint.RuleListener>;
};
};
export { createFileComposition, createFolderStructure, createIndependentModules, parser as projectStructureParser, projectStructurePlugin };