diff --git a/src/html/styles-builder/css-provider-session.test.ts b/src/html/styles-builder/css-provider-session.test.ts index 95bf131258..27e2614b6b 100644 --- a/src/html/styles-builder/css-provider-session.test.ts +++ b/src/html/styles-builder/css-provider-session.test.ts @@ -208,12 +208,15 @@ describe("styles-builder CSS provider sessions", () => { assertEquals(generated.css, "missing-optimizer|sheet|alpha"); }); - it("reports a missing optimizer once, with the package that provides one", () => { + it("reports a missing optimizer once, with the steps that actually enable one", () => { // `regenerateCSSByHash` acquires a session per request, so warning on every // acquisition made this line the most frequent entry in a hosted project's - // logs -- once per render, at warn level, naming a registration hook with no - // documented way to act on it. State the package that registers an engine, - // and say it once while the engine stays absent. + // logs -- once per render, at warn level. Say it once while the engine stays + // absent, and give the whole recipe: `@veryfront/ext-css-lightning` declares + // `activation: "explicit"`, so installing the package registers nothing on + // its own. Only a `veryfront.config.ts` `extensions` entry activates it, and + // advice that stops at the install leaves the developer with unminified CSS + // and no next step. installProcessor(createProcessor("warn-rearm")); register(CSSOptimizationEngineName, createOptimizer("warn-rearm")); // Observing an engine re-arms the warning, so this test does not depend on @@ -236,10 +239,19 @@ describe("styles-builder CSS provider sessions", () => { __resetLogRecordEmitterForTests(); } - const reports = records.filter((entry) => entry.message.includes("CSSOptimizationEngine")); + const reports = records.filter((entry) => entry.message.includes("unminified CSS")); assertEquals(reports.length, 1); + const report = reports[0]?.message ?? ""; assertEquals(reports[0]?.level, "warn"); - assertEquals(reports[0]?.message.includes("@veryfront/ext-css-lightning"), true); + assertEquals(report.includes("@veryfront/ext-css-lightning"), true); + assertEquals(report.includes("veryfront.config.ts"), true); + assertEquals(report.includes("extensions"), true); + // `deno add` is wrong twice over: scaffolded projects are npm projects, and + // no package manager can activate an explicit-activation extension. + assertEquals(report.includes("deno add"), false); + // The contract name is an internal registration hook the guides never + // mention, so it cannot appear as the developer-facing instruction. + assertEquals(report.includes("CSSOptimizationEngine"), false); }); it("keeps minified and unminified output in separate cache identities", async () => { diff --git a/src/html/styles-builder/tailwind-compiler.ts b/src/html/styles-builder/tailwind-compiler.ts index 3964895a73..c57c7025f1 100644 --- a/src/html/styles-builder/tailwind-compiler.ts +++ b/src/html/styles-builder/tailwind-compiler.ts @@ -149,14 +149,24 @@ export function acquireCSSGenerationSession(minify: boolean): CSSGenerationSessi // // Once per process, not once per acquisition: regenerateCSSByHash acquires // a session on every cold-cache request, which made this the single most - // frequent line in a hosted project's logs. Name the package that registers - // an engine, or the message asks for a hook with no way to reach it. + // frequent line in a hosted project's logs. + // + // State the effect and the whole remedy. An earlier revision borrowed + // `resolve()`'s "install it with: deno add " hint, which is only + // true for an auto-activating extension: `@veryfront/ext-css-lightning` + // declares `activation: "explicit"`, so installing it registers nothing + // until a `veryfront.config.ts` `extensions` entry activates it, and + // scaffolded projects are npm projects where `deno add` is the wrong + // command besides. Advice that stops at the install reads as actionable and + // leaves the CSS exactly as unminified as before. The contract name stays + // out of the instruction: it is an internal registration hook the guides + // never mention, and `component=css-compiler` already identifies the source. reportedMissingOptimizationEngine = true; const recommendation = getRecommendation(CSSOptimizationEngineName); logger.warn( recommendation === undefined - ? "No CSSOptimizationEngine registered; emitting unminified CSS" - : `No CSSOptimizationEngine registered; emitting unminified CSS. Install one with: deno add ${recommendation}`, + ? "Veryfront emits unminified CSS because no CSS optimizer is active" + : `Veryfront emits unminified CSS because no CSS optimizer is active. Install ${recommendation}, then add it to "extensions" in veryfront.config.ts`, ); } const optimizationEngine = optimizationProvider === undefined