create-payload-app 4.0.0-internal.fa345ef → 4.0.0-internal.fec2230

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +5 -0
  2. package/dist/commands.d.ts +4 -0
  3. package/dist/commands.d.ts.map +1 -0
  4. package/dist/commands.js +5 -0
  5. package/dist/commands.js.map +1 -0
  6. package/dist/lib/agent-config.d.ts +15 -0
  7. package/dist/lib/agent-config.d.ts.map +1 -0
  8. package/dist/lib/agent-config.js +22 -0
  9. package/dist/lib/agent-config.js.map +1 -0
  10. package/dist/lib/agent-config.spec.js +23 -0
  11. package/dist/lib/agent-config.spec.js.map +1 -0
  12. package/dist/lib/ast/adapter-config.d.ts.map +1 -1
  13. package/dist/lib/ast/adapter-config.js +0 -10
  14. package/dist/lib/ast/adapter-config.js.map +1 -1
  15. package/dist/lib/ast/package-json.d.ts +9 -0
  16. package/dist/lib/ast/package-json.d.ts.map +1 -1
  17. package/dist/lib/ast/package-json.js +34 -8
  18. package/dist/lib/ast/package-json.js.map +1 -1
  19. package/dist/lib/ast/package-json.spec.js +73 -1
  20. package/dist/lib/ast/package-json.spec.js.map +1 -1
  21. package/dist/lib/ast/types.d.ts +2 -2
  22. package/dist/lib/ast/types.d.ts.map +1 -1
  23. package/dist/lib/ast/types.js +0 -1
  24. package/dist/lib/ast/types.js.map +1 -1
  25. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  26. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  27. package/dist/lib/configure-payload-tsconfig.js +26 -0
  28. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  29. package/dist/lib/configure-payload-tsconfig.spec.js +135 -0
  30. package/dist/lib/configure-payload-tsconfig.spec.js.map +1 -0
  31. package/dist/lib/configure-plugin-project.d.ts.map +1 -1
  32. package/dist/lib/create-project.d.ts +1 -2
  33. package/dist/lib/create-project.d.ts.map +1 -1
  34. package/dist/lib/create-project.js +5 -21
  35. package/dist/lib/create-project.js.map +1 -1
  36. package/dist/lib/create-project.spec.js +9 -0
  37. package/dist/lib/create-project.spec.js.map +1 -1
  38. package/dist/lib/generate-secret.js +1 -1
  39. package/dist/lib/generate-secret.js.map +1 -1
  40. package/dist/lib/init-next.d.ts.map +1 -1
  41. package/dist/lib/init-next.js +5 -34
  42. package/dist/lib/init-next.js.map +1 -1
  43. package/dist/lib/init-tanstack-default-template.spec.js +121 -0
  44. package/dist/lib/init-tanstack-default-template.spec.js.map +1 -0
  45. package/dist/lib/init-tanstack.d.ts +18 -0
  46. package/dist/lib/init-tanstack.d.ts.map +1 -0
  47. package/dist/lib/init-tanstack.js +150 -0
  48. package/dist/lib/init-tanstack.js.map +1 -0
  49. package/dist/lib/init-tanstack.spec.js +394 -0
  50. package/dist/lib/init-tanstack.spec.js.map +1 -0
  51. package/dist/lib/tanstack/detect.d.ts +5 -0
  52. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  53. package/dist/lib/tanstack/detect.js +131 -0
  54. package/dist/lib/tanstack/detect.js.map +1 -0
  55. package/dist/lib/tanstack/detect.spec.js +227 -0
  56. package/dist/lib/tanstack/detect.spec.js.map +1 -0
  57. package/dist/lib/tanstack/prepare.d.ts +23 -0
  58. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  59. package/dist/lib/tanstack/prepare.js +114 -0
  60. package/dist/lib/tanstack/prepare.js.map +1 -0
  61. package/dist/lib/tanstack/prepare.spec.js +288 -0
  62. package/dist/lib/tanstack/prepare.spec.js.map +1 -0
  63. package/dist/lib/tanstack/template-files.d.ts +50 -0
  64. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  65. package/dist/lib/tanstack/template-files.js +64 -0
  66. package/dist/lib/tanstack/template-files.js.map +1 -0
  67. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  68. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  69. package/dist/lib/tanstack/transform-root-route.js +747 -0
  70. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  71. package/dist/lib/tanstack/transform-root-route.spec.js +484 -0
  72. package/dist/lib/tanstack/transform-root-route.spec.js.map +1 -0
  73. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  74. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  75. package/dist/lib/tanstack/transform-router.js +301 -0
  76. package/dist/lib/tanstack/transform-router.js.map +1 -0
  77. package/dist/lib/tanstack/transform-router.spec.js +264 -0
  78. package/dist/lib/tanstack/transform-router.spec.js.map +1 -0
  79. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  80. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  81. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  82. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  83. package/dist/lib/tanstack/transform-vite-config.spec.js +456 -0
  84. package/dist/lib/tanstack/transform-vite-config.spec.js.map +1 -0
  85. package/dist/lib/templates.d.ts.map +1 -1
  86. package/dist/lib/templates.js +6 -0
  87. package/dist/lib/templates.js.map +1 -1
  88. package/dist/lib/update-payload-in-project.d.ts +18 -3
  89. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  90. package/dist/lib/update-payload-in-project.js +98 -18
  91. package/dist/lib/update-payload-in-project.js.map +1 -1
  92. package/dist/lib/update-payload-in-project.spec.js +262 -0
  93. package/dist/lib/update-payload-in-project.spec.js.map +1 -0
  94. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  95. package/dist/main.d.ts +20 -1
  96. package/dist/main.d.ts.map +1 -1
  97. package/dist/main.js +120 -29
  98. package/dist/main.js.map +1 -1
  99. package/dist/main.spec.js +102 -0
  100. package/dist/main.spec.js.map +1 -0
  101. package/dist/scripts/pack-template-files.js +18 -0
  102. package/dist/scripts/pack-template-files.js.map +1 -1
  103. package/dist/template/src/app/(frontend)/styles.css +1 -1
  104. package/dist/template/src/app/(payload)/layout.tsx +8 -2
  105. package/dist/template-tanstack/routes/_payload/admin.$.tsx +8 -0
  106. package/dist/template-tanstack/routes/_payload/admin.index.tsx +8 -0
  107. package/dist/template-tanstack/routes/_payload/api.$.ts +10 -0
  108. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  109. package/dist/template-tanstack/routes/_payload/server.functions.ts +49 -0
  110. package/dist/template-tanstack/routes/_payload.tsx +30 -0
  111. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  112. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  113. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  114. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  115. package/dist/template-tanstack/src/payload.config.ts +40 -0
  116. package/dist/template-tanstack/src/payload.css +1 -0
  117. package/dist/types.d.ts +22 -3
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/types.js.map +1 -1
  120. package/dist/utils/casing.d.ts.map +1 -1
  121. package/dist/utils/log.d.ts.map +1 -1
  122. package/dist/utils/messages.d.ts +1 -0
  123. package/dist/utils/messages.d.ts.map +1 -1
  124. package/dist/utils/messages.js +8 -6
  125. package/dist/utils/messages.js.map +1 -1
  126. package/package.json +4 -4
  127. package/dist/lib/download-skill.d.ts +0 -8
  128. package/dist/lib/download-skill.d.ts.map +0 -1
  129. package/dist/lib/download-skill.js +0 -35
  130. package/dist/lib/download-skill.js.map +0 -1
  131. package/dist/lib/select-agent.d.ts +0 -16
  132. package/dist/lib/select-agent.d.ts.map +0 -1
  133. package/dist/lib/select-agent.js +0 -67
  134. package/dist/lib/select-agent.js.map +0 -1
  135. /package/dist/template/src/app/(payload)/{custom.scss → custom.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/tanstack/transform-root-route.spec.ts"],"sourcesContent":["import { Project } from 'ts-morph'\nimport { describe, expect, it } from 'vitest'\n\nimport { transformTanStackRootRoute } from './transform-root-route.js'\n\nfunction expectSuccessfulTransform(result: ReturnType<typeof transformTanStackRootRoute>) {\n expect(result.success).toBe(true)\n\n if (!result.success) {\n throw new Error(result.reason)\n }\n\n return result\n}\n\nfunction getStartRoot({\n appCssHref = 'appCss',\n extraImports = '',\n shellComponent = 'RootDocument',\n}: {\n appCssHref?: string\n extraImports?: string\n shellComponent?: string\n} = {}) {\n return `import { createRootRoute as createAppRoot, HeadContent, Scripts } from '@tanstack/react-router'\nimport appCss from '../styles.css?url'\nimport { ThemeProvider } from './theme-provider'\n${extraImports}\n\nexport const Route = createAppRoot({\n head: () => ({\n meta: [\n { charSet: 'utf-8' },\n { name: 'viewport', content: 'width=device-width, initial-scale=1' },\n { title: 'Custom title' },\n ],\n links: [\n { rel: 'stylesheet', href: ${appCssHref} },\n { rel: 'preconnect', href: 'https://fonts.googleapis.com' },\n ],\n }),\n notFoundComponent: NotFound,\n shellComponent: ${shellComponent},\n})\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head>\n <meta name=\"theme-color\" content=\"black\" />\n <HeadContent />\n </head>\n <body>\n <ThemeProvider>{children}</ThemeProvider>\n <Scripts />\n </body>\n </html>\n )\n}\n`\n}\n\nfunction getRouterOnlyRoot({\n extraImports = '',\n stylesheetImport = `import '../styles.css'`,\n}: {\n extraImports?: string\n stylesheetImport?: string\n} = {}) {\n return `import { createRootRoute as createAppRoot, Outlet } from '@tanstack/react-router'\nimport { AuthProvider } from './auth-provider'\n${stylesheetImport}\n${extraImports}\n\nexport const Route = createAppRoot({\n component: RootComponent,\n head: () => ({\n meta: [{ title: 'Router app' }],\n links: [{ rel: 'preconnect', href: 'https://fonts.googleapis.com' }],\n }),\n notFoundComponent: NotFound,\n})\n\nfunction RootComponent() {\n return (\n <AuthProvider>\n <main data-layout=\"custom\">\n <Outlet />\n </main>\n </AuthProvider>\n )\n}\n`\n}\n\nfunction getRouterOnlyDocumentRoot(returnExpression: string) {\n return `import { Outlet, createRootRoute } from '@tanstack/react-router'\n\nimport '../styles.css'\n\nexport const Route = createRootRoute({\n component: RootComponent,\n})\n\nfunction RootComponent() {\n return (${returnExpression})\n}\n`\n}\n\nfunction getRouterNamedImports(content: string, importedNames: string[]) {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('__root.tsx', content)\n\n return sourceFile\n .getImportDeclarations()\n .filter((declaration) => declaration.getModuleSpecifierValue() === '@tanstack/react-router')\n .flatMap((declaration) =>\n declaration\n .getNamedImports()\n .filter((namedImport) => importedNames.includes(namedImport.getName()))\n .map((namedImport) => ({\n importedName: namedImport.getName(),\n localName: namedImport.getAliasNode()?.getText() ?? namedImport.getName(),\n })),\n )\n}\n\ndescribe('transformTanStackRootRoute', () => {\n it('should wrap the official Start shell and isolate its app stylesheet from admin', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: getStartRoot(), kind: 'start' }),\n )\n\n expect(result.modified).toBe(true)\n expect(result.content).toContain(\n \"import { withPayloadRoot } from '@payloadcms/tanstack-start/client'\",\n )\n expect(result.content).toContain('shellComponent: withPayloadRoot(RootDocument)')\n expect(result.content).not.toContain(\"{ rel: 'stylesheet', href: appCss }\")\n expect(result.content).toContain('<link href={appCss} rel=\"stylesheet\" />')\n expect(result.content.indexOf('<link href={appCss}')).toBeLessThan(\n result.content.indexOf('<HeadContent />'),\n )\n })\n\n it('should preserve Start metadata, non-stylesheet links, components, and providers', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: getStartRoot(), kind: 'start' }),\n )\n\n expect(result.content).toContain(\"{ charSet: 'utf-8' }\")\n expect(result.content).toContain(\n \"{ name: 'viewport', content: 'width=device-width, initial-scale=1' }\",\n )\n expect(result.content).toContain(\"{ title: 'Custom title' }\")\n expect(result.content).toContain(\"{ rel: 'preconnect', href: 'https://fonts.googleapis.com' }\")\n expect(result.content).toContain('notFoundComponent: NotFound')\n expect(result.content).toContain('<meta name=\"theme-color\" content=\"black\" />')\n expect(result.content).toContain('<ThemeProvider>{children}</ThemeProvider>')\n })\n\n it('should convert the official Router-only root without replacing its route component', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: getRouterOnlyRoot(), kind: 'router-only' }),\n )\n\n expect(result.modified).toBe(true)\n expect(result.content).toContain(\"import appCss from '../styles.css?url'\")\n expect(result.content).not.toContain(\"import '../styles.css'\")\n expect(result.content).toContain('component: RootComponent')\n expect(result.content).toContain('shellComponent: withPayloadRoot(RootDocument)')\n expect(result.content).toContain('function RootComponent()')\n expect(result.content).toContain('<AuthProvider>')\n expect(result.content).toContain('<Outlet />')\n expect(result.content).toContain(\n 'function RootDocument({ children }: { children: React.ReactNode })',\n )\n expect(result.content).toContain('<html lang=\"en\" suppressHydrationWarning>')\n expect(result.content).toContain('<link href={appCss} rel=\"stylesheet\" />')\n expect(result.content).toContain('<HeadContent />')\n expect(result.content).toContain('{children}')\n expect(result.content).toContain('<Scripts />')\n })\n\n it('should preserve Router-only metadata, non-stylesheet links, and route options', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: getRouterOnlyRoot(), kind: 'router-only' }),\n )\n\n expect(result.content).toContain(\"meta: [{ title: 'Router app' }]\")\n expect(result.content).toContain(\n \"links: [{ rel: 'preconnect', href: 'https://fonts.googleapis.com' }]\",\n )\n expect(result.content).toContain('notFoundComponent: NotFound')\n expect(result.content).toContain('<main data-layout=\"custom\">')\n })\n\n it.each([\n [\n 'direct',\n `<html lang=\"fr\"><head><title>My Router App</title></head><body><Outlet /></body></html>`,\n ],\n ['fragment-wrapped', `<><html lang=\"fr\"><head /><body><Outlet /></body></html></>`],\n ['conditional', `isReady ? <html lang=\"fr\"><head /><body><Outlet /></body></html> : null`],\n ])(\n 'should reject a Router-only root whose %s route component renders the document shell',\n (_shape, returnExpression) => {\n const content = getRouterOnlyDocumentRoot(returnExpression)\n\n expect(transformTanStackRootRoute({ content, kind: 'router-only' })).toEqual({\n reason: 'The Router-only route component cannot render the document shell.',\n success: false,\n })\n },\n )\n\n it('should reuse aliased HeadContent and Scripts imports from split declarations', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({\n content: getRouterOnlyRoot({\n extraImports: `import { HeadContent as RouterHeadContent } from '@tanstack/react-router'\nimport { Scripts as RouterScripts } from '@tanstack/react-router'`,\n }),\n kind: 'router-only',\n }),\n )\n\n expect(result.content).toContain('<RouterHeadContent />')\n expect(result.content).toContain('<RouterScripts />')\n expect(getRouterNamedImports(result.content, ['HeadContent', 'Scripts'])).toEqual([\n { importedName: 'HeadContent', localName: 'RouterHeadContent' },\n { importedName: 'Scripts', localName: 'RouterScripts' },\n ])\n })\n\n it('should preserve split HeadContent and Scripts imports without duplicating bindings', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({\n content: getRouterOnlyRoot({\n extraImports: `import { HeadContent } from '@tanstack/react-router'\nimport { Scripts } from '@tanstack/react-router'`,\n }),\n kind: 'router-only',\n }),\n )\n\n expect(getRouterNamedImports(result.content, ['HeadContent', 'Scripts'])).toEqual([\n { importedName: 'HeadContent', localName: 'HeadContent' },\n { importedName: 'Scripts', localName: 'Scripts' },\n ])\n })\n\n it('should not add withPayloadRoot to an unrelated type-only client import', () => {\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({\n content: getRouterOnlyRoot({\n extraImports: `import type { ClientOptions } from '@payloadcms/tanstack-start/client'`,\n }),\n kind: 'router-only',\n }),\n )\n\n expect(result.content).toContain(\n \"import { withPayloadRoot } from '@payloadcms/tanstack-start/client'\",\n )\n expect(result.content).toContain(\n \"import type { ClientOptions } from '@payloadcms/tanstack-start/client'\",\n )\n })\n\n it.each([\n ['start' as const, getStartRoot()],\n ['router-only' as const, getRouterOnlyRoot()],\n ])('should report an already transformed %s root as unmodified', (kind, content) => {\n const firstResult = expectSuccessfulTransform(transformTanStackRootRoute({ content, kind }))\n const secondResult = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: firstResult.content, kind }),\n )\n\n expect(secondResult).toEqual({ content: firstResult.content, modified: false, success: true })\n })\n\n it.each([\n ['start' as const, getStartRoot()],\n ['router-only' as const, getRouterOnlyRoot()],\n ])(\n 'should restore a missing withPayloadRoot import in a transformed %s root',\n (kind, content) => {\n const firstResult = expectSuccessfulTransform(transformTanStackRootRoute({ content, kind }))\n const contentWithoutPayloadImport = firstResult.content.replace(\n /import \\{ withPayloadRoot \\} from '@payloadcms\\/tanstack-start\\/client';?\\n/,\n '',\n )\n\n const result = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: contentWithoutPayloadImport, kind }),\n )\n\n expect(result.modified).toBe(true)\n expect(result.content).toContain(\n \"import { withPayloadRoot } from '@payloadcms/tanstack-start/client'\",\n )\n },\n )\n\n it.each([\n ['start' as const, getStartRoot()],\n ['router-only' as const, getRouterOnlyRoot()],\n ])(\n 'should validate an aliased wrapper call against its local import in a transformed %s root',\n (kind, content) => {\n const firstResult = expectSuccessfulTransform(transformTanStackRootRoute({ content, kind }))\n const aliasedContent = firstResult.content\n .replace(\n \"import { withPayloadRoot } from '@payloadcms/tanstack-start/client'\",\n \"import { withPayloadRoot as payloadRoot } from '@payloadcms/tanstack-start/client'\",\n )\n .replace('withPayloadRoot(RootDocument)', 'payloadRoot(RootDocument)')\n\n const result = transformTanStackRootRoute({ content: aliasedContent, kind })\n\n expect(result).toEqual({ content: aliasedContent, modified: false, success: true })\n },\n )\n\n it.each([\n ['start' as const, getStartRoot()],\n ['router-only' as const, getRouterOnlyRoot()],\n ])(\n 'should reject a transformed %s root whose canonical wrapper call has only an aliased import',\n (kind, content) => {\n const firstResult = expectSuccessfulTransform(transformTanStackRootRoute({ content, kind }))\n const malformedContent = firstResult.content.replace(\n \"import { withPayloadRoot } from '@payloadcms/tanstack-start/client'\",\n \"import { withPayloadRoot as payloadRoot } from '@payloadcms/tanstack-start/client'\",\n )\n\n const result = transformTanStackRootRoute({ content: malformedContent, kind })\n\n expect(result).toEqual({\n reason: 'The existing shellComponent cannot be transformed safely.',\n success: false,\n })\n },\n )\n\n it.each([\n ['start' as const, getStartRoot()],\n ['router-only' as const, getRouterOnlyRoot()],\n ])(\n 'should reject a transformed %s root with the stylesheet after HeadContent',\n (kind, content) => {\n const firstResult = expectSuccessfulTransform(transformTanStackRootRoute({ content, kind }))\n const reorderedContent = firstResult.content.replace(\n '<link href={appCss} rel=\"stylesheet\" />\\n <HeadContent />',\n '<HeadContent />\\n <link href={appCss} rel=\"stylesheet\" />',\n )\n\n const result = transformTanStackRootRoute({ content: reorderedContent, kind })\n\n expect(result.success).toBe(false)\n },\n )\n\n it('should reject an unrecognized Start shell expression', () => {\n const result = transformTanStackRootRoute({\n content: getStartRoot({ shellComponent: 'createShell(RootDocument)' }),\n kind: 'start',\n })\n\n expect(result).toEqual({\n reason: 'The existing shellComponent cannot be transformed safely.',\n success: false,\n })\n })\n\n it('should reject an existing Router-only shell component', () => {\n const content = getRouterOnlyRoot().replace(\n 'component: RootComponent,',\n 'component: RootComponent,\\n shellComponent: CustomShell,',\n )\n\n const result = transformTanStackRootRoute({ content, kind: 'router-only' })\n\n expect(result).toEqual({\n reason: 'The existing shellComponent cannot be transformed safely.',\n success: false,\n })\n })\n\n it('should reject multiple root route declarations', () => {\n const content = `${getStartRoot()}\nexport const OtherRoute = createAppRoot({ shellComponent: RootDocument })\n`\n\n const result = transformTanStackRootRoute({ content, kind: 'start' })\n\n expect(result).toEqual({\n reason: 'Expected exactly one createRootRoute() call.',\n success: false,\n })\n })\n\n it('should reject a Start stylesheet expression that cannot be relocated', () => {\n const result = transformTanStackRootRoute({\n content: getStartRoot({ appCssHref: 'getStylesheetUrl()' }),\n kind: 'start',\n })\n\n expect(result).toEqual({\n reason: 'The app stylesheet link cannot be relocated safely.',\n success: false,\n })\n })\n\n it('should reject a Start root with an additional side-effect stylesheet import', () => {\n const result = transformTanStackRootRoute({\n content: getStartRoot({ extraImports: `import '../legacy.css'` }),\n kind: 'start',\n })\n\n expect(result).toEqual({\n reason: 'Side-effect stylesheet imports cannot be isolated from admin.',\n success: false,\n })\n })\n\n it('should reject a transformed Router-only root retaining side-effect CSS', () => {\n const firstResult = expectSuccessfulTransform(\n transformTanStackRootRoute({ content: getRouterOnlyRoot(), kind: 'router-only' }),\n )\n const content = `${firstResult.content}\\nimport '../legacy.css'\\n`\n\n const result = transformTanStackRootRoute({ content, kind: 'router-only' })\n\n expect(result).toEqual({\n reason: 'Side-effect stylesheet imports cannot be isolated from admin.',\n success: false,\n })\n })\n\n it('should reject multiple Router-only side-effect stylesheet imports', () => {\n const result = transformTanStackRootRoute({\n content: getRouterOnlyRoot({\n stylesheetImport: `import '../base.css'\\nimport '../styles.css'`,\n }),\n kind: 'router-only',\n })\n\n expect(result).toEqual({\n reason: 'Expected exactly one side-effect stylesheet import.',\n success: false,\n })\n })\n\n it.each([\n ['withPayloadRoot', `const withPayloadRoot = (component: unknown) => component`],\n ['appCss', `const appCss = '/custom.css'`],\n ['RootDocument', `function RootDocument() { return null }`],\n ['HeadContent', `const HeadContent = CustomHead`],\n ['Scripts', `const Scripts = CustomScripts`],\n ])('should reject an incompatible Router-only %s destination binding', (name, binding) => {\n const result = transformTanStackRootRoute({\n content: getRouterOnlyRoot({ extraImports: binding }),\n kind: 'router-only',\n })\n\n expect(result).toEqual({\n reason: `Identifier \"${name}\" is already bound incompatibly.`,\n success: false,\n })\n })\n\n it('should reject a withPayloadRoot import with the wrong provenance', () => {\n const result = transformTanStackRootRoute({\n content: getStartRoot({\n extraImports: `import { withPayloadRoot } from 'custom-shell'`,\n }),\n kind: 'start',\n })\n\n expect(result).toEqual({\n reason: 'Identifier \"withPayloadRoot\" is already bound incompatibly.',\n success: false,\n })\n })\n})\n"],"names":["Project","describe","expect","it","transformTanStackRootRoute","expectSuccessfulTransform","result","success","toBe","Error","reason","getStartRoot","appCssHref","extraImports","shellComponent","getRouterOnlyRoot","stylesheetImport","getRouterOnlyDocumentRoot","returnExpression","getRouterNamedImports","content","importedNames","project","useInMemoryFileSystem","sourceFile","createSourceFile","getImportDeclarations","filter","declaration","getModuleSpecifierValue","flatMap","getNamedImports","namedImport","includes","getName","map","importedName","localName","getAliasNode","getText","kind","modified","toContain","not","indexOf","toBeLessThan","each","_shape","toEqual","firstResult","secondResult","contentWithoutPayloadImport","replace","aliasedContent","malformedContent","reorderedContent","name","binding"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TextTransformResult } from './transform-vite-config.js';
2
+ export declare function transformTanStackRouter({ content }: {
3
+ content: string;
4
+ }): TextTransformResult;
5
+ //# sourceMappingURL=transform-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-router.d.ts","sourceRoot":"","sources":["../../../src/lib/tanstack/transform-router.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAerE,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,CAwH7F"}
@@ -0,0 +1,301 @@
1
+ import { Node, Project, QuoteKind, SyntaxKind } from 'ts-morph';
2
+ const PAYLOAD_SEARCH_MODULE = '@payloadcms/tanstack-start/shared';
3
+ const ROUTER_MODULE = '@tanstack/react-router';
4
+ export function transformTanStackRouter({ content }) {
5
+ const project = new Project({
6
+ manipulationSettings: {
7
+ quoteKind: QuoteKind.Single
8
+ },
9
+ useInMemoryFileSystem: true
10
+ });
11
+ const sourceFile = project.createSourceFile('router.tsx', content);
12
+ const createRouterImport = getNamedImport({
13
+ importedName: 'createRouter',
14
+ moduleSpecifier: ROUTER_MODULE,
15
+ sourceFile
16
+ });
17
+ if (!createRouterImport) {
18
+ return failure('Could not identify the createRouter import.');
19
+ }
20
+ const createRouterCalls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).filter((call)=>call.getExpression().getText() === createRouterImport.localName);
21
+ if (createRouterCalls.length !== 1) {
22
+ return failure('Expected exactly one createRouter() call.');
23
+ }
24
+ const createRouterCall = createRouterCalls[0];
25
+ if (createRouterCall.getArguments().length !== 1) {
26
+ return failure('createRouter() must receive exactly one argument.');
27
+ }
28
+ const routerObject = createRouterCall.getArguments()[0];
29
+ if (!Node.isObjectLiteralExpression(routerObject)) {
30
+ return failure('createRouter() must receive an object literal.');
31
+ }
32
+ if (routerObject.getProperties().some(Node.isSpreadAssignment)) {
33
+ return failure('Router object spreads cannot be transformed safely.');
34
+ }
35
+ const routeTreeProperties = routerObject.getProperties().filter((property)=>getPropertyName(property) === 'routeTree');
36
+ if (routeTreeProperties.length !== 1) {
37
+ return failure('The router must contain exactly one routeTree option.');
38
+ }
39
+ if (!isGeneratedRouteTreeProperty({
40
+ property: routeTreeProperties[0],
41
+ sourceFile
42
+ })) {
43
+ return failure('The routeTree option must reference the generated route tree import.');
44
+ }
45
+ const parseImport = resolvePayloadSearchImport({
46
+ importedName: 'payloadParseSearch',
47
+ sourceFile
48
+ });
49
+ if (!parseImport.success) {
50
+ return parseImport;
51
+ }
52
+ const stringifyImport = resolvePayloadSearchImport({
53
+ importedName: 'payloadStringifySearch',
54
+ sourceFile
55
+ });
56
+ if (!stringifyImport.success) {
57
+ return stringifyImport;
58
+ }
59
+ const parseValidation = validateSearchProperty({
60
+ expectedIdentifier: parseImport.localName,
61
+ propertyName: 'parseSearch',
62
+ routerObject
63
+ });
64
+ if (!parseValidation.success) {
65
+ return parseValidation;
66
+ }
67
+ const stringifyValidation = validateSearchProperty({
68
+ expectedIdentifier: stringifyImport.localName,
69
+ propertyName: 'stringifySearch',
70
+ routerObject
71
+ });
72
+ if (!stringifyValidation.success) {
73
+ return stringifyValidation;
74
+ }
75
+ if (parseValidation.isConfigured && stringifyValidation.isConfigured && parseImport.isPresent && stringifyImport.isPresent) {
76
+ return {
77
+ content,
78
+ modified: false,
79
+ success: true
80
+ };
81
+ }
82
+ const routeTreeIndex = routerObject.getProperties().indexOf(routeTreeProperties[0]);
83
+ if (!parseValidation.isConfigured) {
84
+ routerObject.insertPropertyAssignment(routeTreeIndex, {
85
+ name: 'parseSearch',
86
+ initializer: parseImport.localName
87
+ });
88
+ }
89
+ const currentRouteTreeIndex = routerObject.getProperties().findIndex((property)=>getPropertyName(property) === 'routeTree');
90
+ if (!stringifyValidation.isConfigured) {
91
+ routerObject.insertPropertyAssignment(currentRouteTreeIndex + 1, {
92
+ name: 'stringifySearch',
93
+ initializer: stringifyImport.localName
94
+ });
95
+ }
96
+ ensurePayloadSearchImports({
97
+ importedNames: [
98
+ parseImport,
99
+ stringifyImport
100
+ ].filter((resolvedImport)=>!resolvedImport.isPresent).map((resolvedImport)=>resolvedImport.importedName),
101
+ sourceFile
102
+ });
103
+ sourceFile.formatText({
104
+ indentSize: 2
105
+ });
106
+ return {
107
+ content: sourceFile.getFullText(),
108
+ modified: true,
109
+ success: true
110
+ };
111
+ }
112
+ function bindingNameIncludes({ localName, node }) {
113
+ if (Node.isIdentifier(node)) {
114
+ return node.getText() === localName;
115
+ }
116
+ if (Node.isArrayBindingPattern(node) || Node.isObjectBindingPattern(node)) {
117
+ return node.getElements().some((element)=>Node.isBindingElement(element) && bindingNameIncludes({
118
+ localName,
119
+ node: element.getNameNode()
120
+ }));
121
+ }
122
+ return false;
123
+ }
124
+ function ensurePayloadSearchImports({ importedNames, sourceFile }) {
125
+ if (importedNames.length === 0) {
126
+ return;
127
+ }
128
+ const declaration = sourceFile.getImportDeclarations().find((candidate)=>candidate.getModuleSpecifierValue() === PAYLOAD_SEARCH_MODULE && !candidate.isTypeOnly() && !candidate.getNamespaceImport());
129
+ if (declaration) {
130
+ declaration.addNamedImports(importedNames);
131
+ } else {
132
+ sourceFile.addImportDeclaration({
133
+ moduleSpecifier: PAYLOAD_SEARCH_MODULE,
134
+ namedImports: importedNames
135
+ });
136
+ }
137
+ }
138
+ function failure(reason) {
139
+ return {
140
+ reason,
141
+ success: false
142
+ };
143
+ }
144
+ function getLocalBindings({ localName, sourceFile }) {
145
+ const bindings = [];
146
+ for (const declaration of sourceFile.getImportDeclarations()){
147
+ const moduleSpecifier = declaration.getModuleSpecifierValue();
148
+ const defaultImport = declaration.getDefaultImport();
149
+ if (defaultImport?.getText() === localName) {
150
+ bindings.push({
151
+ importKind: 'default',
152
+ isTypeOnly: declaration.isTypeOnly(),
153
+ kind: 'import',
154
+ moduleSpecifier
155
+ });
156
+ }
157
+ const namespaceImport = declaration.getNamespaceImport();
158
+ if (namespaceImport?.getText() === localName) {
159
+ bindings.push({
160
+ importKind: 'namespace',
161
+ isTypeOnly: declaration.isTypeOnly(),
162
+ kind: 'import',
163
+ moduleSpecifier
164
+ });
165
+ }
166
+ for (const namedImport of declaration.getNamedImports()){
167
+ const namedImportLocalName = namedImport.getAliasNode()?.getText() ?? namedImport.getName();
168
+ if (namedImportLocalName === localName) {
169
+ bindings.push({
170
+ importedName: namedImport.getName(),
171
+ importKind: 'named',
172
+ isTypeOnly: declaration.isTypeOnly() || namedImport.isTypeOnly(),
173
+ kind: 'import',
174
+ moduleSpecifier
175
+ });
176
+ }
177
+ }
178
+ }
179
+ for (const declaration of sourceFile.getVariableDeclarations()){
180
+ if (bindingNameIncludes({
181
+ localName,
182
+ node: declaration.getNameNode()
183
+ })) {
184
+ bindings.push({
185
+ kind: 'variable'
186
+ });
187
+ }
188
+ }
189
+ const hasOtherDeclaration = [
190
+ ...sourceFile.getClasses(),
191
+ ...sourceFile.getEnums(),
192
+ ...sourceFile.getFunctions(),
193
+ ...sourceFile.getModules()
194
+ ].some((declaration)=>declaration.getName() === localName);
195
+ if (hasOtherDeclaration) {
196
+ bindings.push({
197
+ kind: 'other'
198
+ });
199
+ }
200
+ return bindings;
201
+ }
202
+ function getNamedImport({ importedName, moduleSpecifier, sourceFile }) {
203
+ const imports = sourceFile.getImportDeclarations().flatMap((declaration)=>declaration.getModuleSpecifierValue() === moduleSpecifier ? declaration.getNamedImports().filter((namedImport)=>namedImport.getName() === importedName).map((namedImport)=>({
204
+ declaration,
205
+ localName: namedImport.getAliasNode()?.getText() ?? namedImport.getName()
206
+ })) : []);
207
+ if (imports.length !== 1) {
208
+ return undefined;
209
+ }
210
+ const imported = imports[0];
211
+ const bindings = getLocalBindings({
212
+ localName: imported.localName,
213
+ sourceFile
214
+ });
215
+ const binding = bindings[0];
216
+ if (bindings.length !== 1 || binding?.kind !== 'import' || binding.importKind !== 'named' || binding.importedName !== importedName || binding.isTypeOnly || binding.moduleSpecifier !== moduleSpecifier) {
217
+ return undefined;
218
+ }
219
+ return imported;
220
+ }
221
+ function getPropertyName(node) {
222
+ if (Node.isPropertyAssignment(node) || Node.isShorthandPropertyAssignment(node) || Node.isMethodDeclaration(node) || Node.isGetAccessorDeclaration(node) || Node.isSetAccessorDeclaration(node)) {
223
+ return node.getName();
224
+ }
225
+ }
226
+ function isGeneratedRouteTreeProperty({ property, sourceFile }) {
227
+ const initializer = Node.isShorthandPropertyAssignment(property) ? property.getName() : Node.isPropertyAssignment(property) && Node.isIdentifier(property.getInitializer()) ? property.getInitializer().getText() : undefined;
228
+ if (!initializer) {
229
+ return false;
230
+ }
231
+ const generatedImports = sourceFile.getImportDeclarations().flatMap((declaration)=>{
232
+ const moduleSpecifier = declaration.getModuleSpecifierValue();
233
+ if (declaration.isTypeOnly() || !/^\.\/routeTree\.gen(?:\.(?:js|jsx|ts|tsx|mjs|cjs|mts|cts))?$/.test(moduleSpecifier)) {
234
+ return [];
235
+ }
236
+ return declaration.getNamedImports().filter((namedImport)=>!namedImport.isTypeOnly() && namedImport.getName() === 'routeTree' && (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === initializer).map(()=>moduleSpecifier);
237
+ });
238
+ if (generatedImports.length !== 1) {
239
+ return false;
240
+ }
241
+ const bindings = getLocalBindings({
242
+ localName: initializer,
243
+ sourceFile
244
+ });
245
+ const binding = bindings[0];
246
+ return bindings.length === 1 && binding?.kind === 'import' && binding.importKind === 'named' && binding.importedName === 'routeTree' && !binding.isTypeOnly && binding.moduleSpecifier === generatedImports[0];
247
+ }
248
+ function isCompatiblePayloadBinding({ binding, importedName }) {
249
+ return binding.kind === 'import' && binding.importKind === 'named' && !binding.isTypeOnly && binding.importedName === importedName && binding.moduleSpecifier === PAYLOAD_SEARCH_MODULE;
250
+ }
251
+ function resolvePayloadSearchImport({ importedName, sourceFile }) {
252
+ const matchingImports = sourceFile.getImportDeclarations().flatMap((declaration)=>declaration.getModuleSpecifierValue() === PAYLOAD_SEARCH_MODULE && !declaration.isTypeOnly() ? declaration.getNamedImports().filter((namedImport)=>namedImport.getName() === importedName && !namedImport.isTypeOnly()).map((namedImport)=>namedImport.getAliasNode()?.getText() ?? namedImport.getName()) : []);
253
+ if (matchingImports.length > 1) {
254
+ return {
255
+ reason: `The Payload search module imports ${importedName} more than once.`,
256
+ success: false
257
+ };
258
+ }
259
+ const localName = matchingImports[0] ?? importedName;
260
+ const bindings = getLocalBindings({
261
+ localName,
262
+ sourceFile
263
+ });
264
+ if (bindings.length > 0 && (bindings.length !== 1 || !isCompatiblePayloadBinding({
265
+ binding: bindings[0],
266
+ importedName
267
+ }))) {
268
+ return {
269
+ reason: `Identifier "${localName}" is already bound incompatibly.`,
270
+ success: false
271
+ };
272
+ }
273
+ return {
274
+ importedName,
275
+ isPresent: matchingImports.length === 1,
276
+ localName,
277
+ success: true
278
+ };
279
+ }
280
+ function validateSearchProperty({ expectedIdentifier, propertyName, routerObject }) {
281
+ const properties = routerObject.getProperties().filter((property)=>getPropertyName(property) === propertyName);
282
+ if (properties.length === 0) {
283
+ return {
284
+ isConfigured: false,
285
+ success: true
286
+ };
287
+ }
288
+ const property = properties[0];
289
+ if (properties.length !== 1 || !property || !Node.isPropertyAssignment(property) || property.getInitializer()?.getText() !== expectedIdentifier) {
290
+ return {
291
+ reason: `The router already defines a non-Payload ${propertyName} option.`,
292
+ success: false
293
+ };
294
+ }
295
+ return {
296
+ isConfigured: true,
297
+ success: true
298
+ };
299
+ }
300
+
301
+ //# sourceMappingURL=transform-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/tanstack/transform-router.ts"],"sourcesContent":["import type {\n ImportDeclaration,\n Node as MorphNode,\n ObjectLiteralExpression,\n SourceFile,\n} from 'ts-morph'\n\nimport { Node, Project, QuoteKind, SyntaxKind } from 'ts-morph'\n\nimport type { TextTransformResult } from './transform-vite-config.js'\n\ntype LocalBinding =\n | {\n importedName?: string\n importKind: 'default' | 'named' | 'namespace'\n isTypeOnly: boolean\n kind: 'import'\n moduleSpecifier: string\n }\n | { kind: 'other' | 'variable' }\n\nconst PAYLOAD_SEARCH_MODULE = '@payloadcms/tanstack-start/shared'\nconst ROUTER_MODULE = '@tanstack/react-router'\n\nexport function transformTanStackRouter({ content }: { content: string }): TextTransformResult {\n const project = new Project({\n manipulationSettings: { quoteKind: QuoteKind.Single },\n useInMemoryFileSystem: true,\n })\n const sourceFile = project.createSourceFile('router.tsx', content)\n const createRouterImport = getNamedImport({\n importedName: 'createRouter',\n moduleSpecifier: ROUTER_MODULE,\n sourceFile,\n })\n\n if (!createRouterImport) {\n return failure('Could not identify the createRouter import.')\n }\n\n const createRouterCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => call.getExpression().getText() === createRouterImport.localName)\n\n if (createRouterCalls.length !== 1) {\n return failure('Expected exactly one createRouter() call.')\n }\n\n const createRouterCall = createRouterCalls[0]!\n if (createRouterCall.getArguments().length !== 1) {\n return failure('createRouter() must receive exactly one argument.')\n }\n\n const routerObject = createRouterCall.getArguments()[0]\n if (!Node.isObjectLiteralExpression(routerObject)) {\n return failure('createRouter() must receive an object literal.')\n }\n\n if (routerObject.getProperties().some(Node.isSpreadAssignment)) {\n return failure('Router object spreads cannot be transformed safely.')\n }\n\n const routeTreeProperties = routerObject\n .getProperties()\n .filter((property) => getPropertyName(property) === 'routeTree')\n\n if (routeTreeProperties.length !== 1) {\n return failure('The router must contain exactly one routeTree option.')\n }\n\n if (!isGeneratedRouteTreeProperty({ property: routeTreeProperties[0]!, sourceFile })) {\n return failure('The routeTree option must reference the generated route tree import.')\n }\n\n const parseImport = resolvePayloadSearchImport({\n importedName: 'payloadParseSearch',\n sourceFile,\n })\n if (!parseImport.success) {\n return parseImport\n }\n\n const stringifyImport = resolvePayloadSearchImport({\n importedName: 'payloadStringifySearch',\n sourceFile,\n })\n if (!stringifyImport.success) {\n return stringifyImport\n }\n\n const parseValidation = validateSearchProperty({\n expectedIdentifier: parseImport.localName,\n propertyName: 'parseSearch',\n routerObject,\n })\n if (!parseValidation.success) {\n return parseValidation\n }\n\n const stringifyValidation = validateSearchProperty({\n expectedIdentifier: stringifyImport.localName,\n propertyName: 'stringifySearch',\n routerObject,\n })\n if (!stringifyValidation.success) {\n return stringifyValidation\n }\n\n if (\n parseValidation.isConfigured &&\n stringifyValidation.isConfigured &&\n parseImport.isPresent &&\n stringifyImport.isPresent\n ) {\n return { content, modified: false, success: true }\n }\n\n const routeTreeIndex = routerObject.getProperties().indexOf(routeTreeProperties[0]!)\n if (!parseValidation.isConfigured) {\n routerObject.insertPropertyAssignment(routeTreeIndex, {\n name: 'parseSearch',\n initializer: parseImport.localName,\n })\n }\n\n const currentRouteTreeIndex = routerObject\n .getProperties()\n .findIndex((property) => getPropertyName(property) === 'routeTree')\n if (!stringifyValidation.isConfigured) {\n routerObject.insertPropertyAssignment(currentRouteTreeIndex + 1, {\n name: 'stringifySearch',\n initializer: stringifyImport.localName,\n })\n }\n\n ensurePayloadSearchImports({\n importedNames: [parseImport, stringifyImport]\n .filter((resolvedImport) => !resolvedImport.isPresent)\n .map((resolvedImport) => resolvedImport.importedName),\n sourceFile,\n })\n sourceFile.formatText({ indentSize: 2 })\n\n return { content: sourceFile.getFullText(), modified: true, success: true }\n}\n\nfunction bindingNameIncludes({ localName, node }: { localName: string; node: MorphNode }): boolean {\n if (Node.isIdentifier(node)) {\n return node.getText() === localName\n }\n\n if (Node.isArrayBindingPattern(node) || Node.isObjectBindingPattern(node)) {\n return node\n .getElements()\n .some(\n (element) =>\n Node.isBindingElement(element) &&\n bindingNameIncludes({ localName, node: element.getNameNode() }),\n )\n }\n\n return false\n}\n\nfunction ensurePayloadSearchImports({\n importedNames,\n sourceFile,\n}: {\n importedNames: string[]\n sourceFile: SourceFile\n}) {\n if (importedNames.length === 0) {\n return\n }\n\n const declaration = sourceFile\n .getImportDeclarations()\n .find(\n (candidate) =>\n candidate.getModuleSpecifierValue() === PAYLOAD_SEARCH_MODULE &&\n !candidate.isTypeOnly() &&\n !candidate.getNamespaceImport(),\n )\n if (declaration) {\n declaration.addNamedImports(importedNames)\n } else {\n sourceFile.addImportDeclaration({\n moduleSpecifier: PAYLOAD_SEARCH_MODULE,\n namedImports: importedNames,\n })\n }\n}\n\nfunction failure(reason: string): TextTransformResult {\n return { reason, success: false }\n}\n\nfunction getLocalBindings({\n localName,\n sourceFile,\n}: {\n localName: string\n sourceFile: SourceFile\n}): LocalBinding[] {\n const bindings: LocalBinding[] = []\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = declaration.getModuleSpecifierValue()\n const defaultImport = declaration.getDefaultImport()\n if (defaultImport?.getText() === localName) {\n bindings.push({\n importKind: 'default',\n isTypeOnly: declaration.isTypeOnly(),\n kind: 'import',\n moduleSpecifier,\n })\n }\n\n const namespaceImport = declaration.getNamespaceImport()\n if (namespaceImport?.getText() === localName) {\n bindings.push({\n importKind: 'namespace',\n isTypeOnly: declaration.isTypeOnly(),\n kind: 'import',\n moduleSpecifier,\n })\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n const namedImportLocalName = namedImport.getAliasNode()?.getText() ?? namedImport.getName()\n if (namedImportLocalName === localName) {\n bindings.push({\n importedName: namedImport.getName(),\n importKind: 'named',\n isTypeOnly: declaration.isTypeOnly() || namedImport.isTypeOnly(),\n kind: 'import',\n moduleSpecifier,\n })\n }\n }\n }\n\n for (const declaration of sourceFile.getVariableDeclarations()) {\n if (bindingNameIncludes({ localName, node: declaration.getNameNode() })) {\n bindings.push({ kind: 'variable' })\n }\n }\n\n const hasOtherDeclaration = [\n ...sourceFile.getClasses(),\n ...sourceFile.getEnums(),\n ...sourceFile.getFunctions(),\n ...sourceFile.getModules(),\n ].some((declaration) => declaration.getName() === localName)\n\n if (hasOtherDeclaration) {\n bindings.push({ kind: 'other' })\n }\n\n return bindings\n}\n\nfunction getNamedImport({\n importedName,\n moduleSpecifier,\n sourceFile,\n}: {\n importedName: string\n moduleSpecifier: string\n sourceFile: SourceFile\n}): { declaration: ImportDeclaration; localName: string } | undefined {\n const imports = sourceFile.getImportDeclarations().flatMap((declaration) =>\n declaration.getModuleSpecifierValue() === moduleSpecifier\n ? declaration\n .getNamedImports()\n .filter((namedImport) => namedImport.getName() === importedName)\n .map((namedImport) => ({\n declaration,\n localName: namedImport.getAliasNode()?.getText() ?? namedImport.getName(),\n }))\n : [],\n )\n\n if (imports.length !== 1) {\n return undefined\n }\n\n const imported = imports[0]!\n const bindings = getLocalBindings({ localName: imported.localName, sourceFile })\n const binding = bindings[0]\n\n if (\n bindings.length !== 1 ||\n binding?.kind !== 'import' ||\n binding.importKind !== 'named' ||\n binding.importedName !== importedName ||\n binding.isTypeOnly ||\n binding.moduleSpecifier !== moduleSpecifier\n ) {\n return undefined\n }\n\n return imported\n}\n\nfunction getPropertyName(node: MorphNode): string | undefined {\n if (\n Node.isPropertyAssignment(node) ||\n Node.isShorthandPropertyAssignment(node) ||\n Node.isMethodDeclaration(node) ||\n Node.isGetAccessorDeclaration(node) ||\n Node.isSetAccessorDeclaration(node)\n ) {\n return node.getName()\n }\n}\n\nfunction isGeneratedRouteTreeProperty({\n property,\n sourceFile,\n}: {\n property: MorphNode\n sourceFile: SourceFile\n}): boolean {\n const initializer = Node.isShorthandPropertyAssignment(property)\n ? property.getName()\n : Node.isPropertyAssignment(property) && Node.isIdentifier(property.getInitializer())\n ? property.getInitializer()!.getText()\n : undefined\n\n if (!initializer) {\n return false\n }\n\n const generatedImports = sourceFile.getImportDeclarations().flatMap((declaration) => {\n const moduleSpecifier = declaration.getModuleSpecifierValue()\n if (\n declaration.isTypeOnly() ||\n !/^\\.\\/routeTree\\.gen(?:\\.(?:js|jsx|ts|tsx|mjs|cjs|mts|cts))?$/.test(moduleSpecifier)\n ) {\n return []\n }\n\n return declaration\n .getNamedImports()\n .filter(\n (namedImport) =>\n !namedImport.isTypeOnly() &&\n namedImport.getName() === 'routeTree' &&\n (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === initializer,\n )\n .map(() => moduleSpecifier)\n })\n\n if (generatedImports.length !== 1) {\n return false\n }\n\n const bindings = getLocalBindings({ localName: initializer, sourceFile })\n const binding = bindings[0]\n\n return (\n bindings.length === 1 &&\n binding?.kind === 'import' &&\n binding.importKind === 'named' &&\n binding.importedName === 'routeTree' &&\n !binding.isTypeOnly &&\n binding.moduleSpecifier === generatedImports[0]\n )\n}\n\nfunction isCompatiblePayloadBinding({\n binding,\n importedName,\n}: {\n binding: LocalBinding\n importedName: string\n}) {\n return (\n binding.kind === 'import' &&\n binding.importKind === 'named' &&\n !binding.isTypeOnly &&\n binding.importedName === importedName &&\n binding.moduleSpecifier === PAYLOAD_SEARCH_MODULE\n )\n}\n\nfunction resolvePayloadSearchImport({\n importedName,\n sourceFile,\n}: {\n importedName: 'payloadParseSearch' | 'payloadStringifySearch'\n sourceFile: SourceFile\n}):\n | { importedName: string; isPresent: boolean; localName: string; success: true }\n | { reason: string; success: false } {\n const matchingImports = sourceFile.getImportDeclarations().flatMap((declaration) =>\n declaration.getModuleSpecifierValue() === PAYLOAD_SEARCH_MODULE && !declaration.isTypeOnly()\n ? declaration\n .getNamedImports()\n .filter(\n (namedImport) => namedImport.getName() === importedName && !namedImport.isTypeOnly(),\n )\n .map((namedImport) => namedImport.getAliasNode()?.getText() ?? namedImport.getName())\n : [],\n )\n\n if (matchingImports.length > 1) {\n return {\n reason: `The Payload search module imports ${importedName} more than once.`,\n success: false,\n }\n }\n\n const localName = matchingImports[0] ?? importedName\n const bindings = getLocalBindings({ localName, sourceFile })\n\n if (\n bindings.length > 0 &&\n (bindings.length !== 1 || !isCompatiblePayloadBinding({ binding: bindings[0]!, importedName }))\n ) {\n return {\n reason: `Identifier \"${localName}\" is already bound incompatibly.`,\n success: false,\n }\n }\n\n return { importedName, isPresent: matchingImports.length === 1, localName, success: true }\n}\n\nfunction validateSearchProperty({\n expectedIdentifier,\n propertyName,\n routerObject,\n}: {\n expectedIdentifier: string\n propertyName: 'parseSearch' | 'stringifySearch'\n routerObject: ObjectLiteralExpression\n}): { isConfigured: boolean; success: true } | { reason: string; success: false } {\n const properties = routerObject\n .getProperties()\n .filter((property) => getPropertyName(property) === propertyName)\n\n if (properties.length === 0) {\n return { isConfigured: false, success: true }\n }\n\n const property = properties[0]\n if (\n properties.length !== 1 ||\n !property ||\n !Node.isPropertyAssignment(property) ||\n property.getInitializer()?.getText() !== expectedIdentifier\n ) {\n return {\n reason: `The router already defines a non-Payload ${propertyName} option.`,\n success: false,\n }\n }\n\n return { isConfigured: true, success: true }\n}\n"],"names":["Node","Project","QuoteKind","SyntaxKind","PAYLOAD_SEARCH_MODULE","ROUTER_MODULE","transformTanStackRouter","content","project","manipulationSettings","quoteKind","Single","useInMemoryFileSystem","sourceFile","createSourceFile","createRouterImport","getNamedImport","importedName","moduleSpecifier","failure","createRouterCalls","getDescendantsOfKind","CallExpression","filter","call","getExpression","getText","localName","length","createRouterCall","getArguments","routerObject","isObjectLiteralExpression","getProperties","some","isSpreadAssignment","routeTreeProperties","property","getPropertyName","isGeneratedRouteTreeProperty","parseImport","resolvePayloadSearchImport","success","stringifyImport","parseValidation","validateSearchProperty","expectedIdentifier","propertyName","stringifyValidation","isConfigured","isPresent","modified","routeTreeIndex","indexOf","insertPropertyAssignment","name","initializer","currentRouteTreeIndex","findIndex","ensurePayloadSearchImports","importedNames","resolvedImport","map","formatText","indentSize","getFullText","bindingNameIncludes","node","isIdentifier","isArrayBindingPattern","isObjectBindingPattern","getElements","element","isBindingElement","getNameNode","declaration","getImportDeclarations","find","candidate","getModuleSpecifierValue","isTypeOnly","getNamespaceImport","addNamedImports","addImportDeclaration","namedImports","reason","getLocalBindings","bindings","defaultImport","getDefaultImport","push","importKind","kind","namespaceImport","namedImport","getNamedImports","namedImportLocalName","getAliasNode","getName","getVariableDeclarations","hasOtherDeclaration","getClasses","getEnums","getFunctions","getModules","imports","flatMap","undefined","imported","binding","isPropertyAssignment","isShorthandPropertyAssignment","isMethodDeclaration","isGetAccessorDeclaration","isSetAccessorDeclaration","getInitializer","generatedImports","test","isCompatiblePayloadBinding","matchingImports","properties"],"mappings":"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"}