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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/lib/agent-config.d.ts +2 -5
  2. package/dist/lib/agent-config.d.ts.map +1 -1
  3. package/dist/lib/agent-config.js +1 -8
  4. package/dist/lib/agent-config.js.map +1 -1
  5. package/dist/lib/create-project.d.ts.map +1 -1
  6. package/dist/lib/create-project.js +51 -8
  7. package/dist/lib/create-project.js.map +1 -1
  8. package/dist/lib/get-package-manager.d.ts +9 -0
  9. package/dist/lib/get-package-manager.d.ts.map +1 -1
  10. package/dist/lib/get-package-manager.js +20 -0
  11. package/dist/lib/get-package-manager.js.map +1 -1
  12. package/dist/lib/tanstack/template-files.d.ts +2 -2
  13. package/dist/lib/tanstack/template-files.d.ts.map +1 -1
  14. package/dist/lib/tanstack/template-files.js +2 -2
  15. package/dist/lib/tanstack/template-files.js.map +1 -1
  16. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  17. package/dist/lib/update-payload-in-project.js +7 -2
  18. package/dist/lib/update-payload-in-project.js.map +1 -1
  19. package/dist/main.d.ts.map +1 -1
  20. package/dist/main.js +0 -1
  21. package/dist/main.js.map +1 -1
  22. package/dist/template/src/app/(frontend)/styles.css +7 -0
  23. package/dist/template/src/app/(payload)/admin/importMap.js +17 -0
  24. package/dist/template/src/payload-types.ts +72 -1
  25. package/dist/template/src/payload.config.ts +8 -0
  26. package/dist/template-tanstack/routes/_payload.tsx +22 -5
  27. package/dist/template-tanstack/src/payload.css +1 -0
  28. package/dist/utils/messages.js +1 -1
  29. package/dist/utils/messages.js.map +1 -1
  30. package/package.json +2 -2
  31. package/dist/ast-integration.spec.js +0 -132
  32. package/dist/ast-integration.spec.js.map +0 -1
  33. package/dist/lib/agent-config.spec.js +0 -23
  34. package/dist/lib/agent-config.spec.js.map +0 -1
  35. package/dist/lib/ast/package-json.spec.js +0 -139
  36. package/dist/lib/ast/package-json.spec.js.map +0 -1
  37. package/dist/lib/ast/payload-config.spec.js +0 -365
  38. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  39. package/dist/lib/ast/utils.spec.js +0 -226
  40. package/dist/lib/ast/utils.spec.js.map +0 -1
  41. package/dist/lib/configure-payload-tsconfig.spec.js +0 -135
  42. package/dist/lib/configure-payload-tsconfig.spec.js.map +0 -1
  43. package/dist/lib/create-project.spec.js +0 -199
  44. package/dist/lib/create-project.spec.js.map +0 -1
  45. package/dist/lib/init-tanstack-default-template.spec.js +0 -119
  46. package/dist/lib/init-tanstack-default-template.spec.js.map +0 -1
  47. package/dist/lib/init-tanstack.spec.js +0 -394
  48. package/dist/lib/init-tanstack.spec.js.map +0 -1
  49. package/dist/lib/manage-env-files.spec.js +0 -118
  50. package/dist/lib/manage-env-files.spec.js.map +0 -1
  51. package/dist/lib/tanstack/detect.spec.js +0 -227
  52. package/dist/lib/tanstack/detect.spec.js.map +0 -1
  53. package/dist/lib/tanstack/prepare.spec.js +0 -288
  54. package/dist/lib/tanstack/prepare.spec.js.map +0 -1
  55. package/dist/lib/tanstack/transform-root-route.spec.js +0 -484
  56. package/dist/lib/tanstack/transform-root-route.spec.js.map +0 -1
  57. package/dist/lib/tanstack/transform-router.spec.js +0 -264
  58. package/dist/lib/tanstack/transform-router.spec.js.map +0 -1
  59. package/dist/lib/tanstack/transform-vite-config.spec.js +0 -456
  60. package/dist/lib/tanstack/transform-vite-config.spec.js.map +0 -1
  61. package/dist/lib/update-payload-in-project.spec.js +0 -258
  62. package/dist/lib/update-payload-in-project.spec.js.map +0 -1
  63. package/dist/lib/wrap-next-config.spec.js +0 -167
  64. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  65. package/dist/main.spec.js +0 -102
  66. package/dist/main.spec.js.map +0 -1
  67. package/dist/template-tanstack/src/payload-foundation.css +0 -10
  68. package/dist/utils/resolvePackageVersion.spec.js +0 -77
  69. package/dist/utils/resolvePackageVersion.spec.js.map +0 -1
@@ -28,6 +28,7 @@ body {
28
28
  margin: 0;
29
29
  color: rgb(1000, 1000, 1000);
30
30
 
31
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
31
32
  @media (max-width: 1024px) {
32
33
  font-size: 15px;
33
34
  line-height: 24px;
@@ -46,17 +47,20 @@ h1 {
46
47
  line-height: 70px;
47
48
  font-weight: bold;
48
49
 
50
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
49
51
  @media (max-width: 1024px) {
50
52
  margin: 24px 0;
51
53
  font-size: 42px;
52
54
  line-height: 42px;
53
55
  }
54
56
 
57
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
55
58
  @media (max-width: 768px) {
56
59
  font-size: 38px;
57
60
  line-height: 38px;
58
61
  }
59
62
 
63
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
60
64
  @media (max-width: 400px) {
61
65
  font-size: 32px;
62
66
  line-height: 32px;
@@ -66,6 +70,7 @@ h1 {
66
70
  p {
67
71
  margin: 24px 0;
68
72
 
73
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
69
74
  @media (max-width: 1024px) {
70
75
  margin: var(--spacer-3) 0;
71
76
  }
@@ -100,6 +105,7 @@ svg {
100
105
  margin: 0 auto;
101
106
  overflow: hidden;
102
107
 
108
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
103
109
  @media (max-width: 400px) {
104
110
  padding: 24px;
105
111
  }
@@ -145,6 +151,7 @@ svg {
145
151
  align-items: center;
146
152
  gap: 8px;
147
153
 
154
+ /* stylelint-disable-next-line plugin/no-max-width-media-query -- TODO: pre-existing; migrate to a mobile-first min-width query */
148
155
  @media (max-width: 1024px) {
149
156
  flex-direction: column;
150
157
  gap: 6px;
@@ -5,6 +5,13 @@ import { FolderIcon as FolderIcon_3817bf644402e67bfe6577f60ef982de } from '@payl
5
5
  import { HierarchySidebarTabServer as HierarchySidebarTabServer_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
6
6
  import { TagIcon as TagIcon_3817bf644402e67bfe6577f60ef982de } from '@payloadcms/ui'
7
7
  import { CollectionCards as CollectionCards_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
8
+ import { CollectionQueryWidget as CollectionQueryWidget_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
9
+ import { QueryPresetsWhereField as QueryPresetsWhereField_3817bf644402e67bfe6577f60ef982de } from '@payloadcms/ui'
10
+ import { CollectionQuerySortField as CollectionQuerySortField_3817bf644402e67bfe6577f60ef982de } from '@payloadcms/ui'
11
+ import { RecentlyViewedWidget as RecentlyViewedWidget_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
12
+ import { RecentlyViewedCollectionsField as RecentlyViewedCollectionsField_3817bf644402e67bfe6577f60ef982de } from '@payloadcms/ui'
13
+ import { WelcomeWidget as WelcomeWidget_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
14
+ import { UploadDropzoneWidget as UploadDropzoneWidget_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
8
15
 
9
16
  /** @type import('payload').ImportMap */
10
17
  export const importMap = {
@@ -16,4 +23,14 @@ export const importMap = {
16
23
  HierarchySidebarTabServer_ab83ff7e88da8d3530831f296ec4756a,
17
24
  '@payloadcms/ui#TagIcon': TagIcon_3817bf644402e67bfe6577f60ef982de,
18
25
  '@payloadcms/ui/rsc#CollectionCards': CollectionCards_ab83ff7e88da8d3530831f296ec4756a,
26
+ '@payloadcms/ui/rsc#CollectionQueryWidget':
27
+ CollectionQueryWidget_ab83ff7e88da8d3530831f296ec4756a,
28
+ '@payloadcms/ui#QueryPresetsWhereField': QueryPresetsWhereField_3817bf644402e67bfe6577f60ef982de,
29
+ '@payloadcms/ui#CollectionQuerySortField':
30
+ CollectionQuerySortField_3817bf644402e67bfe6577f60ef982de,
31
+ '@payloadcms/ui/rsc#RecentlyViewedWidget': RecentlyViewedWidget_ab83ff7e88da8d3530831f296ec4756a,
32
+ '@payloadcms/ui#RecentlyViewedCollectionsField':
33
+ RecentlyViewedCollectionsField_3817bf644402e67bfe6577f60ef982de,
34
+ '@payloadcms/ui/rsc#WelcomeWidget': WelcomeWidget_ab83ff7e88da8d3530831f296ec4756a,
35
+ '@payloadcms/ui/rsc#UploadDropzoneWidget': UploadDropzoneWidget_ab83ff7e88da8d3530831f296ec4756a,
19
36
  }
@@ -96,6 +96,10 @@ export interface Config {
96
96
  locale: 'en';
97
97
  widgets: {
98
98
  collections: CollectionsWidget;
99
+ 'collection-query': CollectionQueryWidget;
100
+ activity: ActivityWidget;
101
+ welcome: WelcomeWidget;
102
+ 'upload-dropzone': UploadDropzoneWidget;
99
103
  };
100
104
  user: User;
101
105
  jobs: {
@@ -121,6 +125,10 @@ export interface UserAuthOperations {
121
125
  password: string;
122
126
  };
123
127
  }
128
+ /**
129
+ * This interface was referenced by `Config`'s JSON-Schema
130
+ * via the `definition` "users".
131
+ */
124
132
  export interface User {
125
133
  id: string;
126
134
  updatedAt: string;
@@ -130,6 +138,7 @@ export interface User {
130
138
  resetPasswordExpiration?: string | null;
131
139
  salt?: string | null;
132
140
  hash?: string | null;
141
+ resetPasswordRequestedAt?: string | null;
133
142
  loginAttempts?: number | null;
134
143
  lockUntil?: string | null;
135
144
  sessions?:
@@ -189,6 +198,10 @@ export interface Tag {
189
198
  _h_slugPath?: string | null;
190
199
  _h_titlePath?: string | null;
191
200
  }
201
+ /**
202
+ * This interface was referenced by `Config`'s JSON-Schema
203
+ * via the `definition` "payload-kv".
204
+ */
192
205
  export interface PayloadKv {
193
206
  id: string;
194
207
  key: string;
@@ -279,6 +292,7 @@ export interface UsersSelect<T extends boolean = true> {
279
292
  resetPasswordExpiration?: T;
280
293
  salt?: T;
281
294
  hash?: T;
295
+ resetPasswordRequestedAt?: T;
282
296
  loginAttempts?: T;
283
297
  lockUntil?: T;
284
298
  sessions?:
@@ -333,6 +347,10 @@ export interface TagsSelect<T extends boolean = true> {
333
347
  _h_slugPath?: T;
334
348
  _h_titlePath?: T;
335
349
  }
350
+ /**
351
+ * This interface was referenced by `Config`'s JSON-Schema
352
+ * via the `definition` "payload-kv_select".
353
+ */
336
354
  export interface PayloadKvSelect<T extends boolean = true> {
337
355
  key?: T;
338
356
  data?: T;
@@ -379,6 +397,59 @@ export interface CollectionsWidget {
379
397
  };
380
398
  width: 'full';
381
399
  }
400
+ /**
401
+ * This interface was referenced by `Config`'s JSON-Schema
402
+ * via the `definition` "collection-query_widget".
403
+ */
404
+ export interface CollectionQueryWidget {
405
+ data?: {
406
+ title?: string | null;
407
+ relatedCollection: 'users' | 'media' | 'folders' | 'tags';
408
+ where?:
409
+ | {
410
+ [k: string]: unknown;
411
+ }
412
+ | unknown[]
413
+ | string
414
+ | number
415
+ | boolean
416
+ | null;
417
+ sortField?: string | null;
418
+ sortDirection?: ('asc' | 'desc') | null;
419
+ limit?: number | null;
420
+ };
421
+ width: 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'full';
422
+ }
423
+ /**
424
+ * This interface was referenced by `Config`'s JSON-Schema
425
+ * via the `definition` "activity_widget".
426
+ */
427
+ export interface ActivityWidget {
428
+ data?: {
429
+ excludedCollections?: ('users' | 'media' | 'folders' | 'tags')[] | null;
430
+ };
431
+ width: 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'full';
432
+ }
433
+ /**
434
+ * This interface was referenced by `Config`'s JSON-Schema
435
+ * via the `definition` "welcome_widget".
436
+ */
437
+ export interface WelcomeWidget {
438
+ data?: {
439
+ [k: string]: unknown;
440
+ };
441
+ width: 'full';
442
+ }
443
+ /**
444
+ * This interface was referenced by `Config`'s JSON-Schema
445
+ * via the `definition` "upload-dropzone_widget".
446
+ */
447
+ export interface UploadDropzoneWidget {
448
+ data?: {
449
+ collection: 'media';
450
+ };
451
+ width: 'small' | 'medium' | 'large' | 'x-large' | 'full';
452
+ }
382
453
  /**
383
454
  * This interface was referenced by `Config`'s JSON-Schema
384
455
  * via the `definition` "auth".
@@ -390,4 +461,4 @@ export interface Auth {
390
461
 
391
462
  declare module 'payload' {
392
463
  export interface GeneratedTypes extends Config {}
393
- }
464
+ }
@@ -17,6 +17,14 @@ const dirname = path.dirname(filename)
17
17
  export default buildConfig({
18
18
  admin: {
19
19
  user: Users.slug,
20
+ dashboard: {
21
+ widgets: [],
22
+ defaultLayout: [
23
+ { widgetSlug: 'welcome', width: 'full' },
24
+ { widgetSlug: 'activity', width: 'full' },
25
+ { widgetSlug: 'collections', width: 'full' },
26
+ ],
27
+ },
20
28
  importMap: {
21
29
  baseDir: path.resolve(dirname),
22
30
  },
@@ -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';
@@ -30,7 +30,7 @@ export function helpMessage() {
30
30
 
31
31
  {dim Available templates: ${formatTemplates(validTemplates)}}
32
32
 
33
- --no-agent Skip writing AGENTS.md and CLAUDE.md
33
+ --no-agent Skip writing AGENTS.md
34
34
  --use-npm Use npm to install dependencies
35
35
  --use-yarn Use yarn to install dependencies
36
36
  --use-pnpm Use pnpm to install dependencies
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport path from 'path'\nimport terminalLink from 'terminal-link'\n\nimport type { PackageManager, ProjectTemplate } from '../types.js'\n\nimport { getValidTemplates } from '../lib/templates.js'\n\nconst header = (message: string): string => chalk.bold(message)\n\nexport const welcomeMessage = chalk`\n {green Welcome to Payload. Let's create a project! }\n`\n\nconst spacer = ' '.repeat(8)\n\nexport function helpMessage(): void {\n const validTemplates = getValidTemplates()\n console.log(chalk`\n {bold USAGE}\n\n {dim Inside of an existing Next.js or TanStack project}\n\n {dim $} {bold npx create-payload-app}\n\n {dim Create a new project from scratch}\n\n {dim $} {bold npx create-payload-app}\n {dim $} {bold npx create-payload-app} my-project\n {dim $} {bold npx create-payload-app} -n my-project -t template-name\n\n {bold OPTIONS}\n\n -n {underline my-payload-app} Set project name\n -t {underline template_name} Choose specific template\n -e {underline example_name} Choose specific example\n\n {dim Available templates: ${formatTemplates(validTemplates)}}\n\n --no-agent Skip writing AGENTS.md and CLAUDE.md\n --use-npm Use npm to install dependencies\n --use-yarn Use yarn to install dependencies\n --use-pnpm Use pnpm to install dependencies\n --use-bun Use bun to install dependencies (experimental)\n --no-deps Do not install any dependencies\n --payload-version {underline value} Install a specific Payload version or npm dist-tag (default: canary)\n -h Show help\n`)\n}\n\nfunction formatTemplates(templates: ProjectTemplate[]) {\n return `\\n\\n${spacer}${templates\n .map((t) => `${t.name}${' '.repeat(28 - t.name.length)}${t.description}`)\n .join(`\\n${spacer}`)}`\n}\n\nexport function successMessage(projectDir: string, packageManager: PackageManager): string {\n const relativePath = path.relative(process.cwd(), projectDir)\n return `\n${header('Launch Application:')}\n\n - cd ./${relativePath}\n - ${packageManager === 'npm' ? 'npm run' : packageManager} dev or follow directions in README.md\n\n${header('Documentation:')}\n\n - ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n - ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n\n`\n}\n\nexport function successfulNextInit(): string {\n return successfulFrameworkInit()\n}\n\nexport function successfulTanStackInit(): string {\n return successfulFrameworkInit()\n}\n\nfunction successfulFrameworkInit(): string {\n return `- ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n- ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n`\n}\n\nexport function moveMessage(args: { nextAppDir: string; projectDir: string }): string {\n const relativeAppDir = path.relative(process.cwd(), args.nextAppDir)\n return `\n${header('Next Steps:')}\n\nPayload does not support a top-level layout.tsx file in the app directory.\n\n${chalk.bold('To continue:')}\n\n- Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${chalk.bold('(app)')}\n- Move all files from ./${relativeAppDir} into that directory\n\nIt is recommended to do this from your IDE if your app has existing file references.\n\nOnce moved, rerun the create-payload-app command again.\n`\n}\n\nexport function feedbackOutro(): string {\n return `${chalk.bgCyan(chalk.black(' Have feedback? '))} Visit us on ${createTerminalLink('GitHub', 'https://github.com/payloadcms/payload')}.`\n}\n\n// Create terminalLink with fallback for unsupported terminals\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${url}`,\n })\n}\n"],"names":["chalk","path","terminalLink","getValidTemplates","header","message","bold","welcomeMessage","spacer","repeat","helpMessage","validTemplates","console","log","formatTemplates","templates","map","t","name","length","description","join","successMessage","projectDir","packageManager","relativePath","relative","process","cwd","createTerminalLink","successfulNextInit","successfulFrameworkInit","successfulTanStackInit","moveMessage","args","relativeAppDir","nextAppDir","feedbackOutro","bgCyan","black","text","url","fallback"],"mappings":"AAAA,6BAA6B,GAC7B,OAAOA,WAAW,QAAO;AACzB,OAAOC,UAAU,OAAM;AACvB,OAAOC,kBAAkB,gBAAe;AAIxC,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,SAAS,CAACC,UAA4BL,MAAMM,IAAI,CAACD;AAEvD,OAAO,MAAME,iBAAiBP,KAAK,CAAC;;AAEpC,CAAC,CAAA;AAED,MAAMQ,SAAS,IAAIC,MAAM,CAAC;AAE1B,OAAO,SAASC;IACd,MAAMC,iBAAiBR;IACvBS,QAAQC,GAAG,CAACb,KAAK,CAAC;;;;;;;;;;;;;;;;;;;kCAmBc,EAAEc,gBAAgBH,gBAAgB;;;;;;;;;;AAUpE,CAAC;AACD;AAEA,SAASG,gBAAgBC,SAA4B;IACnD,OAAO,CAAC,IAAI,EAAEP,SAASO,UACpBC,GAAG,CAAC,CAACC,IAAM,GAAGA,EAAEC,IAAI,GAAG,IAAIT,MAAM,CAAC,KAAKQ,EAAEC,IAAI,CAACC,MAAM,IAAIF,EAAEG,WAAW,EAAE,EACvEC,IAAI,CAAC,CAAC,EAAE,EAAEb,QAAQ,GAAG;AAC1B;AAEA,OAAO,SAASc,eAAeC,UAAkB,EAAEC,cAA8B;IAC/E,MAAMC,eAAexB,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIL;IAClD,OAAO,CAAC;AACV,EAAEnB,OAAO,uBAAuB;;SAEvB,EAAEqB,aAAa;IACpB,EAAED,mBAAmB,QAAQ,YAAYA,eAAe;;AAE5D,EAAEpB,OAAO,kBAAkB;;IAEvB,EAAEyB,mBACF,mBACA,+DACA;IACA,EAAEA,mBAAmB,iBAAiB,sDAAsD;;AAEhG,CAAC;AACD;AAEA,OAAO,SAASC;IACd,OAAOC;AACT;AAEA,OAAO,SAASC;IACd,OAAOD;AACT;AAEA,SAASA;IACP,OAAO,CAAC,EAAE,EAAEF,mBACV,mBACA,+DACA;EACF,EAAEA,mBAAmB,iBAAiB,sDAAsD;AAC9F,CAAC;AACD;AAEA,OAAO,SAASI,YAAYC,IAAgD;IAC1E,MAAMC,iBAAiBlC,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIM,KAAKE,UAAU;IACnE,OAAO,CAAC;AACV,EAAEhC,OAAO,eAAe;;;;AAIxB,EAAEJ,MAAMM,IAAI,CAAC,gBAAgB;;8BAEC,EAAE6B,eAAe,WAAW,EAAEA,eAAe,CAAC,EAAEnC,MAAMM,IAAI,CAAC,SAAS;wBAC1E,EAAE6B,eAAe;;;;;AAKzC,CAAC;AACD;AAEA,OAAO,SAASE;IACd,OAAO,GAAGrC,MAAMsC,MAAM,CAACtC,MAAMuC,KAAK,CAAC,qBAAqB,aAAa,EAAEV,mBAAmB,UAAU,yCAAyC,CAAC,CAAC;AACjJ;AAEA,8DAA8D;AAC9D,SAASA,mBAAmBW,IAAY,EAAEC,GAAW;IACnD,OAAOvC,aAAasC,MAAMC,KAAK;QAC7BC,UAAU,CAACF,MAAMC,MAAQ,GAAGD,KAAK,EAAE,EAAEC,KAAK;IAC5C;AACF"}
1
+ {"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport path from 'path'\nimport terminalLink from 'terminal-link'\n\nimport type { PackageManager, ProjectTemplate } from '../types.js'\n\nimport { getValidTemplates } from '../lib/templates.js'\n\nconst header = (message: string): string => chalk.bold(message)\n\nexport const welcomeMessage = chalk`\n {green Welcome to Payload. Let's create a project! }\n`\n\nconst spacer = ' '.repeat(8)\n\nexport function helpMessage(): void {\n const validTemplates = getValidTemplates()\n console.log(chalk`\n {bold USAGE}\n\n {dim Inside of an existing Next.js or TanStack project}\n\n {dim $} {bold npx create-payload-app}\n\n {dim Create a new project from scratch}\n\n {dim $} {bold npx create-payload-app}\n {dim $} {bold npx create-payload-app} my-project\n {dim $} {bold npx create-payload-app} -n my-project -t template-name\n\n {bold OPTIONS}\n\n -n {underline my-payload-app} Set project name\n -t {underline template_name} Choose specific template\n -e {underline example_name} Choose specific example\n\n {dim Available templates: ${formatTemplates(validTemplates)}}\n\n --no-agent Skip writing AGENTS.md\n --use-npm Use npm to install dependencies\n --use-yarn Use yarn to install dependencies\n --use-pnpm Use pnpm to install dependencies\n --use-bun Use bun to install dependencies (experimental)\n --no-deps Do not install any dependencies\n --payload-version {underline value} Install a specific Payload version or npm dist-tag (default: canary)\n -h Show help\n`)\n}\n\nfunction formatTemplates(templates: ProjectTemplate[]) {\n return `\\n\\n${spacer}${templates\n .map((t) => `${t.name}${' '.repeat(28 - t.name.length)}${t.description}`)\n .join(`\\n${spacer}`)}`\n}\n\nexport function successMessage(projectDir: string, packageManager: PackageManager): string {\n const relativePath = path.relative(process.cwd(), projectDir)\n return `\n${header('Launch Application:')}\n\n - cd ./${relativePath}\n - ${packageManager === 'npm' ? 'npm run' : packageManager} dev or follow directions in README.md\n\n${header('Documentation:')}\n\n - ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n - ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n\n`\n}\n\nexport function successfulNextInit(): string {\n return successfulFrameworkInit()\n}\n\nexport function successfulTanStackInit(): string {\n return successfulFrameworkInit()\n}\n\nfunction successfulFrameworkInit(): string {\n return `- ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n- ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n`\n}\n\nexport function moveMessage(args: { nextAppDir: string; projectDir: string }): string {\n const relativeAppDir = path.relative(process.cwd(), args.nextAppDir)\n return `\n${header('Next Steps:')}\n\nPayload does not support a top-level layout.tsx file in the app directory.\n\n${chalk.bold('To continue:')}\n\n- Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${chalk.bold('(app)')}\n- Move all files from ./${relativeAppDir} into that directory\n\nIt is recommended to do this from your IDE if your app has existing file references.\n\nOnce moved, rerun the create-payload-app command again.\n`\n}\n\nexport function feedbackOutro(): string {\n return `${chalk.bgCyan(chalk.black(' Have feedback? '))} Visit us on ${createTerminalLink('GitHub', 'https://github.com/payloadcms/payload')}.`\n}\n\n// Create terminalLink with fallback for unsupported terminals\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${url}`,\n })\n}\n"],"names":["chalk","path","terminalLink","getValidTemplates","header","message","bold","welcomeMessage","spacer","repeat","helpMessage","validTemplates","console","log","formatTemplates","templates","map","t","name","length","description","join","successMessage","projectDir","packageManager","relativePath","relative","process","cwd","createTerminalLink","successfulNextInit","successfulFrameworkInit","successfulTanStackInit","moveMessage","args","relativeAppDir","nextAppDir","feedbackOutro","bgCyan","black","text","url","fallback"],"mappings":"AAAA,6BAA6B,GAC7B,OAAOA,WAAW,QAAO;AACzB,OAAOC,UAAU,OAAM;AACvB,OAAOC,kBAAkB,gBAAe;AAIxC,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,SAAS,CAACC,UAA4BL,MAAMM,IAAI,CAACD;AAEvD,OAAO,MAAME,iBAAiBP,KAAK,CAAC;;AAEpC,CAAC,CAAA;AAED,MAAMQ,SAAS,IAAIC,MAAM,CAAC;AAE1B,OAAO,SAASC;IACd,MAAMC,iBAAiBR;IACvBS,QAAQC,GAAG,CAACb,KAAK,CAAC;;;;;;;;;;;;;;;;;;;kCAmBc,EAAEc,gBAAgBH,gBAAgB;;;;;;;;;;AAUpE,CAAC;AACD;AAEA,SAASG,gBAAgBC,SAA4B;IACnD,OAAO,CAAC,IAAI,EAAEP,SAASO,UACpBC,GAAG,CAAC,CAACC,IAAM,GAAGA,EAAEC,IAAI,GAAG,IAAIT,MAAM,CAAC,KAAKQ,EAAEC,IAAI,CAACC,MAAM,IAAIF,EAAEG,WAAW,EAAE,EACvEC,IAAI,CAAC,CAAC,EAAE,EAAEb,QAAQ,GAAG;AAC1B;AAEA,OAAO,SAASc,eAAeC,UAAkB,EAAEC,cAA8B;IAC/E,MAAMC,eAAexB,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIL;IAClD,OAAO,CAAC;AACV,EAAEnB,OAAO,uBAAuB;;SAEvB,EAAEqB,aAAa;IACpB,EAAED,mBAAmB,QAAQ,YAAYA,eAAe;;AAE5D,EAAEpB,OAAO,kBAAkB;;IAEvB,EAAEyB,mBACF,mBACA,+DACA;IACA,EAAEA,mBAAmB,iBAAiB,sDAAsD;;AAEhG,CAAC;AACD;AAEA,OAAO,SAASC;IACd,OAAOC;AACT;AAEA,OAAO,SAASC;IACd,OAAOD;AACT;AAEA,SAASA;IACP,OAAO,CAAC,EAAE,EAAEF,mBACV,mBACA,+DACA;EACF,EAAEA,mBAAmB,iBAAiB,sDAAsD;AAC9F,CAAC;AACD;AAEA,OAAO,SAASI,YAAYC,IAAgD;IAC1E,MAAMC,iBAAiBlC,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIM,KAAKE,UAAU;IACnE,OAAO,CAAC;AACV,EAAEhC,OAAO,eAAe;;;;AAIxB,EAAEJ,MAAMM,IAAI,CAAC,gBAAgB;;8BAEC,EAAE6B,eAAe,WAAW,EAAEA,eAAe,CAAC,EAAEnC,MAAMM,IAAI,CAAC,SAAS;wBAC1E,EAAE6B,eAAe;;;;;AAKzC,CAAC;AACD;AAEA,OAAO,SAASE;IACd,OAAO,GAAGrC,MAAMsC,MAAM,CAACtC,MAAMuC,KAAK,CAAC,qBAAqB,aAAa,EAAEV,mBAAmB,UAAU,yCAAyC,CAAC,CAAC;AACjJ;AAEA,8DAA8D;AAC9D,SAASA,mBAAmBW,IAAY,EAAEC,GAAW;IACnD,OAAOvC,aAAasC,MAAMC,KAAK;QAC7BC,UAAU,CAACF,MAAMC,MAAQ,GAAGD,KAAK,EAAE,EAAEC,KAAK;IAC5C;AACF"}
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.b8a92d2",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -60,7 +60,7 @@
60
60
  "fs-extra": "^9.0.1",
61
61
  "globby": "11.1.0",
62
62
  "prettier": "^3.5.0",
63
- "tar": "^7.5.7",
63
+ "tar": "^7.5.22",
64
64
  "terminal-link": "^2.1.1",
65
65
  "ts-morph": "^21.0.1"
66
66
  },
@@ -1,132 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import * as fs from 'fs';
3
- import * as fse from 'fs-extra';
4
- import * as path from 'path';
5
- import * as os from 'os';
6
- import { configurePayloadConfig } from './lib/configure-payload-config';
7
- import { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './lib/ast/adapter-config';
8
- const TEST_CASES = [
9
- {
10
- name: 'blank + mongodb + localDisk',
11
- template: 'blank',
12
- dbType: 'mongodb',
13
- storageAdapter: 'localDisk'
14
- },
15
- {
16
- name: 'blank + postgres + vercelBlobStorage',
17
- template: 'blank',
18
- dbType: 'postgres',
19
- storageAdapter: 'vercelBlobStorage'
20
- },
21
- {
22
- name: 'website + mongodb + s3Storage',
23
- template: 'website',
24
- dbType: 'mongodb',
25
- storageAdapter: 's3Storage'
26
- },
27
- {
28
- name: 'website + postgres + localDisk',
29
- template: 'website',
30
- dbType: 'postgres',
31
- storageAdapter: 'localDisk'
32
- },
33
- {
34
- name: 'ecommerce + mongodb + localDisk',
35
- template: 'ecommerce',
36
- dbType: 'mongodb',
37
- storageAdapter: 'localDisk'
38
- },
39
- {
40
- name: 'ecommerce + postgres + r2Storage',
41
- template: 'ecommerce',
42
- dbType: 'postgres',
43
- storageAdapter: 'r2Storage'
44
- }
45
- ];
46
- describe('AST Integration Tests', ()=>{
47
- let tempDir;
48
- const templatesRoot = path.resolve(__dirname, '../../..', 'templates');
49
- beforeEach(()=>{
50
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-ast-integration-'));
51
- });
52
- afterEach(()=>{
53
- if (tempDir && fs.existsSync(tempDir)) {
54
- fs.rmSync(tempDir, {
55
- recursive: true,
56
- force: true
57
- });
58
- }
59
- });
60
- describe.each(TEST_CASES)('$name', ({ template, dbType, storageAdapter })=>{
61
- it('successfully applies AST transformations', async ()=>{
62
- // Setup: Copy template to temp directory
63
- const templateDir = path.join(templatesRoot, template);
64
- const testProjectDir = path.join(tempDir, template);
65
- if (!fs.existsSync(templateDir)) {
66
- throw new Error(`Template ${template} not found at ${templateDir}`);
67
- }
68
- fse.copySync(templateDir, testProjectDir);
69
- const payloadConfigPath = path.join(testProjectDir, 'src', 'payload.config.ts');
70
- const packageJsonPath = path.join(testProjectDir, 'package.json');
71
- // Verify files exist before transformation
72
- expect(fs.existsSync(payloadConfigPath)).toBe(true);
73
- expect(fs.existsSync(packageJsonPath)).toBe(true);
74
- // Apply transformations
75
- await configurePayloadConfig({
76
- dbType,
77
- storageAdapter,
78
- projectDirOrConfigPath: {
79
- projectDir: testProjectDir
80
- }
81
- });
82
- // Verify payload.config.ts transformations
83
- const configContent = fs.readFileSync(payloadConfigPath, 'utf-8');
84
- // Check database adapter import
85
- const dbConfig = DB_ADAPTER_CONFIG[dbType];
86
- expect(configContent).toContain(`from '${dbConfig.packageName}'`);
87
- expect(configContent).toContain(`import { ${dbConfig.adapterName} }`);
88
- // Check database adapter config
89
- expect(configContent).toMatch(new RegExp(`db:\\s*${dbConfig.adapterName}\\(`));
90
- // Check storage adapter if not localDisk
91
- if (storageAdapter !== 'localDisk') {
92
- const storageConfig = STORAGE_ADAPTER_CONFIG[storageAdapter];
93
- if (storageConfig.packageName && storageConfig.adapterName) {
94
- expect(configContent).toContain(`from '${storageConfig.packageName}'`);
95
- expect(configContent).toContain(`import { ${storageConfig.adapterName} }`);
96
- expect(configContent).toContain(`${storageConfig.adapterName}(`);
97
- }
98
- }
99
- // Check that old mongodb adapter is removed if we switched to postgres
100
- if (dbType === 'postgres') {
101
- expect(configContent).not.toContain('@payloadcms/db-mongodb');
102
- expect(configContent).not.toContain('mongooseAdapter');
103
- }
104
- // Check that plugins array exists if storage adapter was added
105
- if (storageAdapter !== 'localDisk') {
106
- expect(configContent).toContain('plugins:');
107
- }
108
- // Verify package.json transformations
109
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
110
- // Check that correct db adapter package is in dependencies
111
- expect(packageJson.dependencies[dbConfig.packageName]).toBeDefined();
112
- // Check that old db adapters are removed
113
- Object.entries(DB_ADAPTER_CONFIG).forEach(([key, config])=>{
114
- if (key !== dbType && config.packageName !== dbConfig.packageName) {
115
- expect(packageJson.dependencies[config.packageName]).toBeUndefined();
116
- }
117
- });
118
- // Note: Storage adapter dependencies are NOT automatically added to package.json
119
- // by configurePayloadConfig - only the payload.config.ts is updated.
120
- // This is expected behavior as storage adapters are typically installed separately.
121
- // Verify file is valid TypeScript (basic syntax check)
122
- expect(configContent).toContain('buildConfig');
123
- expect(configContent).toContain('export default');
124
- // Verify no placeholder comments remain
125
- expect(configContent).not.toContain('database-adapter-import');
126
- expect(configContent).not.toContain('database-adapter-config-start');
127
- expect(configContent).not.toContain('storage-adapter-placeholder');
128
- });
129
- });
130
- });
131
-
132
- //# sourceMappingURL=ast-integration.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ast-integration.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport * as fs from 'fs'\nimport * as fse from 'fs-extra'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { configurePayloadConfig } from './lib/configure-payload-config'\nimport type { DbType, StorageAdapterType } from './types'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './lib/ast/adapter-config'\n\ninterface TestCase {\n name: string\n template: string\n dbType: DbType\n storageAdapter: StorageAdapterType\n}\n\nconst TEST_CASES: TestCase[] = [\n {\n name: 'blank + mongodb + localDisk',\n template: 'blank',\n dbType: 'mongodb',\n storageAdapter: 'localDisk',\n },\n {\n name: 'blank + postgres + vercelBlobStorage',\n template: 'blank',\n dbType: 'postgres',\n storageAdapter: 'vercelBlobStorage',\n },\n {\n name: 'website + mongodb + s3Storage',\n template: 'website',\n dbType: 'mongodb',\n storageAdapter: 's3Storage',\n },\n {\n name: 'website + postgres + localDisk',\n template: 'website',\n dbType: 'postgres',\n storageAdapter: 'localDisk',\n },\n {\n name: 'ecommerce + mongodb + localDisk',\n template: 'ecommerce',\n dbType: 'mongodb',\n storageAdapter: 'localDisk',\n },\n {\n name: 'ecommerce + postgres + r2Storage',\n template: 'ecommerce',\n dbType: 'postgres',\n storageAdapter: 'r2Storage',\n },\n]\n\ndescribe('AST Integration Tests', () => {\n let tempDir: string\n const templatesRoot = path.resolve(__dirname, '../../..', 'templates')\n\n beforeEach(() => {\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-ast-integration-'))\n })\n\n afterEach(() => {\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n })\n\n describe.each(TEST_CASES)('$name', ({ template, dbType, storageAdapter }) => {\n it('successfully applies AST transformations', async () => {\n // Setup: Copy template to temp directory\n const templateDir = path.join(templatesRoot, template)\n const testProjectDir = path.join(tempDir, template)\n\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template ${template} not found at ${templateDir}`)\n }\n\n fse.copySync(templateDir, testProjectDir)\n\n const payloadConfigPath = path.join(testProjectDir, 'src', 'payload.config.ts')\n const packageJsonPath = path.join(testProjectDir, 'package.json')\n\n // Verify files exist before transformation\n expect(fs.existsSync(payloadConfigPath)).toBe(true)\n expect(fs.existsSync(packageJsonPath)).toBe(true)\n\n // Apply transformations\n await configurePayloadConfig({\n dbType,\n storageAdapter,\n projectDirOrConfigPath: { projectDir: testProjectDir },\n })\n\n // Verify payload.config.ts transformations\n const configContent = fs.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check database adapter import\n const dbConfig = DB_ADAPTER_CONFIG[dbType]\n expect(configContent).toContain(`from '${dbConfig.packageName}'`)\n expect(configContent).toContain(`import { ${dbConfig.adapterName} }`)\n\n // Check database adapter config\n expect(configContent).toMatch(new RegExp(`db:\\\\s*${dbConfig.adapterName}\\\\(`))\n\n // Check storage adapter if not localDisk\n if (storageAdapter !== 'localDisk') {\n const storageConfig = STORAGE_ADAPTER_CONFIG[storageAdapter]\n\n if (storageConfig.packageName && storageConfig.adapterName) {\n expect(configContent).toContain(`from '${storageConfig.packageName}'`)\n expect(configContent).toContain(`import { ${storageConfig.adapterName} }`)\n expect(configContent).toContain(`${storageConfig.adapterName}(`)\n }\n }\n\n // Check that old mongodb adapter is removed if we switched to postgres\n if (dbType === 'postgres') {\n expect(configContent).not.toContain('@payloadcms/db-mongodb')\n expect(configContent).not.toContain('mongooseAdapter')\n }\n\n // Check that plugins array exists if storage adapter was added\n if (storageAdapter !== 'localDisk') {\n expect(configContent).toContain('plugins:')\n }\n\n // Verify package.json transformations\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n // Check that correct db adapter package is in dependencies\n expect(packageJson.dependencies[dbConfig.packageName]).toBeDefined()\n\n // Check that old db adapters are removed\n Object.entries(DB_ADAPTER_CONFIG).forEach(([key, config]) => {\n if (key !== dbType && config.packageName !== dbConfig.packageName) {\n expect(packageJson.dependencies[config.packageName]).toBeUndefined()\n }\n })\n\n // Note: Storage adapter dependencies are NOT automatically added to package.json\n // by configurePayloadConfig - only the payload.config.ts is updated.\n // This is expected behavior as storage adapters are typically installed separately.\n\n // Verify file is valid TypeScript (basic syntax check)\n expect(configContent).toContain('buildConfig')\n expect(configContent).toContain('export default')\n\n // Verify no placeholder comments remain\n expect(configContent).not.toContain('database-adapter-import')\n expect(configContent).not.toContain('database-adapter-config-start')\n expect(configContent).not.toContain('storage-adapter-placeholder')\n })\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","fs","fse","path","os","configurePayloadConfig","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","TEST_CASES","name","template","dbType","storageAdapter","tempDir","templatesRoot","resolve","__dirname","mkdtempSync","join","tmpdir","existsSync","rmSync","recursive","force","each","templateDir","testProjectDir","Error","copySync","payloadConfigPath","packageJsonPath","toBe","projectDirOrConfigPath","projectDir","configContent","readFileSync","dbConfig","toContain","packageName","adapterName","toMatch","RegExp","storageConfig","not","packageJson","JSON","parse","dependencies","toBeDefined","Object","entries","forEach","key","config","toBeUndefined"],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildAgentConfigFiles } from './agent-config.js';
3
- describe('buildAgentConfigFiles', ()=>{
4
- it('should write both AGENTS.md and CLAUDE.md', ()=>{
5
- const fileNames = buildAgentConfigFiles().map((file)=>file.fileName);
6
- expect(fileNames).toEqual([
7
- 'AGENTS.md',
8
- 'CLAUDE.md'
9
- ]);
10
- });
11
- it('should point AGENTS.md at the skill inside node_modules', ()=>{
12
- const agents = buildAgentConfigFiles().find((file)=>file.fileName === 'AGENTS.md');
13
- expect(agents?.content).toContain('# AI Agent');
14
- expect(agents?.content).toContain('node_modules/payload/skills/payload/SKILL.md');
15
- expect(agents?.content).not.toContain('.claude/skills');
16
- });
17
- it('should import AGENTS.md from CLAUDE.md rather than duplicating it', ()=>{
18
- const claude = buildAgentConfigFiles().find((file)=>file.fileName === 'CLAUDE.md');
19
- expect(claude?.content.trim()).toBe('@AGENTS.md');
20
- });
21
- });
22
-
23
- //# sourceMappingURL=agent-config.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/agent-config.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { buildAgentConfigFiles } from './agent-config.js'\n\ndescribe('buildAgentConfigFiles', () => {\n it('should write both AGENTS.md and CLAUDE.md', () => {\n const fileNames = buildAgentConfigFiles().map((file) => file.fileName)\n\n expect(fileNames).toEqual(['AGENTS.md', 'CLAUDE.md'])\n })\n\n it('should point AGENTS.md at the skill inside node_modules', () => {\n const agents = buildAgentConfigFiles().find((file) => file.fileName === 'AGENTS.md')\n\n expect(agents?.content).toContain('# AI Agent')\n expect(agents?.content).toContain('node_modules/payload/skills/payload/SKILL.md')\n expect(agents?.content).not.toContain('.claude/skills')\n })\n\n it('should import AGENTS.md from CLAUDE.md rather than duplicating it', () => {\n const claude = buildAgentConfigFiles().find((file) => file.fileName === 'CLAUDE.md')\n\n expect(claude?.content.trim()).toBe('@AGENTS.md')\n })\n})\n"],"names":["describe","expect","it","buildAgentConfigFiles","fileNames","map","file","fileName","toEqual","agents","find","content","toContain","not","claude","trim","toBe"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,qBAAqB,QAAQ,oBAAmB;AAEzDH,SAAS,yBAAyB;IAChCE,GAAG,6CAA6C;QAC9C,MAAME,YAAYD,wBAAwBE,GAAG,CAAC,CAACC,OAASA,KAAKC,QAAQ;QAErEN,OAAOG,WAAWI,OAAO,CAAC;YAAC;YAAa;SAAY;IACtD;IAEAN,GAAG,2DAA2D;QAC5D,MAAMO,SAASN,wBAAwBO,IAAI,CAAC,CAACJ,OAASA,KAAKC,QAAQ,KAAK;QAExEN,OAAOQ,QAAQE,SAASC,SAAS,CAAC;QAClCX,OAAOQ,QAAQE,SAASC,SAAS,CAAC;QAClCX,OAAOQ,QAAQE,SAASE,GAAG,CAACD,SAAS,CAAC;IACxC;IAEAV,GAAG,qEAAqE;QACtE,MAAMY,SAASX,wBAAwBO,IAAI,CAAC,CAACJ,OAASA,KAAKC,QAAQ,KAAK;QAExEN,OAAOa,QAAQH,QAAQI,QAAQC,IAAI,CAAC;IACtC;AACF"}
@@ -1,139 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { preparePackageJson, updatePackageJson } from './package-json';
3
- import * as fs from 'fs';
4
- import * as path from 'path';
5
- import * as os from 'os';
6
- describe('updatePackageJson', ()=>{
7
- let tempDir;
8
- beforeEach(()=>{
9
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'));
10
- });
11
- afterEach(()=>{
12
- fs.rmSync(tempDir, {
13
- recursive: true,
14
- force: true
15
- });
16
- });
17
- it('updates database dependencies', ()=>{
18
- const pkgPath = path.join(tempDir, 'package.json');
19
- const originalPkg = {
20
- name: 'test-app',
21
- dependencies: {
22
- '@payloadcms/db-mongodb': '^3.0.0',
23
- payload: '^3.0.0'
24
- }
25
- };
26
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
27
- updatePackageJson(pkgPath, {
28
- databaseAdapter: 'postgres'
29
- });
30
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
31
- expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined();
32
- expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined();
33
- });
34
- it('removes sharp when requested', ()=>{
35
- const pkgPath = path.join(tempDir, 'package.json');
36
- const originalPkg = {
37
- name: 'test-app',
38
- dependencies: {
39
- payload: '^3.0.0',
40
- sharp: '^0.33.0'
41
- }
42
- };
43
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
44
- updatePackageJson(pkgPath, {
45
- removeSharp: true
46
- });
47
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
48
- expect(updated.dependencies.sharp).toBeUndefined();
49
- });
50
- it('should remove selected packages from dependencies and devDependencies', ()=>{
51
- const pkgPath = path.join(tempDir, 'package.json');
52
- const originalPkg = {
53
- name: 'test-app',
54
- scripts: {
55
- dev: 'vite'
56
- },
57
- dependencies: {
58
- '@tanstack/router-plugin': '^1.0.0',
59
- payload: '^4.0.0'
60
- },
61
- devDependencies: {
62
- '@tanstack/router-plugin': '^1.0.0',
63
- typescript: '^6.0.0'
64
- }
65
- };
66
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
67
- updatePackageJson(pkgPath, {
68
- removeDependencies: [
69
- '@tanstack/router-plugin'
70
- ]
71
- });
72
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
73
- expect(updated).toEqual({
74
- name: 'test-app',
75
- scripts: {
76
- dev: 'vite'
77
- },
78
- dependencies: {
79
- payload: '^4.0.0'
80
- },
81
- devDependencies: {
82
- typescript: '^6.0.0'
83
- }
84
- });
85
- });
86
- it('should prepare exact package content without writing to disk', ()=>{
87
- const pkgPath = path.join(tempDir, 'package.json');
88
- const original = JSON.stringify({
89
- dependencies: {
90
- '@tanstack/router-plugin': '^1.0.0',
91
- payload: '^4.0.0'
92
- },
93
- devDependencies: {
94
- '@tanstack/router-plugin': '^1.0.0',
95
- typescript: '^6.0.0'
96
- },
97
- name: 'router-app'
98
- }, null, 2);
99
- fs.writeFileSync(pkgPath, original);
100
- const prepared = preparePackageJson({
101
- filePath: pkgPath,
102
- options: {
103
- removeDependencies: [
104
- '@tanstack/router-plugin'
105
- ]
106
- }
107
- });
108
- expect(prepared).toEqual({
109
- content: `${JSON.stringify({
110
- dependencies: {
111
- payload: '^4.0.0'
112
- },
113
- devDependencies: {
114
- typescript: '^6.0.0'
115
- },
116
- name: 'router-app'
117
- }, null, 2)}\n`,
118
- filePath: pkgPath
119
- });
120
- expect(fs.readFileSync(pkgPath, 'utf8')).toBe(original);
121
- });
122
- it('updates package name', ()=>{
123
- const pkgPath = path.join(tempDir, 'package.json');
124
- const originalPkg = {
125
- name: 'template-name',
126
- dependencies: {
127
- payload: '^3.0.0'
128
- }
129
- };
130
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
131
- updatePackageJson(pkgPath, {
132
- packageName: 'my-new-app'
133
- });
134
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
135
- expect(updated.name).toBe('my-new-app');
136
- });
137
- });
138
-
139
- //# sourceMappingURL=package-json.spec.js.map