diff --git a/bun.lock b/bun.lock index 2acfa15d..5bc537ff 100644 --- a/bun.lock +++ b/bun.lock @@ -268,7 +268,7 @@ }, "packages/cli": { "name": "@wrnexus/cli", - "version": "0.8.10", + "version": "0.8.11", "bin": { "wrnexus": "src/index.ts", }, @@ -317,7 +317,7 @@ }, "packages/csr": { "name": "@wrnexus/csr", - "version": "0.8.8", + "version": "0.8.9", "dependencies": { "@wrnexus/core": "workspace:*", }, @@ -332,7 +332,7 @@ }, "packages/dev-server": { "name": "@wrnexus/dev-server", - "version": "0.8.9", + "version": "0.8.10", "dependencies": { "@wrnexus/authz": "workspace:*", "@wrnexus/cache": "workspace:*", diff --git a/packages/cli/package.json b/packages/cli/package.json index da7c2425..2ab2fa69 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.8.10", + "version": "0.8.11", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/csr/package.json b/packages/csr/package.json index 790b1ecd..1ed0f0a1 100644 --- a/packages/csr/package.json +++ b/packages/csr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/csr", - "version": "0.8.8", + "version": "0.8.9", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/csr/src/reactive-runtime.ts b/packages/csr/src/reactive-runtime.ts index c9104d87..cebe105d 100644 --- a/packages/csr/src/reactive-runtime.ts +++ b/packages/csr/src/reactive-runtime.ts @@ -224,12 +224,18 @@ export const REACTIVE_RUNTIME = String.raw` function warnMissingThemeTokens() { var referenced = Object.create(null); + var declared = Object.create(null); function collect(rules) { Array.prototype.forEach.call(rules || [], function (rule) { var cssText = rule.cssText || ""; var match; var pattern = /var\(\s*(--wire-[A-Za-z0-9_-]+)/g; while ((match = pattern.exec(cssText))) referenced[match[1]] = true; + if (rule.style) { + Array.prototype.forEach.call(rule.style, function (property) { + if (String(property).indexOf("--wire-") === 0) declared[property] = true; + }); + } try { if (rule.cssRules) collect(rule.cssRules); } catch (_) { @@ -240,9 +246,14 @@ export const REACTIVE_RUNTIME = String.raw` Array.prototype.forEach.call(document.styleSheets || [], function (sheet) { try { collect(sheet.cssRules); } catch (_) {} }); + Array.prototype.forEach.call(document.querySelectorAll("[style]") || [], function (element) { + Array.prototype.forEach.call(element.style || [], function (property) { + if (String(property).indexOf("--wire-") === 0) declared[property] = true; + }); + }); var rendered = window.getComputedStyle(document.documentElement); Object.keys(referenced).forEach(function (token) { - if (rendered.getPropertyValue(token).trim()) return; + if (declared[token] || rendered.getPropertyValue(token).trim()) return; warnOnce( "WRN-DEV-THEME-TOKEN-MISSING", "Theme token '" + token + "' is referenced by rendered CSS but is not defined.", diff --git a/packages/csr/test/reactive.test.ts b/packages/csr/test/reactive.test.ts index 260af81c..27b2519b 100644 --- a/packages/csr/test/reactive.test.ts +++ b/packages/csr/test/reactive.test.ts @@ -813,6 +813,39 @@ test("development runtime warns for referenced theme tokens absent from rendered expect(String(warnings[0]?.[0])).toContain("--wire-missing-test"); }); +test("development runtime accepts component-local and inline wire variables", () => { + const win = new Window() as unknown as Window & Record; + win.document.head.innerHTML = + ``; + win.document.body.innerHTML = + `
`; + (globalThis as Record).window = win; + (globalThis as Record).document = win.document; + (globalThis as Record).location = win.location; + (globalThis as Record).NodeFilter = ( + win as unknown as { NodeFilter: unknown } + ).NodeFilter; + (globalThis as Record).MutationObserver = ( + win as unknown as { MutationObserver: unknown } + ).MutationObserver; + (globalThis as Record).CustomEvent = ( + win as unknown as { CustomEvent: unknown } + ).CustomEvent; + const warnings: unknown[][] = []; + const originalWarn = console.warn; + console.warn = (...args: unknown[]) => warnings.push(args); + try { + (0, eval)(getReactiveRuntime(true)); + ( + win as unknown as { __wrnexusHydrateScopes?: (root: unknown) => void } + ).__wrnexusHydrateScopes?.(win.document); + } finally { + console.warn = originalWarn; + } + expect(warnings).toHaveLength(0); +}); + test("production runtime strips development diagnostics", () => { const production = getReactiveRuntime(); expect(production).not.toContain("WRN-DEV-"); diff --git a/packages/dev-server/package.json b/packages/dev-server/package.json index 1fd72185..37e3fd60 100644 --- a/packages/dev-server/package.json +++ b/packages/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.8.9", + "version": "0.8.10", "type": "module", "main": "src/index.ts", "exports": {