From ffe2f83c8ecec7a408512280c8c7188ce4febaf2 Mon Sep 17 00:00:00 2001 From: avivkeller Date: Sun, 20 Jul 2025 16:46:00 -0400 Subject: [PATCH 1/2] fix(win): include drive letter --- src/generators/web/constants.mjs | 21 ++++++--------------- src/generators/web/utils/generate.mjs | 7 +++++-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/generators/web/constants.mjs b/src/generators/web/constants.mjs index 53eff0d7..c82294fb 100644 --- a/src/generators/web/constants.mjs +++ b/src/generators/web/constants.mjs @@ -1,16 +1,7 @@ -import { parse, relative, sep, dirname } from 'node:path'; -import { resolve } from 'node:path/posix'; +import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; -// Convert the current module's URL to a filesystem path, -// then calculate the relative path from the system root directory -// to this file. This relative path uses platform-specific separators, -// so replace them with forward slashes ("/") for consistency and web compatibility. -// Finally, prepend a leading slash to form an absolute root-relative path string. -// -// This produces a POSIX-style absolute path, even on Windows systems. -const dir = dirname(fileURLToPath(import.meta.url)); -export const ROOT = '/' + relative(parse(dir).root, dir).replaceAll(sep, '/'); +export const ROOT = dirname(fileURLToPath(import.meta.url)); /** * @typedef {Object} JSXImportConfig @@ -26,19 +17,19 @@ export const ROOT = '/' + relative(parse(dir).root, dir).replaceAll(sep, '/'); export const JSX_IMPORTS = { NavBar: { name: 'NavBar', - source: resolve(ROOT, './ui/components/NavBar'), + source: resolve(ROOT, './ui/components/NavBar').replaceAll('\\', '\\\\'), }, SideBar: { name: 'SideBar', - source: resolve(ROOT, './ui/components/SideBar'), + source: resolve(ROOT, './ui/components/SideBar').replaceAll('\\', '\\\\'), }, MetaBar: { name: 'MetaBar', - source: resolve(ROOT, './ui/components/MetaBar'), + source: resolve(ROOT, './ui/components/MetaBar').replaceAll('\\', '\\\\'), }, CodeBox: { name: 'CodeBox', - source: resolve(ROOT, './ui/components/CodeBox'), + source: resolve(ROOT, './ui/components/CodeBox').replaceAll('\\', '\\\\'), }, CodeTabs: { name: 'CodeTabs', diff --git a/src/generators/web/utils/generate.mjs b/src/generators/web/utils/generate.mjs index 55aa3141..e782f836 100644 --- a/src/generators/web/utils/generate.mjs +++ b/src/generators/web/utils/generate.mjs @@ -1,4 +1,4 @@ -import { resolve } from 'node:path/posix'; +import { resolve } from 'node:path'; import { JSX_IMPORTS, ROOT } from '../constants.mjs'; @@ -56,7 +56,10 @@ export default () => { // Import client-side CSS styles. // This ensures that styles used in the rendered app are loaded on the client. // The use of `new URL(...).pathname` resolves the absolute path for `entrypoint.jsx`. - createImportDeclaration(null, resolve(ROOT, './ui/index.css')), + createImportDeclaration( + null, + resolve(ROOT, './ui/index.css').replaceAll('\\', '\\\\') + ), // Import `hydrate()` from Preact — needed to attach to server-rendered HTML. // This is a named import (not default), hence `false` as the third argument. From 1a076ac7dad9f538f60339ca6dea42d7b9223975 Mon Sep 17 00:00:00 2001 From: avivkeller Date: Sun, 20 Jul 2025 16:50:40 -0400 Subject: [PATCH 2/2] fixup! --- src/generators/web/constants.mjs | 8 ++++---- src/generators/web/utils/generate.mjs | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/generators/web/constants.mjs b/src/generators/web/constants.mjs index c82294fb..928bbfea 100644 --- a/src/generators/web/constants.mjs +++ b/src/generators/web/constants.mjs @@ -17,19 +17,19 @@ export const ROOT = dirname(fileURLToPath(import.meta.url)); export const JSX_IMPORTS = { NavBar: { name: 'NavBar', - source: resolve(ROOT, './ui/components/NavBar').replaceAll('\\', '\\\\'), + source: resolve(ROOT, './ui/components/NavBar'), }, SideBar: { name: 'SideBar', - source: resolve(ROOT, './ui/components/SideBar').replaceAll('\\', '\\\\'), + source: resolve(ROOT, './ui/components/SideBar'), }, MetaBar: { name: 'MetaBar', - source: resolve(ROOT, './ui/components/MetaBar').replaceAll('\\', '\\\\'), + source: resolve(ROOT, './ui/components/MetaBar'), }, CodeBox: { name: 'CodeBox', - source: resolve(ROOT, './ui/components/CodeBox').replaceAll('\\', '\\\\'), + source: resolve(ROOT, './ui/components/CodeBox'), }, CodeTabs: { name: 'CodeTabs', diff --git a/src/generators/web/utils/generate.mjs b/src/generators/web/utils/generate.mjs index e782f836..a9f3be84 100644 --- a/src/generators/web/utils/generate.mjs +++ b/src/generators/web/utils/generate.mjs @@ -14,6 +14,10 @@ export const createImportDeclaration = ( source, useDefault = true ) => { + // '\' characters shouldn't escape the next character, + // but rather be treated as slashes. + source = source.replaceAll('\\', '\\\\'); + // Side-effect-only import (CSS) if (!importName) { return `import "${source}";`; @@ -56,10 +60,7 @@ export default () => { // Import client-side CSS styles. // This ensures that styles used in the rendered app are loaded on the client. // The use of `new URL(...).pathname` resolves the absolute path for `entrypoint.jsx`. - createImportDeclaration( - null, - resolve(ROOT, './ui/index.css').replaceAll('\\', '\\\\') - ), + createImportDeclaration(null, resolve(ROOT, './ui/index.css')), // Import `hydrate()` from Preact — needed to attach to server-rendered HTML. // This is a named import (not default), hence `false` as the third argument.