test: forbid implicit logger env
This commit is contained in:
@@ -4,10 +4,51 @@ import { join, relative } from "node:path";
|
|||||||
import { initLogger } from "@/utils/logging/initLogger.js";
|
import { initLogger } from "@/utils/logging/initLogger.js";
|
||||||
|
|
||||||
const makeEnv = (overrides: Partial<Env>): Env => overrides as Env;
|
const makeEnv = (overrides: Partial<Env>): Env => overrides as Env;
|
||||||
const forbiddenEnvFallbackPatterns = [
|
|
||||||
/\b\w+\s*:\s*Env\s*=/,
|
const sourceRoot = join(process.cwd(), "src");
|
||||||
/\benv\s*\?\s*:\s*Env\b/,
|
|
||||||
/\benv\s*\?\?\s*\(?\s*\{\}\s+as\s+Env\b/,
|
const forbiddenSourcePatterns = [
|
||||||
|
{
|
||||||
|
name: "Env parameter default",
|
||||||
|
pattern: /\benv\s*:\s*Env\s*=/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "optional Env parameter",
|
||||||
|
pattern: /\benv\?\s*:\s*Env\b/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty Env parameter fallback",
|
||||||
|
pattern: /\benv\s*=\s*\{\}\s+as\s+Env\b/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty Env nullish fallback",
|
||||||
|
pattern: /\benv\s*\?\?\s*\(?\s*\{\}\s+as\s+Env\b/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "initLogger empty Env",
|
||||||
|
pattern: /\binitLogger\(\s*\{\s*\}\s*,\s*\{\s*\}\s*\)/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "createLoggerStructure empty Env",
|
||||||
|
pattern: /\bcreateLoggerStructure\([^;]*,\s*\{\s*\}\s*\)/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "global logtail logger export",
|
||||||
|
pattern: /\bexport\s+const\s+logger\b/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "global logtail logger import",
|
||||||
|
pattern:
|
||||||
|
/import\s+\{[^}]*\blogger\b[^}]*\}\s+from\s+["'](?:@\/external\/logtail\/logtailUtils(?:\.js)?|[^"']*external\/logtail\/logtailUtils(?:\.js)?)["']/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "logger Env typed as Partial",
|
||||||
|
pattern: /\benv\s*:\s*Partial<Env>\b/,
|
||||||
|
files: new Set([
|
||||||
|
"src/utils/logging/initLogger.ts",
|
||||||
|
"src/external/logtail/logtailUtils.ts",
|
||||||
|
]),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const collectTypeScriptFiles = (dir: string): string[] =>
|
const collectTypeScriptFiles = (dir: string): string[] =>
|
||||||
@@ -18,6 +59,17 @@ const collectTypeScriptFiles = (dir: string): string[] =>
|
|||||||
return /\.(ts|tsx)$/.test(entry.name) ? [path] : [];
|
return /\.(ts|tsx)$/.test(entry.name) ? [path] : [];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const findForbiddenSourcePatterns = () =>
|
||||||
|
collectTypeScriptFiles(sourceRoot).flatMap((file) => {
|
||||||
|
const relativePath = relative(process.cwd(), file);
|
||||||
|
const contents = readFileSync(file, "utf8");
|
||||||
|
|
||||||
|
return forbiddenSourcePatterns
|
||||||
|
.filter((rule) => !rule.files || rule.files.has(relativePath))
|
||||||
|
.filter((rule) => rule.pattern.test(contents))
|
||||||
|
.map((rule) => `${relativePath}: ${rule.name}`);
|
||||||
|
});
|
||||||
|
|
||||||
describe("initLogger env configuration", () => {
|
describe("initLogger env configuration", () => {
|
||||||
const originalNodeEnv = process.env.NODE_ENV;
|
const originalNodeEnv = process.env.NODE_ENV;
|
||||||
|
|
||||||
@@ -43,17 +95,7 @@ describe("initLogger env configuration", () => {
|
|||||||
expect(logger.level).toBe("debug");
|
expect(logger.level).toBe("debug");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("does not allow Env parameters to be optional or define fallback defaults", () => {
|
test("does not allow default Env or global logtail logger usage", () => {
|
||||||
const sourceRoot = join(process.cwd(), "src");
|
expect(findForbiddenSourcePatterns()).toEqual([]);
|
||||||
const offenders = collectTypeScriptFiles(sourceRoot)
|
|
||||||
.filter((file) => {
|
|
||||||
const contents = readFileSync(file, "utf8");
|
|
||||||
return forbiddenEnvFallbackPatterns.some((pattern) =>
|
|
||||||
pattern.test(contents),
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.map((file) => relative(process.cwd(), file));
|
|
||||||
|
|
||||||
expect(offenders).toEqual([]);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user