From 483adb47a1bc8efdbe495367d9cb51dccd316b09 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Sat, 14 Mar 2026 10:27:25 +0300 Subject: [PATCH 1/4] fix exports becoming undefined --- .../start/src/config/fs-routes/tree-shake.ts | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/start/src/config/fs-routes/tree-shake.ts b/packages/start/src/config/fs-routes/tree-shake.ts index 5e69f6eb0..95b1dc1ac 100644 --- a/packages/start/src/config/fs-routes/tree-shake.ts +++ b/packages/start/src/config/fs-routes/tree-shake.ts @@ -107,58 +107,75 @@ function treeShakeTransform({ types: t }: typeof Babel): PluginObj { }); } }, - ExportDefaultDeclaration(exportNamedPath) { - // if opts.keep is true, we don't remove the routeData export + ExportDefaultDeclaration(exportNamedPath) { if (state.opts.pick && !state.opts.pick.includes("default")) { - exportNamedPath.remove(); + const decl = exportNamedPath.get("declaration"); + if (decl.node) { + // Keep the declaration, just remove the export + exportNamedPath.replaceWith(decl.node); + } else { + exportNamedPath.remove(); + } } }, ExportNamedDeclaration(exportNamedPath) { - // if opts.keep is false, we don't remove the routeData export if (!state.opts.pick) { return; } + const specifiers = exportNamedPath.get("specifiers"); + + // Handle: export { foo, bar } if (specifiers.length) { - specifiers.forEach(s => { - if ( - t.isIdentifier(s.node.exported) - ? s.node.exported.name - : state.opts.pick.includes(s.node.exported.value) - ) { - s.remove(); + specifiers.forEach((s) => { + const exportedName = t.isIdentifier(s.node.exported) + ? s.node.exported.name + : s.node.exported.value; + if (!state.opts.pick.includes(exportedName)) { + s.remove(); // Remove from export list, but keep the local binding } }); if (exportNamedPath.node.specifiers.length < 1) { - exportNamedPath.remove(); + exportNamedPath.remove(); // Remove empty export statement } return; } + const decl = exportNamedPath.get("declaration"); if (decl == null || decl.node == null) { return; } + switch (decl.node.type) { case "FunctionDeclaration": { const name = decl.node.id?.name; - if (name && state.opts.pick && !state.opts.pick.includes(name)) { - exportNamedPath.remove(); + if (name && !state.opts.pick.includes(name)) { + // REPLACE export function foo() {} with function foo() {} + // Don't remove - just remove the export! + exportNamedPath.replaceWith(decl.node); } break; } case "VariableDeclaration": { - const inner = decl.get("declarations") as Array>; - inner.forEach(d => { - if (d.node.id.type !== "Identifier") { - return; - } + const inner = decl.get("declarations"); + inner.forEach((d) => { + if (d.node.id.type !== "Identifier") return; const name = d.node.id.name; - if (state.opts.pick && !state.opts.pick.includes(name)) { - d.remove(); + if (!state.opts.pick.includes(name)) { + // Keep the variable, just not exported + // Replace export const foo = ... with const foo = ... + exportNamedPath.replaceWith(decl.node); } }); break; } + case "ClassDeclaration": { + const name = decl.node.id?.name; + if (name && !state.opts.pick.includes(name)) { + exportNamedPath.replaceWith(decl.node); + } + break; + } default: { break; } From 0da494bb5ff1aecc9b57b7ea8b8d56b7b56a7363 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Sat, 14 Mar 2026 10:28:00 +0300 Subject: [PATCH 2/4] format --- packages/start/src/config/fs-routes/tree-shake.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/start/src/config/fs-routes/tree-shake.ts b/packages/start/src/config/fs-routes/tree-shake.ts index 95b1dc1ac..b44b767e0 100644 --- a/packages/start/src/config/fs-routes/tree-shake.ts +++ b/packages/start/src/config/fs-routes/tree-shake.ts @@ -107,7 +107,7 @@ function treeShakeTransform({ types: t }: typeof Babel): PluginObj { }); } }, - ExportDefaultDeclaration(exportNamedPath) { + ExportDefaultDeclaration(exportNamedPath) { if (state.opts.pick && !state.opts.pick.includes("default")) { const decl = exportNamedPath.get("declaration"); if (decl.node) { @@ -127,7 +127,7 @@ function treeShakeTransform({ types: t }: typeof Babel): PluginObj { // Handle: export { foo, bar } if (specifiers.length) { - specifiers.forEach((s) => { + specifiers.forEach(s => { const exportedName = t.isIdentifier(s.node.exported) ? s.node.exported.name : s.node.exported.value; @@ -158,7 +158,7 @@ function treeShakeTransform({ types: t }: typeof Babel): PluginObj { } case "VariableDeclaration": { const inner = decl.get("declarations"); - inner.forEach((d) => { + inner.forEach(d => { if (d.node.id.type !== "Identifier") return; const name = d.node.id.name; if (!state.opts.pick.includes(name)) { From 4b7c29a72291590bb8ee4c1c93d50ebdf6456aa4 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Sat, 14 Mar 2026 10:31:08 +0300 Subject: [PATCH 3/4] fix type error --- packages/start/src/config/fs-routes/tree-shake.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/start/src/config/fs-routes/tree-shake.ts b/packages/start/src/config/fs-routes/tree-shake.ts index b44b767e0..bea090eed 100644 --- a/packages/start/src/config/fs-routes/tree-shake.ts +++ b/packages/start/src/config/fs-routes/tree-shake.ts @@ -164,7 +164,7 @@ function treeShakeTransform({ types: t }: typeof Babel): PluginObj { if (!state.opts.pick.includes(name)) { // Keep the variable, just not exported // Replace export const foo = ... with const foo = ... - exportNamedPath.replaceWith(decl.node); + exportNamedPath.replaceWith(decl.node!); } }); break; From c3b5d328d4d1f37a53263d3d74f24181ac70a075 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Sat, 14 Mar 2026 10:33:09 +0300 Subject: [PATCH 4/4] add changeset --- .changeset/quiet-deserts-clap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-deserts-clap.md diff --git a/.changeset/quiet-deserts-clap.md b/.changeset/quiet-deserts-clap.md new file mode 100644 index 000000000..86e2dd754 --- /dev/null +++ b/.changeset/quiet-deserts-clap.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": minor +--- + +fixed exports getting lost