Files
2026-05-27 23:47:53 +01:00

70 lines
2.8 KiB
TypeScript

/**
* Tree-shake smoke test.
*
* Verifies that each sub-module can be imported in isolation without pulling
* in unrelated code. This acts as a proxy for correct `sideEffects: false`
* behaviour and clean ESM boundaries.
*/
import { describe, expect, it } from "@suaveplan/testing/runner";
describe("tree-shake isolation", () => {
it("can import only escape utils", { timeout: 30000 }, async () => {
const mod = await import("../src/utils/escape.js");
expect(typeof mod.escapeRegex).toBe("function");
expect(typeof mod.isEscaped).toBe("function");
expect(typeof mod.unescapeTemplate).toBe("function");
});
it("can import only format utils", { timeout: 30000 }, async () => {
const mod = await import("../src/utils/format.js");
expect(typeof mod.pad).toBe("function");
expect(typeof mod.formatDate).toBe("function");
expect(typeof mod.generateUuid).toBe("function");
expect(typeof mod.generateNanoid).toBe("function");
});
it("can import only nested-value utils", { timeout: 30000 }, async () => {
const mod = await import("../src/utils/nested-value.js");
expect(typeof mod.getNestedValue).toBe("function");
expect(typeof mod.hasNestedPath).toBe("function");
expect(typeof mod.setNestedValue).toBe("function");
});
it("can import ParseState without TemplateEngine", {
timeout: 30000,
}, async () => {
const mod = await import("../src/engine/ParseState.js");
expect(typeof mod.createParseState).toBe("function");
expect(typeof mod.cloneParseState).toBe("function");
});
it("can import a single plugin without loading all others", {
timeout: 30000,
}, async () => {
const mod = await import(
"../src/plugins/variables/DotNotationPlugin.js"
);
expect(typeof mod.createDotNotationPlugin).toBe("function");
});
it("can import schemas in isolation", { timeout: 30000 }, async () => {
const mod = await import("../src/schemas/templates.schemas.js");
expect(mod.TemplateEngineOptionsSchema).toBeDefined();
expect(mod.ParseOptionsSchema).toBeDefined();
expect(mod.PluginPrioritySchema).toBeDefined();
});
it("minimalPreset does not import dynamic plugins", {
timeout: 30000,
}, async () => {
// If minimalPreset somehow pulled in DateTimePlugin the import would
// still succeed, but this test documents the intended isolation.
const { minimalPreset } = await import("../src/presets/minimal.js");
const preset = minimalPreset();
expect(preset.plugins.map((p) => p.name)).toEqual(
expect.arrayContaining(["array-index", "dot-notation"])
);
expect(preset.plugins).toHaveLength(2);
});
});