diff --git a/packages/router-plugin/src/core/code-splitter/compilers.ts b/packages/router-plugin/src/core/code-splitter/compilers.ts index 43b8c8db4f6..a010ff36370 100644 --- a/packages/router-plugin/src/core/code-splitter/compilers.ts +++ b/packages/router-plugin/src/core/code-splitter/compilers.ts @@ -628,6 +628,34 @@ export function compileCodeSplitVirtualRoute( if (t.isIdentifier(splitNode.id)) { splitMeta.localExporterIdent = splitNode.id.name splitMeta.shouldRemoveNode = false + } else if (t.isObjectPattern(splitNode.id) && t.isIdentifier(splitKey.node)) { + const matchingProperty = splitNode.id.properties.find((prop) => { + if (!t.isObjectProperty(prop)) { + return false + } + + if (t.isIdentifier(prop.value)) { + return prop.value.name === splitKey.node.name + } + + if ( + t.isAssignmentPattern(prop.value) && + t.isIdentifier(prop.value.left) + ) { + return prop.value.left.name === splitKey.node.name + } + + return false + }) + + if (!matchingProperty) { + throw new Error( + `Unable to locate the "${splitKey.node.name}" binding while splitting "${SPLIT_TYPE}".`, + ) + } + + splitMeta.localExporterIdent = splitKey.node.name + splitMeta.shouldRemoveNode = false } else { throw new Error( `Unexpected splitNode type ☝️: ${splitNode.type}`, @@ -731,13 +759,75 @@ export function compileCodeSplitVirtualRoute( if (path.node.declaration) { if (t.isVariableDeclaration(path.node.declaration)) { + const specifiers = path.node.declaration.declarations.flatMap( + (decl) => { + if (!t.isVariableDeclarator(decl)) { + return [] + } + + const identifiers: Array = [] + + const collectIdentifiers = ( + node: t.Node | null | undefined, + ) => { + if (!node) { + return + } + + if (t.isIdentifier(node)) { + identifiers.push(node) + return + } + + if (t.isAssignmentPattern(node)) { + collectIdentifiers(node.left) + return + } + + if (t.isRestElement(node)) { + collectIdentifiers(node.argument) + return + } + + if (t.isObjectPattern(node)) { + node.properties.forEach((prop) => { + if (t.isObjectProperty(prop)) { + collectIdentifiers(prop.value as t.Node) + } else if (t.isRestElement(prop)) { + collectIdentifiers(prop.argument) + } + }) + return + } + + if (t.isArrayPattern(node)) { + node.elements.forEach((element) => { + if (!element) { + return + } + collectIdentifiers(element as t.Node) + }) + } + } + + collectIdentifiers(decl.id) + + return identifiers.map((identifier) => + t.importSpecifier( + t.identifier(identifier.name), + t.identifier(identifier.name), + ), + ) + }, + ) + + if (specifiers.length === 0) { + path.remove() + return + } + const importDecl = t.importDeclaration( - path.node.declaration.declarations.map((decl) => - t.importSpecifier( - t.identifier((decl.id as any).name), - t.identifier((decl.id as any).name), - ), - ), + specifiers, t.stringLiteral( removeSplitSearchParamFromFilename(opts.filename), ), @@ -943,6 +1033,38 @@ function resolveIdentifier(path: any, node: any): t.Node | undefined { function removeIdentifierLiteral(path: babel.NodePath, node: t.Identifier) { const binding = path.scope.getBinding(node.name) if (binding) { + if ( + t.isVariableDeclarator(binding.path.node) && + t.isObjectPattern(binding.path.node.id) + ) { + const objectPattern = binding.path.node.id + objectPattern.properties = objectPattern.properties.filter((prop) => { + if (!t.isObjectProperty(prop)) { + return true + } + + if (t.isIdentifier(prop.value) && prop.value.name === node.name) { + return false + } + + if ( + t.isAssignmentPattern(prop.value) && + t.isIdentifier(prop.value.left) && + prop.value.left.name === node.name + ) { + return false + } + + return true + }) + + if (objectPattern.properties.length === 0) { + binding.path.remove() + } + + return + } + binding.path.remove() } } diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export.tsx new file mode 100644 index 00000000000..c81a2d2f465 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export.tsx @@ -0,0 +1,22 @@ +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@component.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@component.tsx new file mode 100644 index 00000000000..16146d73453 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@component.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const { + component: AboutComponent = DefaultAboutComponent +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@notFoundComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/destructured-export@notFoundComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured.tsx new file mode 100644 index 00000000000..81284bb02d7 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured.tsx @@ -0,0 +1,19 @@ +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +export const { + loader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@component.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@component.tsx new file mode 100644 index 00000000000..8f8f2fdb0bd --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@component.tsx @@ -0,0 +1,2 @@ +import { AboutComponent } from "retain-exports-destructured.tsx"; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@notFoundComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/1-default/retain-exports-destructured@notFoundComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export.tsx new file mode 100644 index 00000000000..abc5c82bc7e --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('destructured-export.tsx?tsr-split=loader'); +import { lazyFn } from '@tanstack/react-router'; +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component---errorComponent---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..16146d73453 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const { + component: AboutComponent = DefaultAboutComponent +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@loader.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@loader.tsx new file mode 100644 index 00000000000..ccb227a33e6 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/destructured-export@loader.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { loader }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured.tsx new file mode 100644 index 00000000000..9632bc58fd3 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('retain-exports-destructured.tsx?tsr-split=loader'); +import { lazyFn } from '@tanstack/react-router'; +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---errorComponent---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..8f8f2fdb0bd --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,2 @@ +import { AboutComponent } from "retain-exports-destructured.tsx"; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx new file mode 100644 index 00000000000..120a2e39112 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx @@ -0,0 +1,2 @@ +import { loader } from "retain-exports-destructured.tsx"; +export { loader }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export.tsx new file mode 100644 index 00000000000..a0a394a0099 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('destructured-export.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyFn } from '@tanstack/react-router'; +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..f711c36696d --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,21 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + component: AboutComponent = DefaultAboutComponent, + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { loader }; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/destructured-export@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx new file mode 100644 index 00000000000..7a6a706608a --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyFn } from '@tanstack/react-router'; +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..b8ec44f2209 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,3 @@ +import { AboutComponent, loader } from "retain-exports-destructured.tsx"; +export { loader }; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/react/3-all-combined-errorComponent-separate/retain-exports-destructured@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export.tsx new file mode 100644 index 00000000000..741d483e595 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export.tsx @@ -0,0 +1,22 @@ +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@component.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@component.tsx new file mode 100644 index 00000000000..16146d73453 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@component.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const { + component: AboutComponent = DefaultAboutComponent +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@notFoundComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/destructured-export@notFoundComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured.tsx new file mode 100644 index 00000000000..d362d6129cb --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured.tsx @@ -0,0 +1,19 @@ +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +export const { + loader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@component.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@component.tsx new file mode 100644 index 00000000000..8f8f2fdb0bd --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@component.tsx @@ -0,0 +1,2 @@ +import { AboutComponent } from "retain-exports-destructured.tsx"; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@notFoundComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/1-default/retain-exports-destructured@notFoundComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export.tsx new file mode 100644 index 00000000000..ce56a67783c --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('destructured-export.tsx?tsr-split=loader'); +import { lazyFn } from '@tanstack/solid-router'; +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component---errorComponent---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..16146d73453 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@component---errorComponent---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const { + component: AboutComponent = DefaultAboutComponent +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@loader.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@loader.tsx new file mode 100644 index 00000000000..ccb227a33e6 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/destructured-export@loader.tsx @@ -0,0 +1,16 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { loader }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured.tsx new file mode 100644 index 00000000000..897a254f5e2 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('retain-exports-destructured.tsx?tsr-split=loader'); +import { lazyFn } from '@tanstack/solid-router'; +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---errorComponent---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..8f8f2fdb0bd --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@component---errorComponent---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,2 @@ +import { AboutComponent } from "retain-exports-destructured.tsx"; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx new file mode 100644 index 00000000000..120a2e39112 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/2-components-combined-loader-separate/retain-exports-destructured@loader.tsx @@ -0,0 +1,2 @@ +import { loader } from "retain-exports-destructured.tsx"; +export { loader }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export.tsx new file mode 100644 index 00000000000..b80992ddd73 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('destructured-export.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyFn } from '@tanstack/solid-router'; +const $$splitComponentImporter = () => import('destructured-export.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..f711c36696d --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export@component---loader---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,21 @@ +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello' + }) +}); +function DefaultAboutComponent() { + return
Default About
; +} +const fallbackLoader = () => ({ + message: 'fallback' +}); +const { + component: AboutComponent = DefaultAboutComponent, + loader = fallbackLoader +} = createBits(); +function AboutComponentImpl() { + return
About
; +} +export { loader }; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/destructured-export@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx new file mode 100644 index 00000000000..3338df3e5d3 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured.tsx @@ -0,0 +1,9 @@ +const $$splitLoaderImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyFn } from '@tanstack/solid-router'; +const $$splitComponentImporter = () => import('retain-exports-destructured.tsx?tsr-split=component---loader---notFoundComponent---pendingComponent'); +import { lazyRouteComponent } from '@tanstack/solid-router'; +import { createFileRoute } from '@tanstack/solid-router'; +export const Route = createFileRoute('/about')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: lazyFn($$splitLoaderImporter, 'loader') +}); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx new file mode 100644 index 00000000000..b8ec44f2209 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured@component---loader---notFoundComponent---pendingComponent.tsx @@ -0,0 +1,3 @@ +import { AboutComponent, loader } from "retain-exports-destructured.tsx"; +export { loader }; +export { AboutComponent as component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured@errorComponent.tsx b/packages/router-plugin/tests/code-splitter/snapshots/solid/3-all-combined-errorComponent-separate/retain-exports-destructured@errorComponent.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/router-plugin/tests/code-splitter/test-files/react/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/test-files/react/destructured-export.tsx new file mode 100644 index 00000000000..d543e96e7dc --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/react/destructured-export.tsx @@ -0,0 +1,27 @@ +import { createFileRoute } from '@tanstack/react-router' + +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello', + }), +}) + +function DefaultAboutComponent() { + return
Default About
+} + +const fallbackLoader = () => ({ + message: 'fallback', +}) + +const { component: AboutComponent = DefaultAboutComponent, loader = fallbackLoader } = createBits() + +function AboutComponentImpl() { + return
About
+} + +export const Route = createFileRoute('/about')({ + component: AboutComponent, + loader, +}) diff --git a/packages/router-plugin/tests/code-splitter/test-files/react/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/test-files/react/retain-exports-destructured.tsx new file mode 100644 index 00000000000..0e3175116f2 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/react/retain-exports-destructured.tsx @@ -0,0 +1,19 @@ +import { createFileRoute } from '@tanstack/react-router' + +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello', + }), +}) + +export const { component: AboutComponent, loader } = createBits() + +function AboutComponentImpl() { + return
About
+} + +export const Route = createFileRoute('/about')({ + component: AboutComponent, + loader, +}) diff --git a/packages/router-plugin/tests/code-splitter/test-files/solid/destructured-export.tsx b/packages/router-plugin/tests/code-splitter/test-files/solid/destructured-export.tsx new file mode 100644 index 00000000000..b6523ec16cd --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/solid/destructured-export.tsx @@ -0,0 +1,27 @@ +import { createFileRoute } from '@tanstack/solid-router' + +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello', + }), +}) + +function DefaultAboutComponent() { + return
Default About
+} + +const fallbackLoader = () => ({ + message: 'fallback', +}) + +const { component: AboutComponent = DefaultAboutComponent, loader = fallbackLoader } = createBits() + +function AboutComponentImpl() { + return
About
+} + +export const Route = createFileRoute('/about')({ + component: AboutComponent, + loader, +}) diff --git a/packages/router-plugin/tests/code-splitter/test-files/solid/retain-exports-destructured.tsx b/packages/router-plugin/tests/code-splitter/test-files/solid/retain-exports-destructured.tsx new file mode 100644 index 00000000000..1f1a29fc554 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/solid/retain-exports-destructured.tsx @@ -0,0 +1,19 @@ +import { createFileRoute } from '@tanstack/solid-router' + +const createBits = () => ({ + component: AboutComponentImpl, + loader: () => ({ + message: 'hello', + }), +}) + +export const { component: AboutComponent, loader } = createBits() + +function AboutComponentImpl() { + return
About
+} + +export const Route = createFileRoute('/about')({ + component: AboutComponent, + loader, +})