From 7ba7c8a73f4341466cb93135f3ea315b356995c4 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Wed, 12 Aug 2026 19:13:28 +0530 Subject: [PATCH] fix: ignore WRN component examples in import validation --- bun.lock | 4 ++-- packages/cli/package.json | 2 +- packages/dev-server/package.json | 2 +- packages/dev-server/src/pipeline.ts | 22 +++++++++++++++---- .../dev-server/test/import-modes-v060.test.ts | 11 ++++++++++ 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 2b7520b8..71af0dad 100644 --- a/bun.lock +++ b/bun.lock @@ -268,7 +268,7 @@ }, "packages/cli": { "name": "@wrnexus/cli", - "version": "0.8.18", + "version": "0.8.19", "bin": { "wrnexus": "src/index.ts", }, @@ -332,7 +332,7 @@ }, "packages/dev-server": { "name": "@wrnexus/dev-server", - "version": "0.8.17", + "version": "0.8.18", "dependencies": { "@wrnexus/authz": "workspace:*", "@wrnexus/cache": "workspace:*", diff --git a/packages/cli/package.json b/packages/cli/package.json index e9747a99..3fa4355e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.8.18", + "version": "0.8.19", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/dev-server/package.json b/packages/dev-server/package.json index 1a8f5ac4..53bbc8af 100644 --- a/packages/dev-server/package.json +++ b/packages/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.8.17", + "version": "0.8.18", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/dev-server/src/pipeline.ts b/packages/dev-server/src/pipeline.ts index 9fc75754..795488ef 100644 --- a/packages/dev-server/src/pipeline.ts +++ b/packages/dev-server/src/pipeline.ts @@ -21,6 +21,7 @@ import { generateTargets, resolveWrnImports, type PageAst, + type ViewNode, } from "@wrnexus/compiler"; import type { Context, Middleware } from "@wrnexus/core"; @@ -342,14 +343,27 @@ function importedValueBindings(ast: PageAst): Set { return names; } -function validateConfiguredImports(source: string, ast: PageAst, file: string): void { +function viewComponentNames(nodes: ViewNode[], names = new Set()): Set { + for (const node of nodes) { + if (node.type === "element") { + if (/^[A-Z]/.test(node.tag)) names.add(node.tag); + viewComponentNames(node.children, names); + } else if (node.type === "each") { + viewComponentNames(node.body, names); + viewComponentNames(node.empty, names); + } else if (node.type === "if") { + for (const branch of node.branches) viewComponentNames(branch.body, names); + } + } + return names; +} + +function validateConfiguredImports(_source: string, ast: PageAst, file: string): void { const root = projectRootForFile(file); const options = compileImportOptions.get(resolve(root)); if (!options || options.mode === "legacy") return; const imported = importedValueBindings(ast); - const usedComponents = new Set( - Array.from(source.matchAll(/<([A-Z][A-Za-z0-9_$]*)\b/g), (match) => match[1]!), - ); + const usedComponents = viewComponentNames(ast.view); const compilerBuiltins = new Set([ "Async", "Component", diff --git a/packages/dev-server/test/import-modes-v060.test.ts b/packages/dev-server/test/import-modes-v060.test.ts index 8079a08c..21b203a0 100644 --- a/packages/dev-server/test/import-modes-v060.test.ts +++ b/packages/dev-server/test/import-modes-v060.test.ts @@ -70,3 +70,14 @@ test("compiler-native reactive elements do not require application imports", () setCompileImportOptions(root, { mode: "explicit" }); expect(() => compileWrnArtifacts(page, 5)).not.toThrow(); }); + +test("component examples in comments do not require imports", () => { + const { root, page } = fixture(); + writeFileSync( + page, + `// Usage: +page Home { view {
Home
} }`, + ); + setCompileImportOptions(root, { mode: "explicit" }); + expect(() => compileWrnArtifacts(page, 6)).not.toThrow(); +});