create-payload-app 4.0.0-canary.29 → 4.0.0-canary.30
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.
- package/dist/lib/init-tanstack-default-template.spec.js +4 -2
- package/dist/lib/init-tanstack-default-template.spec.js.map +1 -1
- package/dist/lib/tanstack/prepare.spec.js +3 -3
- package/dist/lib/tanstack/prepare.spec.js.map +1 -1
- package/dist/lib/tanstack/template-files.d.ts +2 -2
- package/dist/lib/tanstack/template-files.d.ts.map +1 -1
- package/dist/lib/tanstack/template-files.js +2 -2
- package/dist/lib/tanstack/template-files.js.map +1 -1
- package/dist/lib/update-payload-in-project.d.ts.map +1 -1
- package/dist/lib/update-payload-in-project.js +7 -2
- package/dist/lib/update-payload-in-project.js.map +1 -1
- package/dist/lib/update-payload-in-project.spec.js +6 -2
- package/dist/lib/update-payload-in-project.spec.js.map +1 -1
- package/dist/template-tanstack/routes/_payload.tsx +22 -5
- package/dist/template-tanstack/src/payload.css +1 -0
- package/package.json +1 -1
- package/dist/template-tanstack/src/payload-foundation.css +0 -10
|
@@ -97,7 +97,7 @@ describe('initTanStack default template', ()=>{
|
|
|
97
97
|
});
|
|
98
98
|
expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toBe(fse.readFileSync(rawPayloadLayoutPath, 'utf8'));
|
|
99
99
|
});
|
|
100
|
-
it('should
|
|
100
|
+
it('should use the UI stylesheet without copying project-level foundations', async ()=>{
|
|
101
101
|
const result = await initTanStack({
|
|
102
102
|
'--no-deps': true,
|
|
103
103
|
'--payload-version': '4.2.0',
|
|
@@ -107,7 +107,9 @@ describe('initTanStack default template', ()=>{
|
|
|
107
107
|
projectDir
|
|
108
108
|
});
|
|
109
109
|
expect(result.success).toBe(true);
|
|
110
|
-
expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toContain("import '../payload
|
|
110
|
+
expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toContain("import styles from '../payload.css?url'");
|
|
111
|
+
expect(fse.readFileSync(path.join(projectDir, 'src/payload.css'), 'utf8')).toBe("@import '@payloadcms/ui/css/app.css';\n");
|
|
112
|
+
expect(fse.pathExistsSync(path.join(projectDir, 'src/payload-foundation.css'))).toBe(false);
|
|
111
113
|
});
|
|
112
114
|
});
|
|
113
115
|
function writeFiles({ files, root }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/init-tanstack-default-template.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { TanStackAppDetails } from '../types.js'\n\nimport { initTanStack } from './init-tanstack.js'\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst mocks = vi.hoisted(() => ({ resolvePackageVersion: vi.fn() }))\n\nvi.mock('../utils/resolvePackageVersion.js', async (importOriginal) => ({\n ...(await importOriginal()),\n resolvePackageVersion: mocks.resolvePackageVersion,\n}))\n\nconst routerContent = `import { createRouter } from '@tanstack/react-router'\n\nimport { routeTree } from './routeTree.gen'\n\nexport function getRouter() {\n return createRouter({ routeTree })\n}\n`\n\nconst rootRouteContent = `import { createRootRoute, HeadContent, Scripts } from '@tanstack/react-router'\nimport appCss from '../styles.css?url'\n\nexport const Route = createRootRoute({\n head: () => ({ links: [{ rel: 'stylesheet', href: appCss }] }),\n shellComponent: RootDocument,\n})\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head><HeadContent /></head>\n <body>{children}<Scripts /></body>\n </html>\n )\n}\n`\n\nconst viteConfigContent = `import { tanstackStart } from '@tanstack/react-start/plugin/vite'\nimport viteReact from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [tanstackStart(), viteReact()],\n})\n`\n\ndescribe('initTanStack default template', () => {\n let appDetails: TanStackAppDetails\n let projectDir: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-init-tanstack-default-'))\n writeFiles({\n files: {\n 'package.json': JSON.stringify({\n dependencies: {\n '@tanstack/react-router': '^1.200.0',\n '@tanstack/react-start': '^1.200.0',\n },\n name: 'start-app',\n }),\n 'src/router.tsx': routerContent,\n 'src/routes/__root.tsx': rootRouteContent,\n 'tsconfig.json': '{\"compilerOptions\":{\"baseUrl\":\".\"}}\\n',\n 'vite.config.ts': viteConfigContent,\n },\n root: projectDir,\n })\n appDetails = {\n isPayloadInstalled: false,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should initialize from the raw source template without a templateRoot override', async () => {\n const rawPayloadLayoutPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/app/_payload.tsx',\n )\n\n const result = await initTanStack({\n '--no-deps': true,\n appDetails,\n dbType: 'mongodb',\n packageManager: 'pnpm',\n projectDir,\n })\n\n expect(result).toEqual({\n payloadConfigPath: path.join(projectDir, 'src/payload.config.ts'),\n success: true,\n })\n expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toBe(\n fse.readFileSync(rawPayloadLayoutPath, 'utf8'),\n )\n })\n\n it('should
|
|
1
|
+
{"version":3,"sources":["../../src/lib/init-tanstack-default-template.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { TanStackAppDetails } from '../types.js'\n\nimport { initTanStack } from './init-tanstack.js'\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst mocks = vi.hoisted(() => ({ resolvePackageVersion: vi.fn() }))\n\nvi.mock('../utils/resolvePackageVersion.js', async (importOriginal) => ({\n ...(await importOriginal()),\n resolvePackageVersion: mocks.resolvePackageVersion,\n}))\n\nconst routerContent = `import { createRouter } from '@tanstack/react-router'\n\nimport { routeTree } from './routeTree.gen'\n\nexport function getRouter() {\n return createRouter({ routeTree })\n}\n`\n\nconst rootRouteContent = `import { createRootRoute, HeadContent, Scripts } from '@tanstack/react-router'\nimport appCss from '../styles.css?url'\n\nexport const Route = createRootRoute({\n head: () => ({ links: [{ rel: 'stylesheet', href: appCss }] }),\n shellComponent: RootDocument,\n})\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head><HeadContent /></head>\n <body>{children}<Scripts /></body>\n </html>\n )\n}\n`\n\nconst viteConfigContent = `import { tanstackStart } from '@tanstack/react-start/plugin/vite'\nimport viteReact from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [tanstackStart(), viteReact()],\n})\n`\n\ndescribe('initTanStack default template', () => {\n let appDetails: TanStackAppDetails\n let projectDir: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-init-tanstack-default-'))\n writeFiles({\n files: {\n 'package.json': JSON.stringify({\n dependencies: {\n '@tanstack/react-router': '^1.200.0',\n '@tanstack/react-start': '^1.200.0',\n },\n name: 'start-app',\n }),\n 'src/router.tsx': routerContent,\n 'src/routes/__root.tsx': rootRouteContent,\n 'tsconfig.json': '{\"compilerOptions\":{\"baseUrl\":\".\"}}\\n',\n 'vite.config.ts': viteConfigContent,\n },\n root: projectDir,\n })\n appDetails = {\n isPayloadInstalled: false,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should initialize from the raw source template without a templateRoot override', async () => {\n const rawPayloadLayoutPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/app/_payload.tsx',\n )\n\n const result = await initTanStack({\n '--no-deps': true,\n appDetails,\n dbType: 'mongodb',\n packageManager: 'pnpm',\n projectDir,\n })\n\n expect(result).toEqual({\n payloadConfigPath: path.join(projectDir, 'src/payload.config.ts'),\n success: true,\n })\n expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toBe(\n fse.readFileSync(rawPayloadLayoutPath, 'utf8'),\n )\n })\n\n it('should use the UI stylesheet without copying project-level foundations', async () => {\n const result = await initTanStack({\n '--no-deps': true,\n '--payload-version': '4.2.0',\n appDetails,\n dbType: 'mongodb',\n packageManager: 'pnpm',\n projectDir,\n })\n\n expect(result.success).toBe(true)\n expect(fse.readFileSync(path.join(projectDir, 'src/routes/_payload.tsx'), 'utf8')).toContain(\n \"import styles from '../payload.css?url'\",\n )\n expect(fse.readFileSync(path.join(projectDir, 'src/payload.css'), 'utf8')).toBe(\n \"@import '@payloadcms/ui/css/app.css';\\n\",\n )\n expect(fse.pathExistsSync(path.join(projectDir, 'src/payload-foundation.css'))).toBe(false)\n })\n})\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }): void {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n"],"names":["fse","os","path","fileURLToPath","afterEach","beforeEach","describe","expect","it","vi","initTanStack","dirname","url","mocks","hoisted","resolvePackageVersion","fn","mock","importOriginal","routerContent","rootRouteContent","viteConfigContent","appDetails","projectDir","clearAllMocks","mockResolvedValue","mkdtempSync","join","tmpdir","writeFiles","files","JSON","stringify","dependencies","name","root","isPayloadInstalled","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","removeSync","rawPayloadLayoutPath","resolve","result","dbType","packageManager","toEqual","payloadConfigPath","success","readFileSync","toBe","toContain","pathExistsSync","relativePath","content","Object","entries","outputFileSync"],"mappings":"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"}
|
|
@@ -64,7 +64,7 @@ const templateFiles = {
|
|
|
64
64
|
'src/collections/Media.ts': "export const Media = { slug: 'media' }\n",
|
|
65
65
|
'src/collections/Tags.ts': "export const Tags = { slug: 'tags' }\n",
|
|
66
66
|
'src/collections/Users.ts': "export const Users = { slug: 'users' }\n",
|
|
67
|
-
'src/payload
|
|
67
|
+
'src/payload.css': "@import '@payloadcms/ui/css/app.css';\n",
|
|
68
68
|
'src/payload.config.ts': 'export default { collections: [] }\n'
|
|
69
69
|
};
|
|
70
70
|
describe('prepareTanStackInit', ()=>{
|
|
@@ -117,8 +117,8 @@ describe('prepareTanStackInit', ()=>{
|
|
|
117
117
|
'src/collections/Media.ts',
|
|
118
118
|
'src/collections/Tags.ts',
|
|
119
119
|
'src/collections/Users.ts',
|
|
120
|
-
'src/payload-foundation.css',
|
|
121
120
|
'src/payload.config.ts',
|
|
121
|
+
'src/payload.css',
|
|
122
122
|
'src/router.tsx',
|
|
123
123
|
'src/routes/__root.tsx',
|
|
124
124
|
'src/routes/_payload.tsx',
|
|
@@ -245,7 +245,7 @@ describe('applyPreparedWrites', ()=>{
|
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
247
|
content: '@layer payload;\n',
|
|
248
|
-
filePath: path.join(projectDir, 'src/payload
|
|
248
|
+
filePath: path.join(projectDir, 'src/payload.css')
|
|
249
249
|
}
|
|
250
250
|
];
|
|
251
251
|
await applyPreparedWrites({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/tanstack/prepare.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest'\n\nimport type { TanStackAppDetails } from '../../types.js'\n\nimport { applyPreparedWrites, prepareTanStackInit } from './prepare.js'\n\nconst routerContent = `import { createRouter } from '@tanstack/react-router'\n\nimport { routeTree } from './routeTree.gen'\n\nexport function getRouter() {\n return createRouter({\n routeTree,\n defaultPreload: 'intent',\n })\n}\n\ndeclare module '@tanstack/react-router' {\n interface Register {\n router: ReturnType<typeof getRouter>\n }\n}\n`\n\nconst rootRouteContent = `import { createRootRoute, HeadContent, Scripts } from '@tanstack/react-router'\nimport appCss from '../styles.css?url'\n\nexport const Route = createRootRoute({\n head: () => ({\n links: [{ rel: 'stylesheet', href: appCss }],\n meta: [{ title: 'Host app' }],\n }),\n shellComponent: RootDocument,\n})\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head>\n <HeadContent />\n </head>\n <body>\n {children}\n <Scripts />\n </body>\n </html>\n )\n}\n`\n\nconst viteConfigContent = `import { tanstackStart } from '@tanstack/react-start/plugin/vite'\nimport viteReact from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [tanstackStart(), viteReact()],\n})\n`\n\nconst templateFiles = {\n 'routes/_payload.tsx': 'export const payloadLayout = true\\n',\n 'routes/_payload/admin.$.tsx': 'export const payloadAdminSplat = true\\n',\n 'routes/_payload/admin.index.tsx': 'export const payloadAdminIndex = true\\n',\n 'routes/_payload/api.$.ts': 'export const payloadApi = true\\n',\n 'routes/_payload/importMap.js': 'export const importMap = {}\\n',\n 'routes/_payload/server.functions.ts': 'export const payloadServerFunctions = true\\n',\n 'src/collections/Folders.ts': \"export const Folders = { slug: 'folders' }\\n\",\n 'src/collections/Media.ts': \"export const Media = { slug: 'media' }\\n\",\n 'src/collections/Tags.ts': \"export const Tags = { slug: 'tags' }\\n\",\n 'src/collections/Users.ts': \"export const Users = { slug: 'users' }\\n\",\n 'src/payload-foundation.css': '@layer payload-default, payload;\\n',\n 'src/payload.config.ts': 'export default { collections: [] }\\n',\n}\n\ndescribe('prepareTanStackInit', () => {\n let appDetails: TanStackAppDetails\n let projectDir: string\n let templateRoot: string\n\n beforeEach(() => {\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-prepare-tanstack-project-'))\n templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-prepare-tanstack-template-'))\n\n writeFiles({\n root: projectDir,\n files: {\n 'src/router.tsx': routerContent,\n 'src/routes/__root.tsx': rootRouteContent,\n 'vite.config.ts': viteConfigContent,\n },\n })\n writeFiles({ files: templateFiles, root: templateRoot })\n\n appDetails = {\n isPayloadInstalled: false,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n fse.removeSync(templateRoot)\n })\n\n it('should prepare every host transformation and Payload-owned file without writing to disk', async () => {\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result.success).toBe(true)\n expect(snapshotDirectory(projectDir)).toEqual(before)\n\n if (!result.success) {\n throw new Error(result.reason)\n }\n\n expect(result.writes.map(({ filePath }) => path.relative(projectDir, filePath)).sort()).toEqual(\n [\n 'src/collections/Folders.ts',\n 'src/collections/Media.ts',\n 'src/collections/Tags.ts',\n 'src/collections/Users.ts',\n 'src/payload-foundation.css',\n 'src/payload.config.ts',\n 'src/router.tsx',\n 'src/routes/__root.tsx',\n 'src/routes/_payload.tsx',\n 'src/routes/_payload/admin.$.tsx',\n 'src/routes/_payload/admin.index.tsx',\n 'src/routes/_payload/api.$.ts',\n 'src/routes/_payload/importMap.js',\n 'src/routes/_payload/server.functions.ts',\n 'vite.config.ts',\n ],\n )\n expect(\n getPreparedContent({ filePath: appDetails.viteConfigPath, writes: result.writes }),\n ).toContain('withPayload(')\n expect(\n getPreparedContent({ filePath: appDetails.routerPath, writes: result.writes }),\n ).toContain('parseSearch: payloadParseSearch')\n expect(\n getPreparedContent({ filePath: appDetails.rootRoutePath, writes: result.writes }),\n ).toContain('withPayloadRoot(')\n expect(\n getPreparedContent({\n filePath: path.join(appDetails.routesDir, '_payload/api.$.ts'),\n writes: result.writes,\n }),\n ).toBe(templateFiles['routes/_payload/api.$.ts'])\n })\n\n it('should reject a non-identical Payload-owned file collision without writing to disk', async () => {\n fse.outputFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'custom route\\n')\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `A different file already exists at ${path.join(appDetails.routesDir, '_payload.tsx')}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a host file that cannot be transformed without writing to disk', async () => {\n fse.writeFileSync(appDetails.routerPath, 'export function getRouter() {}\\n')\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Could not transform ${appDetails.routerPath}: Could not identify the createRouter import.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing required template file without writing to disk', async () => {\n fse.removeSync(path.join(templateRoot, 'src/payload.config.ts'))\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${path.join(templateRoot, 'src/payload.config.ts')}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing nested Payload route without writing to disk', async () => {\n const missingFilePath = path.join(templateRoot, 'routes/_payload/server.functions.ts')\n fse.removeSync(missingFilePath)\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${missingFilePath}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing collection without writing to disk', async () => {\n const missingFilePath = path.join(templateRoot, 'src/collections/Folders.ts')\n fse.removeSync(missingFilePath)\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${missingFilePath}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should accept an identical Payload-owned file and omit it from the write set', async () => {\n const identicalFilePath = path.join(appDetails.routesDir, '_payload.tsx')\n fse.outputFileSync(identicalFilePath, templateFiles['routes/_payload.tsx'])\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result.success).toBe(true)\n expect(snapshotDirectory(projectDir)).toEqual(before)\n\n if (!result.success) {\n throw new Error(result.reason)\n }\n\n expect(result.writes.some(({ filePath }) => filePath === identicalFilePath)).toBe(false)\n })\n})\n\ndescribe('applyPreparedWrites', () => {\n let projectDir: string\n\n beforeEach(() => {\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-apply-tanstack-writes-'))\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should create parent directories and write the exact prepared content', async () => {\n const writes = [\n {\n content: 'export const value = \"preserve exact quotes\"\\n',\n filePath: path.join(projectDir, 'nested/deep/file.ts'),\n },\n {\n content: '@layer payload;\\n',\n filePath: path.join(projectDir, 'src/payload-foundation.css'),\n },\n ]\n\n await applyPreparedWrites({ writes })\n\n expect(fse.readFileSync(writes[0]!.filePath, 'utf8')).toBe(writes[0]!.content)\n expect(fse.readFileSync(writes[1]!.filePath, 'utf8')).toBe(writes[1]!.content)\n })\n})\n\nfunction getPreparedContent({\n filePath,\n writes,\n}: {\n filePath: string\n writes: { content: string; filePath: string }[]\n}) {\n const write = writes.find((candidate) => candidate.filePath === filePath)\n\n if (!write) {\n throw new Error(`No prepared write found for ${filePath}.`)\n }\n\n return write.content\n}\n\nfunction snapshotDirectory(root: string): Record<string, string> {\n if (!fse.pathExistsSync(root)) {\n return {}\n }\n\n return fse\n .readdirSync(root)\n .sort()\n .reduce<Record<string, string>>((snapshot, entry) => {\n const filePath = path.join(root, entry)\n const relativePath = path.relative(root, filePath)\n\n if (fse.statSync(filePath).isDirectory()) {\n for (const [nestedPath, content] of Object.entries(snapshotDirectory(filePath))) {\n snapshot[path.join(relativePath, nestedPath)] = content\n }\n } else {\n snapshot[relativePath] = fse.readFileSync(filePath, 'utf8')\n }\n\n return snapshot\n }, {})\n}\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }) {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n"],"names":["fse","os","path","afterEach","beforeEach","describe","expect","it","applyPreparedWrites","prepareTanStackInit","routerContent","rootRouteContent","viteConfigContent","templateFiles","appDetails","projectDir","templateRoot","mkdtempSync","join","tmpdir","writeFiles","root","files","isPayloadInstalled","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","removeSync","before","snapshotDirectory","result","success","toBe","toEqual","Error","reason","writes","map","filePath","relative","sort","getPreparedContent","toContain","outputFileSync","writeFileSync","missingFilePath","identicalFilePath","some","content","readFileSync","write","find","candidate","pathExistsSync","readdirSync","reduce","snapshot","entry","relativePath","statSync","isDirectory","nestedPath","Object","entries"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/tanstack/prepare.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest'\n\nimport type { TanStackAppDetails } from '../../types.js'\n\nimport { applyPreparedWrites, prepareTanStackInit } from './prepare.js'\n\nconst routerContent = `import { createRouter } from '@tanstack/react-router'\n\nimport { routeTree } from './routeTree.gen'\n\nexport function getRouter() {\n return createRouter({\n routeTree,\n defaultPreload: 'intent',\n })\n}\n\ndeclare module '@tanstack/react-router' {\n interface Register {\n router: ReturnType<typeof getRouter>\n }\n}\n`\n\nconst rootRouteContent = `import { createRootRoute, HeadContent, Scripts } from '@tanstack/react-router'\nimport appCss from '../styles.css?url'\n\nexport const Route = createRootRoute({\n head: () => ({\n links: [{ rel: 'stylesheet', href: appCss }],\n meta: [{ title: 'Host app' }],\n }),\n shellComponent: RootDocument,\n})\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head>\n <HeadContent />\n </head>\n <body>\n {children}\n <Scripts />\n </body>\n </html>\n )\n}\n`\n\nconst viteConfigContent = `import { tanstackStart } from '@tanstack/react-start/plugin/vite'\nimport viteReact from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [tanstackStart(), viteReact()],\n})\n`\n\nconst templateFiles = {\n 'routes/_payload.tsx': 'export const payloadLayout = true\\n',\n 'routes/_payload/admin.$.tsx': 'export const payloadAdminSplat = true\\n',\n 'routes/_payload/admin.index.tsx': 'export const payloadAdminIndex = true\\n',\n 'routes/_payload/api.$.ts': 'export const payloadApi = true\\n',\n 'routes/_payload/importMap.js': 'export const importMap = {}\\n',\n 'routes/_payload/server.functions.ts': 'export const payloadServerFunctions = true\\n',\n 'src/collections/Folders.ts': \"export const Folders = { slug: 'folders' }\\n\",\n 'src/collections/Media.ts': \"export const Media = { slug: 'media' }\\n\",\n 'src/collections/Tags.ts': \"export const Tags = { slug: 'tags' }\\n\",\n 'src/collections/Users.ts': \"export const Users = { slug: 'users' }\\n\",\n 'src/payload.css': \"@import '@payloadcms/ui/css/app.css';\\n\",\n 'src/payload.config.ts': 'export default { collections: [] }\\n',\n}\n\ndescribe('prepareTanStackInit', () => {\n let appDetails: TanStackAppDetails\n let projectDir: string\n let templateRoot: string\n\n beforeEach(() => {\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-prepare-tanstack-project-'))\n templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-prepare-tanstack-template-'))\n\n writeFiles({\n root: projectDir,\n files: {\n 'src/router.tsx': routerContent,\n 'src/routes/__root.tsx': rootRouteContent,\n 'vite.config.ts': viteConfigContent,\n },\n })\n writeFiles({ files: templateFiles, root: templateRoot })\n\n appDetails = {\n isPayloadInstalled: false,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n fse.removeSync(templateRoot)\n })\n\n it('should prepare every host transformation and Payload-owned file without writing to disk', async () => {\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result.success).toBe(true)\n expect(snapshotDirectory(projectDir)).toEqual(before)\n\n if (!result.success) {\n throw new Error(result.reason)\n }\n\n expect(result.writes.map(({ filePath }) => path.relative(projectDir, filePath)).sort()).toEqual(\n [\n 'src/collections/Folders.ts',\n 'src/collections/Media.ts',\n 'src/collections/Tags.ts',\n 'src/collections/Users.ts',\n 'src/payload.config.ts',\n 'src/payload.css',\n 'src/router.tsx',\n 'src/routes/__root.tsx',\n 'src/routes/_payload.tsx',\n 'src/routes/_payload/admin.$.tsx',\n 'src/routes/_payload/admin.index.tsx',\n 'src/routes/_payload/api.$.ts',\n 'src/routes/_payload/importMap.js',\n 'src/routes/_payload/server.functions.ts',\n 'vite.config.ts',\n ],\n )\n expect(\n getPreparedContent({ filePath: appDetails.viteConfigPath, writes: result.writes }),\n ).toContain('withPayload(')\n expect(\n getPreparedContent({ filePath: appDetails.routerPath, writes: result.writes }),\n ).toContain('parseSearch: payloadParseSearch')\n expect(\n getPreparedContent({ filePath: appDetails.rootRoutePath, writes: result.writes }),\n ).toContain('withPayloadRoot(')\n expect(\n getPreparedContent({\n filePath: path.join(appDetails.routesDir, '_payload/api.$.ts'),\n writes: result.writes,\n }),\n ).toBe(templateFiles['routes/_payload/api.$.ts'])\n })\n\n it('should reject a non-identical Payload-owned file collision without writing to disk', async () => {\n fse.outputFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'custom route\\n')\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `A different file already exists at ${path.join(appDetails.routesDir, '_payload.tsx')}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a host file that cannot be transformed without writing to disk', async () => {\n fse.writeFileSync(appDetails.routerPath, 'export function getRouter() {}\\n')\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Could not transform ${appDetails.routerPath}: Could not identify the createRouter import.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing required template file without writing to disk', async () => {\n fse.removeSync(path.join(templateRoot, 'src/payload.config.ts'))\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${path.join(templateRoot, 'src/payload.config.ts')}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing nested Payload route without writing to disk', async () => {\n const missingFilePath = path.join(templateRoot, 'routes/_payload/server.functions.ts')\n fse.removeSync(missingFilePath)\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${missingFilePath}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should reject a missing collection without writing to disk', async () => {\n const missingFilePath = path.join(templateRoot, 'src/collections/Folders.ts')\n fse.removeSync(missingFilePath)\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result).toEqual({\n reason: `Required TanStack template file is missing: ${missingFilePath}.`,\n success: false,\n })\n expect(snapshotDirectory(projectDir)).toEqual(before)\n })\n\n it('should accept an identical Payload-owned file and omit it from the write set', async () => {\n const identicalFilePath = path.join(appDetails.routesDir, '_payload.tsx')\n fse.outputFileSync(identicalFilePath, templateFiles['routes/_payload.tsx'])\n const before = snapshotDirectory(projectDir)\n\n const result = await prepareTanStackInit({ appDetails, templateRoot })\n\n expect(result.success).toBe(true)\n expect(snapshotDirectory(projectDir)).toEqual(before)\n\n if (!result.success) {\n throw new Error(result.reason)\n }\n\n expect(result.writes.some(({ filePath }) => filePath === identicalFilePath)).toBe(false)\n })\n})\n\ndescribe('applyPreparedWrites', () => {\n let projectDir: string\n\n beforeEach(() => {\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-apply-tanstack-writes-'))\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should create parent directories and write the exact prepared content', async () => {\n const writes = [\n {\n content: 'export const value = \"preserve exact quotes\"\\n',\n filePath: path.join(projectDir, 'nested/deep/file.ts'),\n },\n {\n content: '@layer payload;\\n',\n filePath: path.join(projectDir, 'src/payload.css'),\n },\n ]\n\n await applyPreparedWrites({ writes })\n\n expect(fse.readFileSync(writes[0]!.filePath, 'utf8')).toBe(writes[0]!.content)\n expect(fse.readFileSync(writes[1]!.filePath, 'utf8')).toBe(writes[1]!.content)\n })\n})\n\nfunction getPreparedContent({\n filePath,\n writes,\n}: {\n filePath: string\n writes: { content: string; filePath: string }[]\n}) {\n const write = writes.find((candidate) => candidate.filePath === filePath)\n\n if (!write) {\n throw new Error(`No prepared write found for ${filePath}.`)\n }\n\n return write.content\n}\n\nfunction snapshotDirectory(root: string): Record<string, string> {\n if (!fse.pathExistsSync(root)) {\n return {}\n }\n\n return fse\n .readdirSync(root)\n .sort()\n .reduce<Record<string, string>>((snapshot, entry) => {\n const filePath = path.join(root, entry)\n const relativePath = path.relative(root, filePath)\n\n if (fse.statSync(filePath).isDirectory()) {\n for (const [nestedPath, content] of Object.entries(snapshotDirectory(filePath))) {\n snapshot[path.join(relativePath, nestedPath)] = content\n }\n } else {\n snapshot[relativePath] = fse.readFileSync(filePath, 'utf8')\n }\n\n return snapshot\n }, {})\n}\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }) {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n"],"names":["fse","os","path","afterEach","beforeEach","describe","expect","it","applyPreparedWrites","prepareTanStackInit","routerContent","rootRouteContent","viteConfigContent","templateFiles","appDetails","projectDir","templateRoot","mkdtempSync","join","tmpdir","writeFiles","root","files","isPayloadInstalled","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","removeSync","before","snapshotDirectory","result","success","toBe","toEqual","Error","reason","writes","map","filePath","relative","sort","getPreparedContent","toContain","outputFileSync","writeFileSync","missingFilePath","identicalFilePath","some","content","readFileSync","write","find","candidate","pathExistsSync","readdirSync","reduce","snapshot","entry","relativePath","statSync","isDirectory","nestedPath","Object","entries"],"mappings":"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"}
|
|
@@ -40,8 +40,8 @@ export declare const TANSTACK_TEMPLATE_FILES: readonly [{
|
|
|
40
40
|
readonly sourcePath: 'collections/Users.ts';
|
|
41
41
|
}, {
|
|
42
42
|
readonly destination: 'src';
|
|
43
|
-
readonly relativePath: 'payload
|
|
44
|
-
readonly sourcePath: 'payload
|
|
43
|
+
readonly relativePath: 'payload.css';
|
|
44
|
+
readonly sourcePath: 'payload.css';
|
|
45
45
|
}, {
|
|
46
46
|
readonly destination: 'src';
|
|
47
47
|
readonly relativePath: 'payload.config.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-files.d.ts","sourceRoot":"","sources":["../../../src/lib/tanstack/template-files.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;aAEhC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,cAAc;aAC5B,UAAU,EAAE,kBAAkB;;aAG9B,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,0BAA0B;;aAGtC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,0BAA0B;aACxC,UAAU,EAAE,8BAA8B;;aAG1C,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,mBAAmB;aACjC,UAAU,EAAE,uBAAuB;;aAGnC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,uBAAuB;aACrC,UAAU,EAAE,2BAA2B;;aAGvC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,8BAA8B;aAC5C,UAAU,EAAE,kCAAkC;;aAG9C,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,wBAAwB;aACtC,UAAU,EAAE,wBAAwB;;aAGpC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,sBAAsB;;aAGlC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,qBAAqB;aACnC,UAAU,EAAE,qBAAqB;;aAGjC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,sBAAsB;;aAGlC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"template-files.d.ts","sourceRoot":"","sources":["../../../src/lib/tanstack/template-files.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;aAEhC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,cAAc;aAC5B,UAAU,EAAE,kBAAkB;;aAG9B,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,0BAA0B;;aAGtC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,0BAA0B;aACxC,UAAU,EAAE,8BAA8B;;aAG1C,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,mBAAmB;aACjC,UAAU,EAAE,uBAAuB;;aAGnC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,uBAAuB;aACrC,UAAU,EAAE,2BAA2B;;aAGvC,WAAW,EAAE,QAAQ;aACrB,YAAY,EAAE,8BAA8B;aAC5C,UAAU,EAAE,kCAAkC;;aAG9C,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,wBAAwB;aACtC,UAAU,EAAE,wBAAwB;;aAGpC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,sBAAsB;;aAGlC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,qBAAqB;aACnC,UAAU,EAAE,qBAAqB;;aAGjC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,sBAAsB;aACpC,UAAU,EAAE,sBAAsB;;aAGlC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,aAAa;aAC3B,UAAU,EAAE,aAAa;;aAGzB,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,mBAAmB;aACjC,UAAU,EAAE,mBAAmB;EAEzB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/tanstack/template-files.ts"],"sourcesContent":["export const TANSTACK_TEMPLATE_FILES = [\n {\n destination: 'routes',\n relativePath: '_payload.tsx',\n sourcePath: 'app/_payload.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/admin.$.tsx',\n sourcePath: 'app/_payload/admin.$.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/admin.index.tsx',\n sourcePath: 'app/_payload/admin.index.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/api.$.ts',\n sourcePath: 'app/_payload/api.$.ts',\n },\n {\n destination: 'routes',\n relativePath: '_payload/importMap.js',\n sourcePath: 'app/_payload/importMap.js',\n },\n {\n destination: 'routes',\n relativePath: '_payload/server.functions.ts',\n sourcePath: 'app/_payload/server.functions.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Folders.ts',\n sourcePath: 'collections/Folders.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Media.ts',\n sourcePath: 'collections/Media.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Tags.ts',\n sourcePath: 'collections/Tags.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Users.ts',\n sourcePath: 'collections/Users.ts',\n },\n {\n destination: 'src',\n relativePath: 'payload
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/tanstack/template-files.ts"],"sourcesContent":["export const TANSTACK_TEMPLATE_FILES = [\n {\n destination: 'routes',\n relativePath: '_payload.tsx',\n sourcePath: 'app/_payload.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/admin.$.tsx',\n sourcePath: 'app/_payload/admin.$.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/admin.index.tsx',\n sourcePath: 'app/_payload/admin.index.tsx',\n },\n {\n destination: 'routes',\n relativePath: '_payload/api.$.ts',\n sourcePath: 'app/_payload/api.$.ts',\n },\n {\n destination: 'routes',\n relativePath: '_payload/importMap.js',\n sourcePath: 'app/_payload/importMap.js',\n },\n {\n destination: 'routes',\n relativePath: '_payload/server.functions.ts',\n sourcePath: 'app/_payload/server.functions.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Folders.ts',\n sourcePath: 'collections/Folders.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Media.ts',\n sourcePath: 'collections/Media.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Tags.ts',\n sourcePath: 'collections/Tags.ts',\n },\n {\n destination: 'src',\n relativePath: 'collections/Users.ts',\n sourcePath: 'collections/Users.ts',\n },\n {\n destination: 'src',\n relativePath: 'payload.css',\n sourcePath: 'payload.css',\n },\n {\n destination: 'src',\n relativePath: 'payload.config.ts',\n sourcePath: 'payload.config.ts',\n },\n] as const\n"],"names":["TANSTACK_TEMPLATE_FILES","destination","relativePath","sourcePath"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B;IACrC;QACEC,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;IACA;QACEF,aAAa;QACbC,cAAc;QACdC,YAAY;IACd;CACD,CAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payload-in-project.d.ts","sourceRoot":"","sources":["../../src/lib/update-payload-in-project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAYrE,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAIzD,wBAAsB,qBAAqB,CAAC,EAC1C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAIxB;AAED,wBAAsB,0BAA0B,CAAC,EAC/C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCxB;AAED,wBAAsB,8BAA8B,CAAC,EACnD,UAAU,EACV,YAA4C,EAC5C,YAAY,GACb,EAAE;IACD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"update-payload-in-project.d.ts","sourceRoot":"","sources":["../../src/lib/update-payload-in-project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAYrE,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAIzD,wBAAsB,qBAAqB,CAAC,EAC1C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAIxB;AAED,wBAAsB,0BAA0B,CAAC,EAC/C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCxB;AAED,wBAAsB,8BAA8B,CAAC,EACnD,UAAU,EACV,YAA4C,EAC5C,YAAY,GACb,EAAE;IACD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,cAAc,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CAEvB"}
|
|
@@ -69,10 +69,15 @@ export async function updatePayloadInTanStackProject({ appDetails, templateRoot
|
|
|
69
69
|
info(`Updating Payload TanStack files...`);
|
|
70
70
|
const hasPackedTemplateLayout = fse.existsSync(path.join(templateRoot, 'routes'));
|
|
71
71
|
for (const { destination, relativePath, sourcePath } of TANSTACK_TEMPLATE_FILES){
|
|
72
|
-
|
|
72
|
+
const isPayloadRoute = destination === 'routes' && relativePath.startsWith('_payload');
|
|
73
|
+
const isPayloadStyles = destination === 'src' && relativePath === 'payload.css';
|
|
74
|
+
if (!isPayloadRoute && !isPayloadStyles) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const destinationPath = path.join(destination === 'routes' ? appDetails.routesDir : appDetails.sourceDir, relativePath);
|
|
78
|
+
if (isPayloadStyles && fse.existsSync(destinationPath)) {
|
|
73
79
|
continue;
|
|
74
80
|
}
|
|
75
|
-
const destinationPath = path.join(appDetails.routesDir, relativePath);
|
|
76
81
|
const templatePath = hasPackedTemplateLayout ? path.join(templateRoot, destination, relativePath) : path.join(templateRoot, sourcePath);
|
|
77
82
|
fse.ensureDirSync(path.dirname(destinationPath));
|
|
78
83
|
fse.copyFileSync(templatePath, destinationPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/update-payload-in-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { info } from '../utils/log.js'\nimport { resolvePackageVersion } from '../utils/resolvePackageVersion.js'\nimport { getPackageManager } from './get-package-manager.js'\nimport { installPackages } from './install-packages.js'\nimport { TANSTACK_TEMPLATE_FILES } from './tanstack/template-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype UpdateResult = { message: string; success: boolean }\n\ntype PackageUpdateResult = { isUpdated: boolean } & UpdateResult\n\nexport async function updatePayloadPackages({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const result = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n return { message: result.message, success: result.success }\n}\n\nexport async function updatePayloadInNextProject({\n appDetails,\n versionOrTag,\n}: {\n appDetails: NextAppDetails\n versionOrTag?: string\n}): Promise<UpdateResult> {\n if (!appDetails.nextConfigPath) {\n return { message: 'No Next.js config found', success: false }\n }\n\n const projectDir = path.dirname(appDetails.nextConfigPath)\n const packageUpdate = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload Next.js files...`)\n\n const templateFilesPath =\n process.env.JEST_WORKER_ID !== undefined\n ? path.resolve(dirname, '../../../../templates/blank')\n : path.resolve(dirname, '../..', 'dist/template')\n\n const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)')\n const payloadDirPath = path.resolve(\n projectDir,\n appDetails.isSrcDir ? 'src/app' : 'app',\n '(payload)',\n )\n\n const legacyCustomStylesPath = path.resolve(payloadDirPath, 'custom.scss')\n const customCssPath = path.resolve(payloadDirPath, 'custom.css')\n\n if (fse.existsSync(legacyCustomStylesPath) && !fse.existsSync(customCssPath)) {\n fse.renameSync(legacyCustomStylesPath, customCssPath)\n info(\n 'Renamed `(payload)/custom.scss` to `custom.css`. If it contained Sass syntax (nesting, `$variables`, `@mixin`, etc.), convert it to plain CSS — it is no longer transpiled.',\n )\n }\n\n copyRecursiveSync(templateSrcDir, payloadDirPath, ['custom.css$'])\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInTanStackProject({\n appDetails,\n templateRoot = resolveTanStackTemplateRoot(),\n versionOrTag,\n}: {\n appDetails: TanStackAppDetails\n templateRoot?: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const packageUpdate = await performPayloadPackageUpdate({\n projectDir: appDetails.projectDir,\n versionOrTag,\n })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload TanStack files...`)\n const hasPackedTemplateLayout = fse.existsSync(path.join(templateRoot, 'routes'))\n\n for (const { destination, relativePath, sourcePath } of TANSTACK_TEMPLATE_FILES) {\n if (destination !== 'routes' || !relativePath.startsWith('_payload')) {\n continue\n }\n\n const destinationPath = path.join(appDetails.routesDir, relativePath)\n const templatePath = hasPackedTemplateLayout\n ? path.join(templateRoot, destination, relativePath)\n : path.join(templateRoot, sourcePath)\n fse.ensureDirSync(path.dirname(destinationPath))\n fse.copyFileSync(templatePath, destinationPath)\n }\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInProject(\n appDetails: NextAppDetails,\n versionOrTag?: string,\n): Promise<UpdateResult> {\n return updatePayloadInNextProject({ appDetails, versionOrTag })\n}\n\nasync function performPayloadPackageUpdate({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<PackageUpdateResult> {\n const packageObj = (await fse.readJson(path.resolve(projectDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n if (!packageObj.dependencies && !packageObj.devDependencies) {\n throw new Error('No package.json found in this project')\n }\n\n const dependencyGroups = [packageObj.dependencies, packageObj.devDependencies].filter(\n (dependencies): dependencies is Record<string, string> => Boolean(dependencies),\n )\n const payloadPackageEntries = dependencyGroups.flatMap((dependencies) =>\n Object.entries(dependencies).filter(\n ([packageName]) => packageName === 'payload' || packageName.startsWith('@payloadcms/'),\n ),\n )\n const payloadVersion = payloadPackageEntries.find(\n ([packageName]) => packageName === 'payload',\n )?.[1]\n if (!payloadVersion) {\n throw new Error('Payload is not installed in this project')\n }\n\n const packageManager = await getPackageManager({ projectDir })\n const latestPayloadVersion = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n if (payloadPackageEntries.every(([, version]) => version === latestPayloadVersion)) {\n return {\n isUpdated: false,\n message: `Payload v${payloadVersion} is already up to date.`,\n success: true,\n }\n }\n\n const payloadPackages = payloadPackageEntries\n .map(([packageName]) => packageName)\n .filter((packageName) => packageName.startsWith('@payloadcms/'))\n const packageNames = ['payload', ...new Set(payloadPackages)]\n const packagesToUpdate = packageNames.map(\n (packageName) => `${packageName}@${latestPayloadVersion}`,\n )\n\n info(`Using ${packageManager}.\\n`)\n info(\n `Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\\n\\n${packageNames.map((packageName) => ` - ${packageName}`).join('\\n')}`,\n )\n\n const { success: updateSuccess } = await installPackages({\n packageManager,\n packagesToInstall: packagesToUpdate,\n projectDir,\n })\n\n if (!updateSuccess) {\n throw new Error('Failed to update Payload packages')\n }\n info('Payload packages updated successfully.')\n\n return { isUpdated: true, message: 'Payload updated successfully.', success: true }\n}\n\nfunction resolveTanStackTemplateRoot(): string {\n return path.basename(path.dirname(dirname)) === 'dist'\n ? path.resolve(dirname, '../template-tanstack')\n : path.resolve(dirname, '../../../../templates/blank-tanstack/src')\n}\n"],"names":["fse","fileURLToPath","path","copyRecursiveSync","info","resolvePackageVersion","getPackageManager","installPackages","TANSTACK_TEMPLATE_FILES","filename","url","dirname","updatePayloadPackages","projectDir","versionOrTag","result","performPayloadPackageUpdate","message","success","updatePayloadInNextProject","appDetails","nextConfigPath","packageUpdate","isUpdated","templateFilesPath","process","env","JEST_WORKER_ID","undefined","resolve","templateSrcDir","payloadDirPath","isSrcDir","legacyCustomStylesPath","customCssPath","existsSync","renameSync","updatePayloadInTanStackProject","templateRoot","resolveTanStackTemplateRoot","hasPackedTemplateLayout","join","destination","relativePath","sourcePath","startsWith","destinationPath","routesDir","templatePath","ensureDirSync","copyFileSync","updatePayloadInProject","packageObj","readJson","dependencies","devDependencies","Error","dependencyGroups","filter","Boolean","payloadPackageEntries","flatMap","Object","entries","packageName","payloadVersion","find","packageManager","latestPayloadVersion","every","version","payloadPackages","map","packageNames","Set","packagesToUpdate","length","updateSuccess","packagesToInstall","basename"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/update-payload-in-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { info } from '../utils/log.js'\nimport { resolvePackageVersion } from '../utils/resolvePackageVersion.js'\nimport { getPackageManager } from './get-package-manager.js'\nimport { installPackages } from './install-packages.js'\nimport { TANSTACK_TEMPLATE_FILES } from './tanstack/template-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype UpdateResult = { message: string; success: boolean }\n\ntype PackageUpdateResult = { isUpdated: boolean } & UpdateResult\n\nexport async function updatePayloadPackages({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const result = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n return { message: result.message, success: result.success }\n}\n\nexport async function updatePayloadInNextProject({\n appDetails,\n versionOrTag,\n}: {\n appDetails: NextAppDetails\n versionOrTag?: string\n}): Promise<UpdateResult> {\n if (!appDetails.nextConfigPath) {\n return { message: 'No Next.js config found', success: false }\n }\n\n const projectDir = path.dirname(appDetails.nextConfigPath)\n const packageUpdate = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload Next.js files...`)\n\n const templateFilesPath =\n process.env.JEST_WORKER_ID !== undefined\n ? path.resolve(dirname, '../../../../templates/blank')\n : path.resolve(dirname, '../..', 'dist/template')\n\n const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)')\n const payloadDirPath = path.resolve(\n projectDir,\n appDetails.isSrcDir ? 'src/app' : 'app',\n '(payload)',\n )\n\n const legacyCustomStylesPath = path.resolve(payloadDirPath, 'custom.scss')\n const customCssPath = path.resolve(payloadDirPath, 'custom.css')\n\n if (fse.existsSync(legacyCustomStylesPath) && !fse.existsSync(customCssPath)) {\n fse.renameSync(legacyCustomStylesPath, customCssPath)\n info(\n 'Renamed `(payload)/custom.scss` to `custom.css`. If it contained Sass syntax (nesting, `$variables`, `@mixin`, etc.), convert it to plain CSS — it is no longer transpiled.',\n )\n }\n\n copyRecursiveSync(templateSrcDir, payloadDirPath, ['custom.css$'])\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInTanStackProject({\n appDetails,\n templateRoot = resolveTanStackTemplateRoot(),\n versionOrTag,\n}: {\n appDetails: TanStackAppDetails\n templateRoot?: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const packageUpdate = await performPayloadPackageUpdate({\n projectDir: appDetails.projectDir,\n versionOrTag,\n })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload TanStack files...`)\n const hasPackedTemplateLayout = fse.existsSync(path.join(templateRoot, 'routes'))\n\n for (const { destination, relativePath, sourcePath } of TANSTACK_TEMPLATE_FILES) {\n const isPayloadRoute = destination === 'routes' && relativePath.startsWith('_payload')\n const isPayloadStyles = destination === 'src' && relativePath === 'payload.css'\n\n if (!isPayloadRoute && !isPayloadStyles) {\n continue\n }\n\n const destinationPath = path.join(\n destination === 'routes' ? appDetails.routesDir : appDetails.sourceDir,\n relativePath,\n )\n if (isPayloadStyles && fse.existsSync(destinationPath)) {\n continue\n }\n\n const templatePath = hasPackedTemplateLayout\n ? path.join(templateRoot, destination, relativePath)\n : path.join(templateRoot, sourcePath)\n fse.ensureDirSync(path.dirname(destinationPath))\n fse.copyFileSync(templatePath, destinationPath)\n }\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInProject(\n appDetails: NextAppDetails,\n versionOrTag?: string,\n): Promise<UpdateResult> {\n return updatePayloadInNextProject({ appDetails, versionOrTag })\n}\n\nasync function performPayloadPackageUpdate({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<PackageUpdateResult> {\n const packageObj = (await fse.readJson(path.resolve(projectDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n if (!packageObj.dependencies && !packageObj.devDependencies) {\n throw new Error('No package.json found in this project')\n }\n\n const dependencyGroups = [packageObj.dependencies, packageObj.devDependencies].filter(\n (dependencies): dependencies is Record<string, string> => Boolean(dependencies),\n )\n const payloadPackageEntries = dependencyGroups.flatMap((dependencies) =>\n Object.entries(dependencies).filter(\n ([packageName]) => packageName === 'payload' || packageName.startsWith('@payloadcms/'),\n ),\n )\n const payloadVersion = payloadPackageEntries.find(\n ([packageName]) => packageName === 'payload',\n )?.[1]\n if (!payloadVersion) {\n throw new Error('Payload is not installed in this project')\n }\n\n const packageManager = await getPackageManager({ projectDir })\n const latestPayloadVersion = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n if (payloadPackageEntries.every(([, version]) => version === latestPayloadVersion)) {\n return {\n isUpdated: false,\n message: `Payload v${payloadVersion} is already up to date.`,\n success: true,\n }\n }\n\n const payloadPackages = payloadPackageEntries\n .map(([packageName]) => packageName)\n .filter((packageName) => packageName.startsWith('@payloadcms/'))\n const packageNames = ['payload', ...new Set(payloadPackages)]\n const packagesToUpdate = packageNames.map(\n (packageName) => `${packageName}@${latestPayloadVersion}`,\n )\n\n info(`Using ${packageManager}.\\n`)\n info(\n `Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\\n\\n${packageNames.map((packageName) => ` - ${packageName}`).join('\\n')}`,\n )\n\n const { success: updateSuccess } = await installPackages({\n packageManager,\n packagesToInstall: packagesToUpdate,\n projectDir,\n })\n\n if (!updateSuccess) {\n throw new Error('Failed to update Payload packages')\n }\n info('Payload packages updated successfully.')\n\n return { isUpdated: true, message: 'Payload updated successfully.', success: true }\n}\n\nfunction resolveTanStackTemplateRoot(): string {\n return path.basename(path.dirname(dirname)) === 'dist'\n ? path.resolve(dirname, '../template-tanstack')\n : path.resolve(dirname, '../../../../templates/blank-tanstack/src')\n}\n"],"names":["fse","fileURLToPath","path","copyRecursiveSync","info","resolvePackageVersion","getPackageManager","installPackages","TANSTACK_TEMPLATE_FILES","filename","url","dirname","updatePayloadPackages","projectDir","versionOrTag","result","performPayloadPackageUpdate","message","success","updatePayloadInNextProject","appDetails","nextConfigPath","packageUpdate","isUpdated","templateFilesPath","process","env","JEST_WORKER_ID","undefined","resolve","templateSrcDir","payloadDirPath","isSrcDir","legacyCustomStylesPath","customCssPath","existsSync","renameSync","updatePayloadInTanStackProject","templateRoot","resolveTanStackTemplateRoot","hasPackedTemplateLayout","join","destination","relativePath","sourcePath","isPayloadRoute","startsWith","isPayloadStyles","destinationPath","routesDir","sourceDir","templatePath","ensureDirSync","copyFileSync","updatePayloadInProject","packageObj","readJson","dependencies","devDependencies","Error","dependencyGroups","filter","Boolean","payloadPackageEntries","flatMap","Object","entries","packageName","payloadVersion","find","packageManager","latestPayloadVersion","every","version","payloadPackages","map","packageNames","Set","packagesToUpdate","length","updateSuccess","packagesToInstall","basename"],"mappings":"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"}
|
|
@@ -150,7 +150,7 @@ describe('Payload project updates', ()=>{
|
|
|
150
150
|
expect(fse.readFileSync(importMapPath, 'utf8')).toBe(fse.readFileSync(sourceImportMapPath, 'utf8'));
|
|
151
151
|
expect(fse.readFileSync(customCssPath, 'utf8')).toBe('.custom { color: rebeccapurple; }\n');
|
|
152
152
|
});
|
|
153
|
-
it('should refresh
|
|
153
|
+
it('should refresh Payload-owned TanStack files without overwriting custom styles', async ()=>{
|
|
154
154
|
writeProjectPackage(projectDir);
|
|
155
155
|
writeFiles({
|
|
156
156
|
files: {
|
|
@@ -160,7 +160,7 @@ describe('Payload project updates', ()=>{
|
|
|
160
160
|
'routes/_payload/api.$.ts': 'fresh API route\n',
|
|
161
161
|
'routes/_payload/importMap.js': 'fresh import map\n',
|
|
162
162
|
'routes/_payload/server.functions.ts': 'fresh server functions\n',
|
|
163
|
-
'src/payload
|
|
163
|
+
'src/payload.css': 'template Payload route CSS\n',
|
|
164
164
|
'src/payload.config.ts': 'template Payload config\n'
|
|
165
165
|
},
|
|
166
166
|
root: templateRoot
|
|
@@ -177,6 +177,7 @@ describe('Payload project updates', ()=>{
|
|
|
177
177
|
'src/routes/_payload/api.$.ts': 'stale API route\n',
|
|
178
178
|
'src/routes/_payload/importMap.js': 'stale import map\n',
|
|
179
179
|
'src/routes/_payload/server.functions.ts': 'stale server functions\n',
|
|
180
|
+
'src/payload.css': 'custom Payload CSS\n',
|
|
180
181
|
'src/styles.css': 'custom frontend CSS\n',
|
|
181
182
|
'vite.config.ts': 'custom Vite config\n'
|
|
182
183
|
},
|
|
@@ -198,6 +199,7 @@ describe('Payload project updates', ()=>{
|
|
|
198
199
|
appDetails.rootRoutePath,
|
|
199
200
|
path.join(appDetails.routesDir, '_frontend.tsx'),
|
|
200
201
|
path.join(appDetails.routesDir, '_frontend/index.tsx'),
|
|
202
|
+
path.join(appDetails.sourceDir, 'payload.css'),
|
|
201
203
|
path.join(appDetails.sourceDir, 'styles.css')
|
|
202
204
|
];
|
|
203
205
|
const before = new Map(preservedFiles.map((filePath)=>[
|
|
@@ -223,6 +225,7 @@ describe('Payload project updates', ()=>{
|
|
|
223
225
|
writeProjectPackage(projectDir);
|
|
224
226
|
const payloadLayoutPath = path.join(projectDir, 'src/routes/_payload.tsx');
|
|
225
227
|
const sourcePayloadLayoutPath = path.resolve(dirname, '../../../../templates/blank-tanstack/src/app/_payload.tsx');
|
|
228
|
+
const sourcePayloadStylesPath = path.resolve(dirname, '../../../../templates/blank-tanstack/src/payload.css');
|
|
226
229
|
fse.outputFileSync(payloadLayoutPath, 'stale payload layout\n');
|
|
227
230
|
const appDetails = {
|
|
228
231
|
isPayloadInstalled: true,
|
|
@@ -239,6 +242,7 @@ describe('Payload project updates', ()=>{
|
|
|
239
242
|
versionOrTag: 'beta'
|
|
240
243
|
});
|
|
241
244
|
expect(fse.readFileSync(payloadLayoutPath, 'utf8')).toBe(fse.readFileSync(sourcePayloadLayoutPath, 'utf8'));
|
|
245
|
+
expect(fse.readFileSync(path.join(appDetails.sourceDir, 'payload.css'), 'utf8')).toBe(fse.readFileSync(sourcePayloadStylesPath, 'utf8'));
|
|
242
246
|
});
|
|
243
247
|
});
|
|
244
248
|
function writeFiles({ files, root }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/update-payload-in-project.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport {\n updatePayloadInNextProject,\n updatePayloadInTanStackProject,\n updatePayloadPackages,\n} from './update-payload-in-project.js'\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst mocks = vi.hoisted(() => ({\n getPackageManager: vi.fn(),\n installPackages: vi.fn(),\n resolvePackageVersion: vi.fn(),\n}))\n\nvi.mock('../utils/resolvePackageVersion.js', async (importOriginal) => ({\n ...(await importOriginal()),\n resolvePackageVersion: mocks.resolvePackageVersion,\n}))\n\nvi.mock('./get-package-manager.js', () => ({\n getPackageManager: mocks.getPackageManager,\n}))\n\nvi.mock('./install-packages.js', () => ({\n installPackages: mocks.installPackages,\n}))\n\ndescribe('Payload project updates', () => {\n let projectDir: string\n let templateRoot: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-project-'))\n templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-template-'))\n mocks.getPackageManager.mockResolvedValue('pnpm')\n mocks.installPackages.mockResolvedValue({ success: true })\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n fse.removeSync(templateRoot)\n })\n\n it('should update every installed Payload dependency to one version without a Next config', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n '@payloadcms/richtext-lexical': '^3.0.0',\n payload: '^3.0.0',\n react: '^19.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.resolvePackageVersion).toHaveBeenCalledOnce()\n expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({\n packageName: 'payload',\n versionOrTag: 'beta',\n })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: [\n 'payload@4.2.0',\n '@payloadcms/db-mongodb@4.2.0',\n '@payloadcms/richtext-lexical@4.2.0',\n ],\n projectDir,\n })\n })\n\n it('should update a stale Payload package when payload is already at the target version', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.2.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0'],\n projectDir,\n })\n })\n\n it('should update Payload packages installed as development dependencies', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.1.0',\n },\n devDependencies: {\n '@payloadcms/graphql': '4.1.0',\n vitest: '^4.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0', '@payloadcms/graphql@4.2.0'],\n projectDir,\n })\n })\n\n it('should refresh Next Payload routes without overwriting custom CSS', async () => {\n writeProjectPackage(projectDir)\n const nextConfigPath = path.join(projectDir, 'next.config.ts')\n const payloadDir = path.join(projectDir, 'src/app/(payload)')\n const importMapPath = path.join(payloadDir, 'admin/importMap.js')\n const customCssPath = path.join(payloadDir, 'custom.css')\n const sourceImportMapPath = path.resolve(\n dirname,\n '../../../../templates/blank/src/app/(payload)/admin/importMap.js',\n )\n fse.outputFileSync(importMapPath, 'stale import map\\n')\n fse.outputFileSync(customCssPath, '.custom { color: rebeccapurple; }\\n')\n\n const appDetails: NextAppDetails = {\n hasTopLevelLayout: false,\n isPayloadInstalled: true,\n isSrcDir: true,\n isSupportedNextVersion: true,\n nextConfigPath,\n nextVersion: '15.0.0',\n }\n\n const result = await updatePayloadInNextProject({ appDetails, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(importMapPath, 'utf8')).toBe(\n fse.readFileSync(sourceImportMapPath, 'utf8'),\n )\n expect(fse.readFileSync(customCssPath, 'utf8')).toBe('.custom { color: rebeccapurple; }\\n')\n })\n\n it('should refresh only Payload-owned TanStack route files', async () => {\n writeProjectPackage(projectDir)\n writeFiles({\n files: {\n 'routes/_payload.tsx': 'fresh payload layout\\n',\n 'routes/_payload/admin.$.tsx': 'fresh admin splat\\n',\n 'routes/_payload/admin.index.tsx': 'fresh admin index\\n',\n 'routes/_payload/api.$.ts': 'fresh API route\\n',\n 'routes/_payload/importMap.js': 'fresh import map\\n',\n 'routes/_payload/server.functions.ts': 'fresh server functions\\n',\n 'src/payload-foundation.css': 'template Payload CSS\\n',\n 'src/payload.config.ts': 'template Payload config\\n',\n },\n root: templateRoot,\n })\n writeFiles({\n files: {\n 'src/router.tsx': 'custom router\\n',\n 'src/routes/__root.tsx': 'custom root route\\n',\n 'src/routes/_frontend.tsx': 'custom frontend layout\\n',\n 'src/routes/_frontend/index.tsx': 'custom frontend route\\n',\n 'src/routes/_payload.tsx': 'stale payload layout\\n',\n 'src/routes/_payload/admin.$.tsx': 'stale admin splat\\n',\n 'src/routes/_payload/admin.index.tsx': 'stale admin index\\n',\n 'src/routes/_payload/api.$.ts': 'stale API route\\n',\n 'src/routes/_payload/importMap.js': 'stale import map\\n',\n 'src/routes/_payload/server.functions.ts': 'stale server functions\\n',\n 'src/styles.css': 'custom frontend CSS\\n',\n 'vite.config.ts': 'custom Vite config\\n',\n },\n root: projectDir,\n })\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n const preservedFiles = [\n appDetails.viteConfigPath,\n appDetails.routerPath,\n appDetails.rootRoutePath,\n path.join(appDetails.routesDir, '_frontend.tsx'),\n path.join(appDetails.routesDir, '_frontend/index.tsx'),\n path.join(appDetails.sourceDir, 'styles.css'),\n ]\n const before = new Map(\n preservedFiles.map((filePath) => [filePath, fse.readFileSync(filePath, 'utf8')]),\n )\n\n const result = await updatePayloadInTanStackProject({\n appDetails,\n templateRoot,\n versionOrTag: 'beta',\n })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'utf8')).toBe(\n 'fresh payload layout\\n',\n )\n expect(\n fse.readFileSync(path.join(appDetails.routesDir, '_payload/server.functions.ts'), 'utf8'),\n ).toBe('fresh server functions\\n')\n for (const [filePath, content] of before) {\n expect(fse.readFileSync(filePath, 'utf8')).toBe(content)\n }\n })\n\n it('should refresh TanStack routes from the source template by default', async () => {\n writeProjectPackage(projectDir)\n const payloadLayoutPath = path.join(projectDir, 'src/routes/_payload.tsx')\n const sourcePayloadLayoutPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/app/_payload.tsx',\n )\n fse.outputFileSync(payloadLayoutPath, 'stale payload layout\\n')\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n await updatePayloadInTanStackProject({ appDetails, versionOrTag: 'beta' })\n\n expect(fse.readFileSync(payloadLayoutPath, 'utf8')).toBe(\n fse.readFileSync(sourcePayloadLayoutPath, 'utf8'),\n )\n })\n})\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }): void {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n\nfunction writeProjectPackage(projectDir: string): void {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '^3.0.0',\n payload: '^3.0.0',\n },\n })\n}\n"],"names":["fse","os","path","fileURLToPath","afterEach","beforeEach","describe","expect","it","vi","updatePayloadInNextProject","updatePayloadInTanStackProject","updatePayloadPackages","dirname","url","mocks","hoisted","getPackageManager","fn","installPackages","resolvePackageVersion","mock","importOriginal","projectDir","templateRoot","clearAllMocks","mkdtempSync","join","tmpdir","mockResolvedValue","success","removeSync","writeJsonSync","dependencies","payload","react","result","versionOrTag","toEqual","message","toHaveBeenCalledOnce","toHaveBeenCalledWith","packageName","packageManager","packagesToInstall","devDependencies","vitest","writeProjectPackage","nextConfigPath","payloadDir","importMapPath","customCssPath","sourceImportMapPath","resolve","outputFileSync","appDetails","hasTopLevelLayout","isPayloadInstalled","isSrcDir","isSupportedNextVersion","nextVersion","readFileSync","toBe","writeFiles","files","root","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","preservedFiles","before","Map","map","filePath","content","payloadLayoutPath","sourcePayloadLayoutPath","relativePath","Object","entries"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/update-payload-in-project.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport {\n updatePayloadInNextProject,\n updatePayloadInTanStackProject,\n updatePayloadPackages,\n} from './update-payload-in-project.js'\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst mocks = vi.hoisted(() => ({\n getPackageManager: vi.fn(),\n installPackages: vi.fn(),\n resolvePackageVersion: vi.fn(),\n}))\n\nvi.mock('../utils/resolvePackageVersion.js', async (importOriginal) => ({\n ...(await importOriginal()),\n resolvePackageVersion: mocks.resolvePackageVersion,\n}))\n\nvi.mock('./get-package-manager.js', () => ({\n getPackageManager: mocks.getPackageManager,\n}))\n\nvi.mock('./install-packages.js', () => ({\n installPackages: mocks.installPackages,\n}))\n\ndescribe('Payload project updates', () => {\n let projectDir: string\n let templateRoot: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-project-'))\n templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-template-'))\n mocks.getPackageManager.mockResolvedValue('pnpm')\n mocks.installPackages.mockResolvedValue({ success: true })\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n fse.removeSync(templateRoot)\n })\n\n it('should update every installed Payload dependency to one version without a Next config', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n '@payloadcms/richtext-lexical': '^3.0.0',\n payload: '^3.0.0',\n react: '^19.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.resolvePackageVersion).toHaveBeenCalledOnce()\n expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({\n packageName: 'payload',\n versionOrTag: 'beta',\n })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: [\n 'payload@4.2.0',\n '@payloadcms/db-mongodb@4.2.0',\n '@payloadcms/richtext-lexical@4.2.0',\n ],\n projectDir,\n })\n })\n\n it('should update a stale Payload package when payload is already at the target version', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.2.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0'],\n projectDir,\n })\n })\n\n it('should update Payload packages installed as development dependencies', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.1.0',\n },\n devDependencies: {\n '@payloadcms/graphql': '4.1.0',\n vitest: '^4.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0', '@payloadcms/graphql@4.2.0'],\n projectDir,\n })\n })\n\n it('should refresh Next Payload routes without overwriting custom CSS', async () => {\n writeProjectPackage(projectDir)\n const nextConfigPath = path.join(projectDir, 'next.config.ts')\n const payloadDir = path.join(projectDir, 'src/app/(payload)')\n const importMapPath = path.join(payloadDir, 'admin/importMap.js')\n const customCssPath = path.join(payloadDir, 'custom.css')\n const sourceImportMapPath = path.resolve(\n dirname,\n '../../../../templates/blank/src/app/(payload)/admin/importMap.js',\n )\n fse.outputFileSync(importMapPath, 'stale import map\\n')\n fse.outputFileSync(customCssPath, '.custom { color: rebeccapurple; }\\n')\n\n const appDetails: NextAppDetails = {\n hasTopLevelLayout: false,\n isPayloadInstalled: true,\n isSrcDir: true,\n isSupportedNextVersion: true,\n nextConfigPath,\n nextVersion: '15.0.0',\n }\n\n const result = await updatePayloadInNextProject({ appDetails, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(importMapPath, 'utf8')).toBe(\n fse.readFileSync(sourceImportMapPath, 'utf8'),\n )\n expect(fse.readFileSync(customCssPath, 'utf8')).toBe('.custom { color: rebeccapurple; }\\n')\n })\n\n it('should refresh Payload-owned TanStack files without overwriting custom styles', async () => {\n writeProjectPackage(projectDir)\n writeFiles({\n files: {\n 'routes/_payload.tsx': 'fresh payload layout\\n',\n 'routes/_payload/admin.$.tsx': 'fresh admin splat\\n',\n 'routes/_payload/admin.index.tsx': 'fresh admin index\\n',\n 'routes/_payload/api.$.ts': 'fresh API route\\n',\n 'routes/_payload/importMap.js': 'fresh import map\\n',\n 'routes/_payload/server.functions.ts': 'fresh server functions\\n',\n 'src/payload.css': 'template Payload route CSS\\n',\n 'src/payload.config.ts': 'template Payload config\\n',\n },\n root: templateRoot,\n })\n writeFiles({\n files: {\n 'src/router.tsx': 'custom router\\n',\n 'src/routes/__root.tsx': 'custom root route\\n',\n 'src/routes/_frontend.tsx': 'custom frontend layout\\n',\n 'src/routes/_frontend/index.tsx': 'custom frontend route\\n',\n 'src/routes/_payload.tsx': 'stale payload layout\\n',\n 'src/routes/_payload/admin.$.tsx': 'stale admin splat\\n',\n 'src/routes/_payload/admin.index.tsx': 'stale admin index\\n',\n 'src/routes/_payload/api.$.ts': 'stale API route\\n',\n 'src/routes/_payload/importMap.js': 'stale import map\\n',\n 'src/routes/_payload/server.functions.ts': 'stale server functions\\n',\n 'src/payload.css': 'custom Payload CSS\\n',\n 'src/styles.css': 'custom frontend CSS\\n',\n 'vite.config.ts': 'custom Vite config\\n',\n },\n root: projectDir,\n })\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n const preservedFiles = [\n appDetails.viteConfigPath,\n appDetails.routerPath,\n appDetails.rootRoutePath,\n path.join(appDetails.routesDir, '_frontend.tsx'),\n path.join(appDetails.routesDir, '_frontend/index.tsx'),\n path.join(appDetails.sourceDir, 'payload.css'),\n path.join(appDetails.sourceDir, 'styles.css'),\n ]\n const before = new Map(\n preservedFiles.map((filePath) => [filePath, fse.readFileSync(filePath, 'utf8')]),\n )\n\n const result = await updatePayloadInTanStackProject({\n appDetails,\n templateRoot,\n versionOrTag: 'beta',\n })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'utf8')).toBe(\n 'fresh payload layout\\n',\n )\n expect(\n fse.readFileSync(path.join(appDetails.routesDir, '_payload/server.functions.ts'), 'utf8'),\n ).toBe('fresh server functions\\n')\n for (const [filePath, content] of before) {\n expect(fse.readFileSync(filePath, 'utf8')).toBe(content)\n }\n })\n\n it('should refresh TanStack routes from the source template by default', async () => {\n writeProjectPackage(projectDir)\n const payloadLayoutPath = path.join(projectDir, 'src/routes/_payload.tsx')\n const sourcePayloadLayoutPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/app/_payload.tsx',\n )\n const sourcePayloadStylesPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/payload.css',\n )\n fse.outputFileSync(payloadLayoutPath, 'stale payload layout\\n')\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n await updatePayloadInTanStackProject({ appDetails, versionOrTag: 'beta' })\n\n expect(fse.readFileSync(payloadLayoutPath, 'utf8')).toBe(\n fse.readFileSync(sourcePayloadLayoutPath, 'utf8'),\n )\n expect(fse.readFileSync(path.join(appDetails.sourceDir, 'payload.css'), 'utf8')).toBe(\n fse.readFileSync(sourcePayloadStylesPath, 'utf8'),\n )\n })\n})\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }): void {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n\nfunction writeProjectPackage(projectDir: string): void {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '^3.0.0',\n payload: '^3.0.0',\n },\n })\n}\n"],"names":["fse","os","path","fileURLToPath","afterEach","beforeEach","describe","expect","it","vi","updatePayloadInNextProject","updatePayloadInTanStackProject","updatePayloadPackages","dirname","url","mocks","hoisted","getPackageManager","fn","installPackages","resolvePackageVersion","mock","importOriginal","projectDir","templateRoot","clearAllMocks","mkdtempSync","join","tmpdir","mockResolvedValue","success","removeSync","writeJsonSync","dependencies","payload","react","result","versionOrTag","toEqual","message","toHaveBeenCalledOnce","toHaveBeenCalledWith","packageName","packageManager","packagesToInstall","devDependencies","vitest","writeProjectPackage","nextConfigPath","payloadDir","importMapPath","customCssPath","sourceImportMapPath","resolve","outputFileSync","appDetails","hasTopLevelLayout","isPayloadInstalled","isSrcDir","isSupportedNextVersion","nextVersion","readFileSync","toBe","writeFiles","files","root","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","preservedFiles","before","Map","map","filePath","content","payloadLayoutPath","sourcePayloadLayoutPath","sourcePayloadStylesPath","relativePath","Object","entries"],"mappings":"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"}
|
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
import { payloadLayoutRoute } from '@payloadcms/tanstack-start/client'
|
|
2
2
|
import { createFileRoute } from '@tanstack/react-router'
|
|
3
|
-
import '../payload-foundation.css'
|
|
4
|
-
import '@payloadcms/ui/css/app.css'
|
|
5
3
|
|
|
6
4
|
import { getLayoutDataFn, serverFunctionHandler } from './_payload/server.functions.js'
|
|
5
|
+
import styles from '../payload.css?url'
|
|
7
6
|
|
|
8
|
-
export const Route = createFileRoute('/_payload')(
|
|
9
|
-
|
|
7
|
+
export const Route = createFileRoute('/_payload')({
|
|
8
|
+
head: () => ({
|
|
9
|
+
links: [
|
|
10
|
+
{ rel: 'stylesheet', href: styles },
|
|
11
|
+
{
|
|
12
|
+
rel: 'preconnect',
|
|
13
|
+
href: 'https://fonts.googleapis.com',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
rel: 'preconnect',
|
|
17
|
+
href: 'https://fonts.gstatic.com',
|
|
18
|
+
crossOrigin: 'anonymous',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
rel: 'stylesheet',
|
|
22
|
+
href: 'https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Roboto+Mono:wght@100..700&display=swap',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
}),
|
|
26
|
+
...payloadLayoutRoute({
|
|
10
27
|
load: getLayoutDataFn,
|
|
11
28
|
serverFunction: serverFunctionHandler,
|
|
12
29
|
}),
|
|
13
|
-
)
|
|
30
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import '@payloadcms/ui/css/app.css';
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
@import '../node_modules/@payloadcms/ui/dist/css/preflight.css';
|
|
2
|
-
@import '../node_modules/@payloadcms/ui/dist/css/colors.css';
|
|
3
|
-
@import '../node_modules/@payloadcms/ui/dist/css/theme.css';
|
|
4
|
-
@import '../node_modules/@payloadcms/ui/dist/css/design-tokens.css';
|
|
5
|
-
@import '../node_modules/@payloadcms/ui/dist/css/typography.css';
|
|
6
|
-
@import '../node_modules/@payloadcms/ui/dist/css/spacing.css';
|
|
7
|
-
@import '../node_modules/@payloadcms/ui/dist/css/radius.css';
|
|
8
|
-
@import '../node_modules/@payloadcms/ui/dist/css/elevations.css';
|
|
9
|
-
@import '../node_modules/@payloadcms/ui/dist/css/forms.css';
|
|
10
|
-
@import '../node_modules/@payloadcms/ui/dist/css/utilities.css';
|