Description
Even when installLitAdapter() is called and logs "Lit SSR adapter installed", renderDSD() cannot see the adapter. All Lit components produce the error:
<!-- LessJS ERROR: <about-page> render() returned object, expected string.
This looks like a Lit TemplateResult — install @lessjs/adapter-lit to handle it. -->
Root Cause
@lessjs/adapter-lit/ssr.ts calls registerAdapter() which writes to a module-scope variable _globalAdapter (from @lessjs/core/render-dsd or @lessjs/core/less-runtime).
When Vite's module resolution resolves @lessjs/adapter-lit and @lessjs/core to different module instances (e.g. via resolveAlias, symlinks, or incomplete ssr.noExternal), registerAdapter() writes to copy A's _globalAdapter, while renderDSD() reads from copy B's _globalAdapter — the adapter is never seen.
Specific Trigger Conditions
build-metadata.json has resolveAlias pointing @lessjs/adapter-lit and @lessjs/core to local src-tmp/packages/ source files
ssr.noExternal list is incomplete, causing some packages to be externalized
- Windows +
preserveSymlinks: true + JSR node_modules structure creates multiple resolution paths
Suggested Fix
Use globalThis or Symbol.for() as a cross-module-instance bridge for adapter registration, instead of relying on module-scope variable sharing.
Severity
P0 — Projects using resolveAlias (e.g. local development of @lessjs/ui) cannot do SSG rendering at all.
Description
Even when
installLitAdapter()is called and logs "Lit SSR adapter installed",renderDSD()cannot see the adapter. All Lit components produce the error:Root Cause
@lessjs/adapter-lit/ssr.tscallsregisterAdapter()which writes to a module-scope variable_globalAdapter(from@lessjs/core/render-dsdor@lessjs/core/less-runtime).When Vite's module resolution resolves
@lessjs/adapter-litand@lessjs/coreto different module instances (e.g. viaresolveAlias, symlinks, or incompletessr.noExternal),registerAdapter()writes to copy A's_globalAdapter, whilerenderDSD()reads from copy B's_globalAdapter— the adapter is never seen.Specific Trigger Conditions
build-metadata.jsonhasresolveAliaspointing@lessjs/adapter-litand@lessjs/coreto localsrc-tmp/packages/source filesssr.noExternallist is incomplete, causing some packages to be externalizedpreserveSymlinks: true+ JSRnode_modulesstructure creates multiple resolution pathsSuggested Fix
Use
globalThisorSymbol.for()as a cross-module-instance bridge for adapter registration, instead of relying on module-scope variable sharing.Severity
P0 — Projects using
resolveAlias(e.g. local development of@lessjs/ui) cannot do SSG rendering at all.