create-payload-app 4.0.0-internal.af6aad0 → 4.0.0-internal.b8e7c89

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.
@@ -264,6 +264,7 @@ export default buildConfig({
264
264
  type: 'postgres',
265
265
  envVarName: 'DATABASE_URL'
266
266
  },
267
+ formatWithPrettier: false,
267
268
  storage: 'vercelBlobStorage'
268
269
  });
269
270
  expect(result.success).toBe(true);
@@ -284,7 +285,8 @@ export default buildConfig({
284
285
  db: {
285
286
  type: 'mongodb',
286
287
  envVarName: 'MONGO_URL'
287
- }
288
+ },
289
+ formatWithPrettier: false
288
290
  });
289
291
  expect(result.success).toBe(true);
290
292
  const content = fs.readFileSync(filePath, 'utf-8');
@@ -304,6 +306,7 @@ export default buildConfig({
304
306
  })`);
305
307
  const { configurePayloadConfig } = await import('./payload-config');
306
308
  const result = await configurePayloadConfig(filePath, {
309
+ formatWithPrettier: false,
307
310
  removeSharp: true
308
311
  });
309
312
  expect(result.success).toBe(true);
@@ -350,7 +353,8 @@ export default buildConfig({
350
353
  db: {
351
354
  type: 'postgres',
352
355
  envVarName: 'DATABASE_URL'
353
- }
356
+ },
357
+ formatWithPrettier: false
354
358
  });
355
359
  expect(result.success).toBe(true);
356
360
  // Verify config was updated
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/payload-config.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { Project } from 'ts-morph'\nimport {\n addDatabaseAdapter,\n addStorageAdapter,\n detectPayloadConfigStructure,\n removeSharp,\n} from './payload-config'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('detectPayloadConfigStructure', () => {\n it('successfully detects buildConfig call', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n plugins: []\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('fails when buildConfig call not found', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('payload.config.ts', `export default {}`)\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n expect(result.error?.technicalDetails).toContain('CallExpression')\n })\n\n it('detects buildConfig in variable declaration', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst config = buildConfig({\n db: mongooseAdapter({ url: '' })\n})\n\nexport default config`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects import alias edge case', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig as createConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default createConfig({\n db: mongooseAdapter({ url: '' }),\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasImportAlias).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects multiple buildConfig calls', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst helper = buildConfig({ collections: [] })\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.multipleBuildConfigCalls).toBe(true)\n })\n\n it('detects other Payload imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig, CollectionConfig } from 'payload'\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasOtherPayloadImports).toBe(true)\n })\n})\n\ndescribe('addDatabaseAdapter', () => {\n it.each([\n {\n adapter: 'mongodb' as const,\n adapterName: 'mongooseAdapter',\n packageName: '@payloadcms/db-mongodb',\n },\n {\n adapter: 'postgres' as const,\n adapterName: 'postgresAdapter',\n packageName: '@payloadcms/db-postgres',\n },\n ])('adds $adapter adapter with import and config', ({ adapter, adapterName, packageName }) => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter,\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n\n const text = sourceFile.getText()\n expect(text).toMatch(\n new RegExp(`import.*${adapterName}.*from.*${packageName.replace('/', '\\\\/')}`),\n )\n expect(text).toContain(`db: ${adapterName}`)\n expect(text).toContain('process.env.DATABASE_URL')\n })\n\n it('replaces existing db adapter', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter: 'postgres',\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*postgresAdapter.*from.*@payloadcms\\/db-postgres/)\n expect(text).toContain('db: postgresAdapter')\n expect(text).not.toContain('mongooseAdapter')\n expect(text).not.toContain('@payloadcms/db-mongodb')\n })\n})\n\ndescribe('addStorageAdapter', () => {\n it('adds vercelBlobStorage adapter to plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'vercelBlobStorage' })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*vercelBlobStorage.*from.*@payloadcms\\/storage-vercel-blob/)\n expect(text).toContain('vercelBlobStorage(')\n })\n\n it('creates plugins array if missing', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'r2Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('plugins: [')\n expect(text).toContain('r2Storage(')\n })\n\n it('adds to existing plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: [\n someOtherPlugin()\n ]\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 's3Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('someOtherPlugin()')\n expect(text).toContain('s3Storage(')\n })\n})\n\ndescribe('removeSharp', () => {\n it('removes sharp import and property', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\n\nexport default buildConfig({\n sharp,\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n const text = sourceFile.getText()\n expect(text).not.toContain(\"import sharp from 'sharp'\")\n expect(text).not.toContain('sharp,')\n })\n\n it('does nothing if sharp not present', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(false)\n })\n})\n\ndescribe('configurePayloadConfig', () => {\n let tempDir: string\n\n beforeEach(() => {\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'))\n })\n\n afterEach(() => {\n fs.rmSync(tempDir, { recursive: true, force: true })\n })\n\n it('applies all transformations in one call (db + storage)', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n storage: 'vercelBlobStorage',\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('vercelBlobStorage')\n expect(content).toContain('DATABASE_URL')\n })\n\n it('applies db transformation only', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'mongodb', envVarName: 'MONGO_URL' },\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('mongooseAdapter')\n expect(content).toContain('MONGO_URL')\n })\n\n it('applies removeSharp transformation', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n sharp,\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n removeSharp: true,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).not.toContain(\"import sharp from 'sharp'\")\n expect(content).not.toContain('sharp,')\n })\n\n it('handles transformation errors gracefully', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `export default {}`, // Invalid structure\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n })\n\n it('handles file not found error', async () => {\n const filePath = path.join(tempDir, 'nonexistent.ts')\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error).toBeDefined()\n })\n\n it('replaces adapter in config file', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: process.env.DATABASE_URL || '' }),\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(true)\n\n // Verify config was updated\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('@payloadcms/db-postgres')\n expect(content).not.toContain('mongooseAdapter')\n expect(content).not.toContain('@payloadcms/db-mongodb')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","Project","addDatabaseAdapter","addStorageAdapter","detectPayloadConfigStructure","removeSharp","fs","path","os","project","useInMemoryFileSystem","sourceFile","createSourceFile","result","success","toBe","structures","buildConfigCall","toBeDefined","error","userMessage","toContain","technicalDetails","edgeCases","hasImportAlias","multipleBuildConfigCalls","hasOtherPayloadImports","each","adapter","adapterName","packageName","envVarName","modified","modifications","length","toBeGreaterThan","text","getText","toMatch","RegExp","replace","not","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","filePath","writeFileSync","configurePayloadConfig","db","type","storage","content","readFileSync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/ast/payload-config.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { Project } from 'ts-morph'\nimport {\n addDatabaseAdapter,\n addStorageAdapter,\n detectPayloadConfigStructure,\n removeSharp,\n} from './payload-config'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('detectPayloadConfigStructure', () => {\n it('successfully detects buildConfig call', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n plugins: []\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('fails when buildConfig call not found', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('payload.config.ts', `export default {}`)\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n expect(result.error?.technicalDetails).toContain('CallExpression')\n })\n\n it('detects buildConfig in variable declaration', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst config = buildConfig({\n db: mongooseAdapter({ url: '' })\n})\n\nexport default config`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects import alias edge case', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig as createConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default createConfig({\n db: mongooseAdapter({ url: '' }),\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasImportAlias).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects multiple buildConfig calls', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst helper = buildConfig({ collections: [] })\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.multipleBuildConfigCalls).toBe(true)\n })\n\n it('detects other Payload imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig, CollectionConfig } from 'payload'\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasOtherPayloadImports).toBe(true)\n })\n})\n\ndescribe('addDatabaseAdapter', () => {\n it.each([\n {\n adapter: 'mongodb' as const,\n adapterName: 'mongooseAdapter',\n packageName: '@payloadcms/db-mongodb',\n },\n {\n adapter: 'postgres' as const,\n adapterName: 'postgresAdapter',\n packageName: '@payloadcms/db-postgres',\n },\n ])('adds $adapter adapter with import and config', ({ adapter, adapterName, packageName }) => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter,\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n\n const text = sourceFile.getText()\n expect(text).toMatch(\n new RegExp(`import.*${adapterName}.*from.*${packageName.replace('/', '\\\\/')}`),\n )\n expect(text).toContain(`db: ${adapterName}`)\n expect(text).toContain('process.env.DATABASE_URL')\n })\n\n it('replaces existing db adapter', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter: 'postgres',\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*postgresAdapter.*from.*@payloadcms\\/db-postgres/)\n expect(text).toContain('db: postgresAdapter')\n expect(text).not.toContain('mongooseAdapter')\n expect(text).not.toContain('@payloadcms/db-mongodb')\n })\n})\n\ndescribe('addStorageAdapter', () => {\n it('adds vercelBlobStorage adapter to plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'vercelBlobStorage' })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*vercelBlobStorage.*from.*@payloadcms\\/storage-vercel-blob/)\n expect(text).toContain('vercelBlobStorage(')\n })\n\n it('creates plugins array if missing', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'r2Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('plugins: [')\n expect(text).toContain('r2Storage(')\n })\n\n it('adds to existing plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: [\n someOtherPlugin()\n ]\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 's3Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('someOtherPlugin()')\n expect(text).toContain('s3Storage(')\n })\n})\n\ndescribe('removeSharp', () => {\n it('removes sharp import and property', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\n\nexport default buildConfig({\n sharp,\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n const text = sourceFile.getText()\n expect(text).not.toContain(\"import sharp from 'sharp'\")\n expect(text).not.toContain('sharp,')\n })\n\n it('does nothing if sharp not present', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(false)\n })\n})\n\ndescribe('configurePayloadConfig', () => {\n let tempDir: string\n\n beforeEach(() => {\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'))\n })\n\n afterEach(() => {\n fs.rmSync(tempDir, { recursive: true, force: true })\n })\n\n it('applies all transformations in one call (db + storage)', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n formatWithPrettier: false,\n storage: 'vercelBlobStorage',\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('vercelBlobStorage')\n expect(content).toContain('DATABASE_URL')\n })\n\n it('applies db transformation only', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'mongodb', envVarName: 'MONGO_URL' },\n formatWithPrettier: false,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('mongooseAdapter')\n expect(content).toContain('MONGO_URL')\n })\n\n it('applies removeSharp transformation', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n sharp,\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n formatWithPrettier: false,\n removeSharp: true,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).not.toContain(\"import sharp from 'sharp'\")\n expect(content).not.toContain('sharp,')\n })\n\n it('handles transformation errors gracefully', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `export default {}`, // Invalid structure\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n })\n\n it('handles file not found error', async () => {\n const filePath = path.join(tempDir, 'nonexistent.ts')\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error).toBeDefined()\n })\n\n it('replaces adapter in config file', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: process.env.DATABASE_URL || '' }),\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n formatWithPrettier: false,\n })\n\n expect(result.success).toBe(true)\n\n // Verify config was updated\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('@payloadcms/db-postgres')\n expect(content).not.toContain('mongooseAdapter')\n expect(content).not.toContain('@payloadcms/db-mongodb')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","Project","addDatabaseAdapter","addStorageAdapter","detectPayloadConfigStructure","removeSharp","fs","path","os","project","useInMemoryFileSystem","sourceFile","createSourceFile","result","success","toBe","structures","buildConfigCall","toBeDefined","error","userMessage","toContain","technicalDetails","edgeCases","hasImportAlias","multipleBuildConfigCalls","hasOtherPayloadImports","each","adapter","adapterName","packageName","envVarName","modified","modifications","length","toBeGreaterThan","text","getText","toMatch","RegExp","replace","not","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","filePath","writeFileSync","configurePayloadConfig","db","type","formatWithPrettier","storage","content","readFileSync"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AA2DpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Gf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AA+GpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Gf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
@@ -14,6 +14,7 @@ import { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js';
14
14
  import { downloadExample } from './download-example.js';
15
15
  import { downloadTemplate } from './download-template.js';
16
16
  import { generateSecret } from './generate-secret.js';
17
+ import { getInstallCommand, getRunCommand } from './get-package-manager.js';
17
18
  import { manageEnvFiles } from './manage-env-files.js';
18
19
  const filename = fileURLToPath(import.meta.url);
19
20
  const dirname = path.dirname(filename);
@@ -28,14 +29,7 @@ async function installDeps(args) {
28
29
  if (cliArgs['--no-deps']) {
29
30
  return true;
30
31
  }
31
- let installCmd = 'npm install --legacy-peer-deps';
32
- if (packageManager === 'yarn') {
33
- installCmd = 'yarn';
34
- } else if (packageManager === 'pnpm') {
35
- installCmd = 'pnpm install';
36
- } else if (packageManager === 'bun') {
37
- installCmd = 'bun install';
38
- }
32
+ const installCmd = getInstallCommand(packageManager);
39
33
  await ensurePnpmBuildApprovals({
40
34
  packageManager,
41
35
  projectDir
@@ -50,6 +44,50 @@ async function installDeps(args) {
50
44
  return false;
51
45
  }
52
46
  }
47
+ async function runPayloadCommand(args) {
48
+ const { command, packageManager, projectDir } = args;
49
+ try {
50
+ await execa.command(`${getRunCommand(packageManager)} ${command}`, {
51
+ cwd: path.resolve(projectDir)
52
+ });
53
+ return {
54
+ ok: true
55
+ };
56
+ } catch (err) {
57
+ return {
58
+ error: err instanceof Error ? err.message : String(err),
59
+ ok: false
60
+ };
61
+ }
62
+ }
63
+ /** Non-fatal: on failure, warn with the command to run later. */ async function runPayloadGenerate(args) {
64
+ const { artifact, command, packageManager, projectDir, spinner } = args;
65
+ spinner.start(`Generating ${artifact}...`);
66
+ const result = await runPayloadCommand({
67
+ command,
68
+ packageManager,
69
+ projectDir
70
+ });
71
+ const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1);
72
+ if (result.ok) {
73
+ spinner.stop(`${capitalized} generated`);
74
+ return;
75
+ }
76
+ spinner.stop(`Could not generate ${artifact}`, 1);
77
+ warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`);
78
+ }
79
+ async function runProjectCodegen(args) {
80
+ await runPayloadGenerate({
81
+ ...args,
82
+ artifact: 'import map',
83
+ command: 'generate:importmap'
84
+ });
85
+ await runPayloadGenerate({
86
+ ...args,
87
+ artifact: 'types',
88
+ command: 'generate:types'
89
+ });
90
+ }
53
91
  export async function createProject(args) {
54
92
  const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args;
55
93
  if (cliArgs['--dry-run']) {
@@ -140,6 +178,11 @@ export async function createProject(args) {
140
178
  });
141
179
  if (result) {
142
180
  spinner.stop('Successfully installed Payload and dependencies');
181
+ await runProjectCodegen({
182
+ packageManager,
183
+ projectDir,
184
+ spinner
185
+ });
143
186
  } else {
144
187
  spinner.stop('Error installing dependencies', 1);
145
188
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { buildAgentConfigFiles } from './agent-config.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n let installCmd = 'npm install --legacy-peer-deps'\n\n if (packageManager === 'yarn') {\n installCmd = 'yarn'\n } else if (packageManager === 'pnpm') {\n installCmd = 'pnpm install'\n } else if (packageManager === 'bun') {\n installCmd = 'bun install'\n }\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG\n\n const spinner = p.spinner()\n spinner.start(`Resolving Payload version (${versionOrTag})...`)\n\n const payloadVersion = await resolvePackageVersion({\n packageName: 'payload',\n versionOrTag,\n })\n\n spinner.stop(`Using Payload version ${payloadVersion}`)\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (!cliArgs['--no-agent']) {\n for (const { content, fileName } of buildAgentConfigFiles()) {\n await fse.writeFile(path.resolve(projectDir, fileName), content)\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","buildAgentConfigFiles","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadTemplate","generateSecret","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","versionOrTag","spinner","start","payloadVersion","packageName","stop","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","content","fileName","writeFile","result","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { buildAgentConfigFiles } from './agent-config.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { getInstallCommand, getRunCommand } from './get-package-manager.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n const installCmd = getInstallCommand(packageManager)\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype PayloadGenerateResult = { error: string; ok: false } | { ok: true }\n\nasync function runPayloadCommand(args: {\n command: string\n packageManager: PackageManager\n projectDir: string\n}): Promise<PayloadGenerateResult> {\n const { command, packageManager, projectDir } = args\n\n try {\n await execa.command(`${getRunCommand(packageManager)} ${command}`, {\n cwd: path.resolve(projectDir),\n })\n return { ok: true }\n } catch (err: unknown) {\n return { error: err instanceof Error ? err.message : String(err), ok: false }\n }\n}\n\n/** Non-fatal: on failure, warn with the command to run later. */\nasync function runPayloadGenerate(args: {\n artifact: string\n command: string\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n const { artifact, command, packageManager, projectDir, spinner } = args\n\n spinner.start(`Generating ${artifact}...`)\n const result = await runPayloadCommand({ command, packageManager, projectDir })\n const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1)\n\n if (result.ok) {\n spinner.stop(`${capitalized} generated`)\n return\n }\n\n spinner.stop(`Could not generate ${artifact}`, 1)\n warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`)\n}\n\nasync function runProjectCodegen(args: {\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n await runPayloadGenerate({\n ...args,\n artifact: 'import map',\n command: 'generate:importmap',\n })\n await runPayloadGenerate({\n ...args,\n artifact: 'types',\n command: 'generate:types',\n })\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG\n\n const spinner = p.spinner()\n spinner.start(`Resolving Payload version (${versionOrTag})...`)\n\n const payloadVersion = await resolvePackageVersion({\n packageName: 'payload',\n versionOrTag,\n })\n\n spinner.stop(`Using Payload version ${payloadVersion}`)\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (!cliArgs['--no-agent']) {\n for (const { content, fileName } of buildAgentConfigFiles()) {\n await fse.writeFile(path.resolve(projectDir, fileName), content)\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n\n await runProjectCodegen({ packageManager, projectDir, spinner })\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","buildAgentConfigFiles","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadTemplate","generateSecret","getInstallCommand","getRunCommand","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","runPayloadCommand","ok","String","runPayloadGenerate","artifact","spinner","start","result","capitalized","charAt","toUpperCase","slice","stop","runProjectCodegen","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","versionOrTag","payloadVersion","packageName","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","content","fileName","writeFile","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith"],"mappings":"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"}
@@ -3,4 +3,13 @@ export declare function getPackageManager(args: {
3
3
  cliArgs?: CliArgs;
4
4
  projectDir: string;
5
5
  }): Promise<PackageManager>;
6
+ /**
7
+ * The command that installs every dependency listed in package.json.
8
+ */
9
+ export declare function getInstallCommand(packageManager: PackageManager): string;
10
+ /**
11
+ * The prefix that runs a package.json script. npm needs `npm run <script>`, while
12
+ * pnpm, yarn, and bun run scripts directly.
13
+ */
14
+ export declare function getRunCommand(packageManager: PackageManager): string;
6
15
  //# sourceMappingURL=get-package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B"}
1
+ {"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAWxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAEpE"}
@@ -25,6 +25,26 @@ export async function getPackageManager(args) {
25
25
  return 'npm';
26
26
  }
27
27
  }
28
+ /**
29
+ * The command that installs every dependency listed in package.json.
30
+ */ export function getInstallCommand(packageManager) {
31
+ if (packageManager === 'yarn') {
32
+ return 'yarn';
33
+ }
34
+ if (packageManager === 'pnpm') {
35
+ return 'pnpm install';
36
+ }
37
+ if (packageManager === 'bun') {
38
+ return 'bun install';
39
+ }
40
+ return 'npm install --legacy-peer-deps';
41
+ }
42
+ /**
43
+ * The prefix that runs a package.json script. npm needs `npm run <script>`, while
44
+ * pnpm, yarn, and bun run scripts directly.
45
+ */ export function getRunCommand(packageManager) {
46
+ return packageManager === 'npm' ? 'npm run' : packageManager;
47
+ }
28
48
  function getEnvironmentPackageManager() {
29
49
  const userAgent = process.env.npm_config_user_agent || '';
30
50
  if (userAgent.startsWith('yarn')) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA,SAASD;IACP,MAAME,YAAYC,QAAQC,GAAG,CAACC,qBAAqB,IAAI;IAEvD,IAAIH,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,QAAQ;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeP,cAAcQ,OAAe;IAC1C,IAAI;QACF,MAAMhB,MAAMgB,OAAO,CAACJ,QAAQK,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAED,SAAS,GAAG,CAAC,WAAW,EAAEA,SAAS;QAC/F,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\n/**\n * The command that installs every dependency listed in package.json.\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n if (packageManager === 'yarn') {\n return 'yarn'\n }\n if (packageManager === 'pnpm') {\n return 'pnpm install'\n }\n if (packageManager === 'bun') {\n return 'bun install'\n }\n return 'npm install --legacy-peer-deps'\n}\n\n/**\n * The prefix that runs a package.json script. npm needs `npm run <script>`, while\n * pnpm, yarn, and bun run scripts directly.\n */\nexport function getRunCommand(packageManager: PackageManager): string {\n return packageManager === 'npm' ? 'npm run' : packageManager\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","getInstallCommand","packageManager","getRunCommand","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,kBAAkBC,cAA8B;IAC9D,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,OAAO;QAC5B,OAAO;IACT;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASC,cAAcD,cAA8B;IAC1D,OAAOA,mBAAmB,QAAQ,YAAYA;AAChD;AAEA,SAASH;IACP,MAAMK,YAAYC,QAAQC,GAAG,CAACC,qBAAqB,IAAI;IAEvD,IAAIH,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,QAAQ;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeV,cAAcW,OAAe;IAC1C,IAAI;QACF,MAAMnB,MAAMmB,OAAO,CAACJ,QAAQK,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAED,SAAS,GAAG,CAAC,WAAW,EAAEA,SAAS;QAC/F,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
@@ -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 copy a Payload layout whose foundation CSS import does not require a host alias', async ()=>{
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-foundation.css'");
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 copy a Payload layout whose foundation CSS import does not require a host alias', 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 '../payload-foundation.css'\",\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"],"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","relativePath","content","Object","entries","outputFileSync"],"mappings":"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"}
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-foundation.css': '@layer payload-default, payload;\n',
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-foundation.css')
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-foundation.css';
44
- readonly sourcePath: 'payload-foundation.css';
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,wBAAwB;aACtC,UAAU,EAAE,wBAAwB;;aAGpC,WAAW,EAAE,KAAK;aAClB,YAAY,EAAE,mBAAmB;aACjC,UAAU,EAAE,mBAAmB;EAEzB,CAAA"}
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"}
@@ -51,8 +51,8 @@ export const TANSTACK_TEMPLATE_FILES = [
51
51
  },
52
52
  {
53
53
  destination: 'src',
54
- relativePath: 'payload-foundation.css',
55
- sourcePath: 'payload-foundation.css'
54
+ relativePath: 'payload.css',
55
+ sourcePath: 'payload.css'
56
56
  },
57
57
  {
58
58
  destination: 'src',
@@ -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-foundation.css',\n sourcePath: 'payload-foundation.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
+ {"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,CA2BxB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,cAAc,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CAEvB"}
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
- if (destination !== 'routes' || !relativePath.startsWith('_payload')) {
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":"AAAA,OAAOA,SAAS,WAAU;AAC1B,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,UAAU,OAAM;AAIvB,SAASC,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,IAAI,QAAQ,kBAAiB;AACtC,SAASC,qBAAqB,QAAQ,oCAAmC;AACzE,SAASC,iBAAiB,QAAQ,2BAA0B;AAC5D,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,uBAAuB,QAAQ,+BAA8B;AAEtE,MAAMC,WAAWR,cAAc,YAAYS,GAAG;AAC9C,MAAMC,UAAUT,KAAKS,OAAO,CAACF;AAM7B,OAAO,eAAeG,sBAAsB,EAC1CC,UAAU,EACVC,YAAY,EAIb;IACC,MAAMC,SAAS,MAAMC,4BAA4B;QAAEH;QAAYC;IAAa;IAE5E,OAAO;QAAEG,SAASF,OAAOE,OAAO;QAAEC,SAASH,OAAOG,OAAO;IAAC;AAC5D;AAEA,OAAO,eAAeC,2BAA2B,EAC/CC,UAAU,EACVN,YAAY,EAIb;IACC,IAAI,CAACM,WAAWC,cAAc,EAAE;QAC9B,OAAO;YAAEJ,SAAS;YAA2BC,SAAS;QAAM;IAC9D;IAEA,MAAML,aAAaX,KAAKS,OAAO,CAACS,WAAWC,cAAc;IACzD,MAAMC,gBAAgB,MAAMN,4BAA4B;QAAEH;QAAYC;IAAa;IAEnF,IAAI,CAACQ,cAAcC,SAAS,EAAE;QAC5B,OAAO;YAAEN,SAASK,cAAcL,OAAO;YAAEC,SAASI,cAAcJ,OAAO;QAAC;IAC1E;IAEAd,KAAK,CAAC,iCAAiC,CAAC;IAExC,MAAMoB,oBACJC,QAAQC,GAAG,CAACC,cAAc,KAAKC,YAC3B1B,KAAK2B,OAAO,CAAClB,SAAS,iCACtBT,KAAK2B,OAAO,CAAClB,SAAS,SAAS;IAErC,MAAMmB,iBAAiB5B,KAAK2B,OAAO,CAACL,mBAAmB;IACvD,MAAMO,iBAAiB7B,KAAK2B,OAAO,CACjChB,YACAO,WAAWY,QAAQ,GAAG,YAAY,OAClC;IAGF,MAAMC,yBAAyB/B,KAAK2B,OAAO,CAACE,gBAAgB;IAC5D,MAAMG,gBAAgBhC,KAAK2B,OAAO,CAACE,gBAAgB;IAEnD,IAAI/B,IAAImC,UAAU,CAACF,2BAA2B,CAACjC,IAAImC,UAAU,CAACD,gBAAgB;QAC5ElC,IAAIoC,UAAU,CAACH,wBAAwBC;QACvC9B,KACE;IAEJ;IAEAD,kBAAkB2B,gBAAgBC,gBAAgB;QAAC;KAAc;IAEjE,OAAO;QAAEd,SAASK,cAAcL,OAAO;QAAEC,SAASI,cAAcJ,OAAO;IAAC;AAC1E;AAEA,OAAO,eAAemB,+BAA+B,EACnDjB,UAAU,EACVkB,eAAeC,6BAA6B,EAC5CzB,YAAY,EAKb;IACC,MAAMQ,gBAAgB,MAAMN,4BAA4B;QACtDH,YAAYO,WAAWP,UAAU;QACjCC;IACF;IAEA,IAAI,CAACQ,cAAcC,SAAS,EAAE;QAC5B,OAAO;YAAEN,SAASK,cAAcL,OAAO;YAAEC,SAASI,cAAcJ,OAAO;QAAC;IAC1E;IAEAd,KAAK,CAAC,kCAAkC,CAAC;IACzC,MAAMoC,0BAA0BxC,IAAImC,UAAU,CAACjC,KAAKuC,IAAI,CAACH,cAAc;IAEvE,KAAK,MAAM,EAAEI,WAAW,EAAEC,YAAY,EAAEC,UAAU,EAAE,IAAIpC,wBAAyB;QAC/E,MAAMqC,iBAAiBH,gBAAgB,YAAYC,aAAaG,UAAU,CAAC;QAC3E,MAAMC,kBAAkBL,gBAAgB,SAASC,iBAAiB;QAElE,IAAI,CAACE,kBAAkB,CAACE,iBAAiB;YACvC;QACF;QAEA,MAAMC,kBAAkB9C,KAAKuC,IAAI,CAC/BC,gBAAgB,WAAWtB,WAAW6B,SAAS,GAAG7B,WAAW8B,SAAS,EACtEP;QAEF,IAAII,mBAAmB/C,IAAImC,UAAU,CAACa,kBAAkB;YACtD;QACF;QAEA,MAAMG,eAAeX,0BACjBtC,KAAKuC,IAAI,CAACH,cAAcI,aAAaC,gBACrCzC,KAAKuC,IAAI,CAACH,cAAcM;QAC5B5C,IAAIoD,aAAa,CAAClD,KAAKS,OAAO,CAACqC;QAC/BhD,IAAIqD,YAAY,CAACF,cAAcH;IACjC;IAEA,OAAO;QAAE/B,SAASK,cAAcL,OAAO;QAAEC,SAASI,cAAcJ,OAAO;IAAC;AAC1E;AAEA,OAAO,eAAeoC,uBACpBlC,UAA0B,EAC1BN,YAAqB;IAErB,OAAOK,2BAA2B;QAAEC;QAAYN;IAAa;AAC/D;AAEA,eAAeE,4BAA4B,EACzCH,UAAU,EACVC,YAAY,EAIb;IACC,MAAMyC,aAAc,MAAMvD,IAAIwD,QAAQ,CAACtD,KAAK2B,OAAO,CAAChB,YAAY;IAIhE,IAAI,CAAC0C,WAAWE,YAAY,IAAI,CAACF,WAAWG,eAAe,EAAE;QAC3D,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,mBAAmB;QAACL,WAAWE,YAAY;QAAEF,WAAWG,eAAe;KAAC,CAACG,MAAM,CACnF,CAACJ,eAAyDK,QAAQL;IAEpE,MAAMM,wBAAwBH,iBAAiBI,OAAO,CAAC,CAACP,eACtDQ,OAAOC,OAAO,CAACT,cAAcI,MAAM,CACjC,CAAC,CAACM,YAAY,GAAKA,gBAAgB,aAAaA,YAAYrB,UAAU,CAAC;IAG3E,MAAMsB,iBAAiBL,sBAAsBM,IAAI,CAC/C,CAAC,CAACF,YAAY,GAAKA,gBAAgB,YAClC,CAAC,EAAE;IACN,IAAI,CAACC,gBAAgB;QACnB,MAAM,IAAIT,MAAM;IAClB;IAEA,MAAMW,iBAAiB,MAAMhE,kBAAkB;QAAEO;IAAW;IAC5D,MAAM0D,uBAAuB,MAAMlE,sBAAsB;QAAE8D,aAAa;QAAWrD;IAAa;IAEhG,IAAIiD,sBAAsBS,KAAK,CAAC,CAAC,GAAGC,QAAQ,GAAKA,YAAYF,uBAAuB;QAClF,OAAO;YACLhD,WAAW;YACXN,SAAS,CAAC,SAAS,EAAEmD,eAAe,uBAAuB,CAAC;YAC5DlD,SAAS;QACX;IACF;IAEA,MAAMwD,kBAAkBX,sBACrBY,GAAG,CAAC,CAAC,CAACR,YAAY,GAAKA,aACvBN,MAAM,CAAC,CAACM,cAAgBA,YAAYrB,UAAU,CAAC;IAClD,MAAM8B,eAAe;QAAC;WAAc,IAAIC,IAAIH;KAAiB;IAC7D,MAAMI,mBAAmBF,aAAaD,GAAG,CACvC,CAACR,cAAgB,GAAGA,YAAY,CAAC,EAAEI,sBAAsB;IAG3DnE,KAAK,CAAC,MAAM,EAAEkE,eAAe,GAAG,CAAC;IACjClE,KACE,CAAC,SAAS,EAAE0E,iBAAiBC,MAAM,CAAC,sBAAsB,EAAER,qBAAqB,OAAO,EAAEK,aAAaD,GAAG,CAAC,CAACR,cAAgB,CAAC,IAAI,EAAEA,aAAa,EAAE1B,IAAI,CAAC,OAAO;IAGhK,MAAM,EAAEvB,SAAS8D,aAAa,EAAE,GAAG,MAAMzE,gBAAgB;QACvD+D;QACAW,mBAAmBH;QACnBjE;IACF;IAEA,IAAI,CAACmE,eAAe;QAClB,MAAM,IAAIrB,MAAM;IAClB;IACAvD,KAAK;IAEL,OAAO;QAAEmB,WAAW;QAAMN,SAAS;QAAiCC,SAAS;IAAK;AACpF;AAEA,SAASqB;IACP,OAAOrC,KAAKgF,QAAQ,CAAChF,KAAKS,OAAO,CAACA,cAAc,SAC5CT,KAAK2B,OAAO,CAAClB,SAAS,0BACtBT,KAAK2B,OAAO,CAAClB,SAAS;AAC5B"}
@@ -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 only Payload-owned TanStack route files', async ()=>{
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-foundation.css': 'template Payload CSS\n',
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
- payloadLayoutRoute({
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,6 +1,6 @@
1
1
  {
2
2
  "name": "create-payload-app",
3
- "version": "4.0.0-internal.af6aad0",
3
+ "version": "4.0.0-internal.b8e7c89",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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';