core/predicates/construct.predicate.ts
core/predicates/construct.predicate.ts is a file in GovLab Quality. 53 lines of code and 7 definitions.
import { DATA_CONSTRUCTORS, FACTORY_PREFIXES } from "#configuration/constants/construct.constants";
import type { ConstructNode } from "#types/construct.types";
const isFn = function isFn(node: ConstructNode | null | undefined): boolean {
return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression";
};
const isFactoryCallName = function isFactoryCallName(name: string): boolean {
for (const prefix of FACTORY_PREFIXES) {
if (name.startsWith(prefix) && name.length > prefix.length) {
const next = name.charAt(prefix.length);
if (next >= "A" && next <= "Z") {
return true;
}
}
}
return false;
};
const isInstanceOrFactory = function isInstanceOrFactory(init: ConstructNode): boolean {
const { callee } = init;
if (callee?.type !== "Identifier" || typeof callee.name !== "string") {
return false;
}
if (init.type === "NewExpression") {
return !DATA_CONSTRUCTORS.has(callee.name);
}
return isFactoryCallName(callee.name);
};
export const isConstructInit = function isConstructInit(init: ConstructNode | null | undefined): boolean {
if (!init) {
return false;
}
if (isFn(init)) {
return true;
}
if (init.type === "ObjectExpression") {
return (init.properties ?? []).some(
(prop) => prop.type === "Property" && (prop.method === true || isFn(prop.value)),
);
}
if (init.type === "CallExpression" || init.type === "NewExpression") {
return isInstanceOrFactory(init);
}
return false;
};
export const isDefaultConstruct = function isDefaultConstruct(declaration?: ConstructNode | null): boolean {
if (!declaration) {
return false;
}
return (
declaration.type === "FunctionDeclaration" ||
declaration.type === "ClassDeclaration" ||
isConstructInit(declaration)
);
};