create-payload-app 4.0.0-internal.e55ccef → 4.0.0-internal.f05c47f

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 (124) hide show
  1. package/README.md +5 -0
  2. package/dist/commands.d.ts +4 -0
  3. package/dist/commands.d.ts.map +1 -0
  4. package/dist/commands.js +5 -0
  5. package/dist/commands.js.map +1 -0
  6. package/dist/lib/agent-config.d.ts +15 -0
  7. package/dist/lib/agent-config.d.ts.map +1 -0
  8. package/dist/lib/agent-config.js +22 -0
  9. package/dist/lib/agent-config.js.map +1 -0
  10. package/dist/lib/agent-config.spec.js +23 -0
  11. package/dist/lib/agent-config.spec.js.map +1 -0
  12. package/dist/lib/ast/package-json.d.ts +9 -0
  13. package/dist/lib/ast/package-json.d.ts.map +1 -1
  14. package/dist/lib/ast/package-json.js +34 -8
  15. package/dist/lib/ast/package-json.js.map +1 -1
  16. package/dist/lib/ast/package-json.spec.js +73 -1
  17. package/dist/lib/ast/package-json.spec.js.map +1 -1
  18. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  19. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  20. package/dist/lib/configure-payload-tsconfig.js +26 -0
  21. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  22. package/dist/lib/configure-payload-tsconfig.spec.js +135 -0
  23. package/dist/lib/configure-payload-tsconfig.spec.js.map +1 -0
  24. package/dist/lib/create-project.d.ts +1 -2
  25. package/dist/lib/create-project.d.ts.map +1 -1
  26. package/dist/lib/create-project.js +5 -21
  27. package/dist/lib/create-project.js.map +1 -1
  28. package/dist/lib/create-project.spec.js +9 -0
  29. package/dist/lib/create-project.spec.js.map +1 -1
  30. package/dist/lib/generate-secret.js +1 -1
  31. package/dist/lib/generate-secret.js.map +1 -1
  32. package/dist/lib/init-next.d.ts.map +1 -1
  33. package/dist/lib/init-next.js +5 -34
  34. package/dist/lib/init-next.js.map +1 -1
  35. package/dist/lib/init-tanstack-default-template.spec.js +119 -0
  36. package/dist/lib/init-tanstack-default-template.spec.js.map +1 -0
  37. package/dist/lib/init-tanstack.d.ts +18 -0
  38. package/dist/lib/init-tanstack.d.ts.map +1 -0
  39. package/dist/lib/init-tanstack.js +150 -0
  40. package/dist/lib/init-tanstack.js.map +1 -0
  41. package/dist/lib/init-tanstack.spec.js +394 -0
  42. package/dist/lib/init-tanstack.spec.js.map +1 -0
  43. package/dist/lib/tanstack/detect.d.ts +5 -0
  44. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  45. package/dist/lib/tanstack/detect.js +131 -0
  46. package/dist/lib/tanstack/detect.js.map +1 -0
  47. package/dist/lib/tanstack/detect.spec.js +227 -0
  48. package/dist/lib/tanstack/detect.spec.js.map +1 -0
  49. package/dist/lib/tanstack/prepare.d.ts +23 -0
  50. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  51. package/dist/lib/tanstack/prepare.js +114 -0
  52. package/dist/lib/tanstack/prepare.js.map +1 -0
  53. package/dist/lib/tanstack/prepare.spec.js +288 -0
  54. package/dist/lib/tanstack/prepare.spec.js.map +1 -0
  55. package/dist/lib/tanstack/template-files.d.ts +50 -0
  56. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  57. package/dist/lib/tanstack/template-files.js +64 -0
  58. package/dist/lib/tanstack/template-files.js.map +1 -0
  59. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  60. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  61. package/dist/lib/tanstack/transform-root-route.js +747 -0
  62. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  63. package/dist/lib/tanstack/transform-root-route.spec.js +484 -0
  64. package/dist/lib/tanstack/transform-root-route.spec.js.map +1 -0
  65. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  66. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  67. package/dist/lib/tanstack/transform-router.js +301 -0
  68. package/dist/lib/tanstack/transform-router.js.map +1 -0
  69. package/dist/lib/tanstack/transform-router.spec.js +264 -0
  70. package/dist/lib/tanstack/transform-router.spec.js.map +1 -0
  71. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  72. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  73. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  74. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  75. package/dist/lib/tanstack/transform-vite-config.spec.js +456 -0
  76. package/dist/lib/tanstack/transform-vite-config.spec.js.map +1 -0
  77. package/dist/lib/templates.d.ts.map +1 -1
  78. package/dist/lib/templates.js +6 -0
  79. package/dist/lib/templates.js.map +1 -1
  80. package/dist/lib/update-payload-in-project.d.ts +18 -3
  81. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  82. package/dist/lib/update-payload-in-project.js +93 -18
  83. package/dist/lib/update-payload-in-project.js.map +1 -1
  84. package/dist/lib/update-payload-in-project.spec.js +258 -0
  85. package/dist/lib/update-payload-in-project.spec.js.map +1 -0
  86. package/dist/main.d.ts +20 -1
  87. package/dist/main.d.ts.map +1 -1
  88. package/dist/main.js +120 -29
  89. package/dist/main.js.map +1 -1
  90. package/dist/main.spec.js +102 -0
  91. package/dist/main.spec.js.map +1 -0
  92. package/dist/scripts/pack-template-files.js +18 -0
  93. package/dist/scripts/pack-template-files.js.map +1 -1
  94. package/dist/template/src/app/(frontend)/styles.css +1 -1
  95. package/dist/template/src/app/(payload)/layout.tsx +1 -1
  96. package/dist/template-tanstack/routes/_payload/admin.$.tsx +8 -0
  97. package/dist/template-tanstack/routes/_payload/admin.index.tsx +8 -0
  98. package/dist/template-tanstack/routes/_payload/api.$.ts +10 -0
  99. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  100. package/dist/template-tanstack/routes/_payload/server.functions.ts +49 -0
  101. package/dist/template-tanstack/routes/_payload.tsx +13 -0
  102. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  103. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  104. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  105. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  106. package/dist/template-tanstack/src/payload-foundation.css +10 -0
  107. package/dist/template-tanstack/src/payload.config.ts +40 -0
  108. package/dist/types.d.ts +22 -3
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js.map +1 -1
  111. package/dist/utils/messages.d.ts +1 -0
  112. package/dist/utils/messages.d.ts.map +1 -1
  113. package/dist/utils/messages.js +8 -6
  114. package/dist/utils/messages.js.map +1 -1
  115. package/package.json +4 -4
  116. package/dist/lib/download-skill.d.ts +0 -8
  117. package/dist/lib/download-skill.d.ts.map +0 -1
  118. package/dist/lib/download-skill.js +0 -35
  119. package/dist/lib/download-skill.js.map +0 -1
  120. package/dist/lib/select-agent.d.ts +0 -16
  121. package/dist/lib/select-agent.d.ts.map +0 -1
  122. package/dist/lib/select-agent.js +0 -67
  123. package/dist/lib/select-agent.js.map +0 -1
  124. /package/dist/template/src/app/(payload)/{custom.scss → custom.css} +0 -0
package/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  CLI for easily starting new Payload project
4
4
 
5
+ When run without a project name inside a compatible existing Next.js, TanStack Start, or
6
+ conventional TanStack Router project, the CLI initializes Payload in the current project.
7
+ Router-only projects are converted to TanStack Start after confirmation.
8
+
5
9
  ## Usage
6
10
 
7
11
  ```text
@@ -20,6 +24,7 @@ CLI for easily starting new Payload project
20
24
  Available templates:
21
25
 
22
26
  blank Blank Template
27
+ blank-tanstack Blank TanStack Start Template
23
28
  website Website Template
24
29
  ecommerce E-commerce Template
25
30
  plugin Template for creating a Payload plugin
@@ -0,0 +1,4 @@
1
+ export { getNextAppDetails, initNext } from './lib/init-next.js';
2
+ export { initTanStack } from './lib/init-tanstack.js';
3
+ export { getTanStackAppDetails } from './lib/tanstack/detect.js';
4
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { getNextAppDetails, initNext } from './lib/init-next.js';
2
+ export { initTanStack } from './lib/init-tanstack.js';
3
+ export { getTanStackAppDetails } from './lib/tanstack/detect.js';
4
+
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands.ts"],"sourcesContent":["export { getNextAppDetails, initNext } from './lib/init-next.js'\nexport { initTanStack } from './lib/init-tanstack.js'\nexport { getTanStackAppDetails } from './lib/tanstack/detect.js'\n"],"names":["getNextAppDetails","initNext","initTanStack","getTanStackAppDetails"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,QAAQ,QAAQ,qBAAoB;AAChE,SAASC,YAAY,QAAQ,yBAAwB;AACrD,SAASC,qBAAqB,QAAQ,2BAA0B"}
@@ -0,0 +1,15 @@
1
+ type AgentConfigFile = {
2
+ content: string;
3
+ fileName: 'AGENTS.md' | 'CLAUDE.md';
4
+ };
5
+ /**
6
+ * Builds the agent config files written at project root. They point agents at the skill
7
+ * bundled with the installed `payload` package, so guidance always matches the installed
8
+ * version.
9
+ *
10
+ * `AGENTS.md` holds the instructions. Claude Code reads only `CLAUDE.md`, so that file
11
+ * imports `AGENTS.md` rather than duplicating it.
12
+ */
13
+ export declare function buildAgentConfigFiles(): AgentConfigFile[];
14
+ export {};
15
+ //# sourceMappingURL=agent-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-config.d.ts","sourceRoot":"","sources":["../../src/lib/agent-config.ts"],"names":[],"mappings":"AAGA,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,GAAG,WAAW,CAAA;CACpC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,EAAE,CAWzD"}
@@ -0,0 +1,22 @@
1
+ /** Where the skill ships inside a consumer's installed dependencies. */ const SKILL_PATH = 'node_modules/payload/skills/payload';
2
+ /**
3
+ * Builds the agent config files written at project root. They point agents at the skill
4
+ * bundled with the installed `payload` package, so guidance always matches the installed
5
+ * version.
6
+ *
7
+ * `AGENTS.md` holds the instructions. Claude Code reads only `CLAUDE.md`, so that file
8
+ * imports `AGENTS.md` rather than duplicating it.
9
+ */ export function buildAgentConfigFiles() {
10
+ return [
11
+ {
12
+ content: `# AI Agent\n\nFor any Payload-related work, reference the skill at \`${SKILL_PATH}/SKILL.md\`.\n`,
13
+ fileName: 'AGENTS.md'
14
+ },
15
+ {
16
+ content: `@AGENTS.md\n`,
17
+ fileName: 'CLAUDE.md'
18
+ }
19
+ ];
20
+ }
21
+
22
+ //# sourceMappingURL=agent-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/agent-config.ts"],"sourcesContent":["/** Where the skill ships inside a consumer's installed dependencies. */\nconst SKILL_PATH = 'node_modules/payload/skills/payload'\n\ntype AgentConfigFile = {\n content: string\n fileName: 'AGENTS.md' | 'CLAUDE.md'\n}\n\n/**\n * Builds the agent config files written at project root. They point agents at the skill\n * bundled with the installed `payload` package, so guidance always matches the installed\n * version.\n *\n * `AGENTS.md` holds the instructions. Claude Code reads only `CLAUDE.md`, so that file\n * imports `AGENTS.md` rather than duplicating it.\n */\nexport function buildAgentConfigFiles(): AgentConfigFile[] {\n return [\n {\n content: `# AI Agent\\n\\nFor any Payload-related work, reference the skill at \\`${SKILL_PATH}/SKILL.md\\`.\\n`,\n fileName: 'AGENTS.md',\n },\n {\n content: `@AGENTS.md\\n`,\n fileName: 'CLAUDE.md',\n },\n ]\n}\n"],"names":["SKILL_PATH","buildAgentConfigFiles","content","fileName"],"mappings":"AAAA,sEAAsE,GACtE,MAAMA,aAAa;AAOnB;;;;;;;CAOC,GACD,OAAO,SAASC;IACd,OAAO;QACL;YACEC,SAAS,CAAC,qEAAqE,EAAEF,WAAW,cAAc,CAAC;YAC3GG,UAAU;QACZ;QACA;YACED,SAAS,CAAC,YAAY,CAAC;YACvBC,UAAU;QACZ;KACD;AACH"}
@@ -0,0 +1,23 @@
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
@@ -0,0 +1 @@
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,7 +1,9 @@
1
1
  import type { DatabaseAdapter, StorageAdapter } from './types.js';
2
2
  type PackageJsonTransformOptions = {
3
+ addDependencies?: Record<string, string>;
3
4
  databaseAdapter?: DatabaseAdapter;
4
5
  packageName?: string;
6
+ removeDependencies?: string[];
5
7
  removeSharp?: boolean;
6
8
  storageAdapter?: StorageAdapter;
7
9
  };
@@ -9,5 +11,12 @@ type PackageJsonTransformOptions = {
9
11
  * Main orchestration function
10
12
  */
11
13
  export declare function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void;
14
+ export declare function preparePackageJson({ filePath, options, }: {
15
+ filePath: string;
16
+ options: PackageJsonTransformOptions;
17
+ }): {
18
+ content: string;
19
+ filePath: string;
20
+ };
12
21
  export {};
13
22
  //# sourceMappingURL=package-json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/package-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMjE,KAAK,2BAA2B,GAAG;IACjC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAa9F"}
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/package-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMjE,KAAK,2BAA2B,GAAG;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAO9F;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,2BAA2B,CAAA;CACrC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQxC"}
@@ -6,13 +6,20 @@ import { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js';
6
6
  * Main orchestration function
7
7
  */ export function updatePackageJson(filePath, options) {
8
8
  debug(`[AST] Updating package.json: ${filePath}`);
9
- // Phase 1: Detection
9
+ const prepared = preparePackageJson({
10
+ filePath,
11
+ options
12
+ });
13
+ fs.writeFileSync(prepared.filePath, prepared.content);
14
+ debug('[AST] ✓ package.json updated successfully');
15
+ }
16
+ export function preparePackageJson({ filePath, options }) {
10
17
  const pkg = parsePackageJson(filePath);
11
- // Phase 2: Transformation
12
18
  const transformed = transformPackageJson(pkg, options);
13
- // Phase 3: Modification
14
- writePackageJson(filePath, transformed);
15
- debug('[AST] ✓ package.json updated successfully');
19
+ return {
20
+ content: `${JSON.stringify(transformed, null, 2)}\n`,
21
+ filePath
22
+ };
16
23
  }
17
24
  // Helper functions
18
25
  function parsePackageJson(filePath) {
@@ -89,6 +96,28 @@ function parsePackageJson(filePath) {
89
96
  debug('[AST] Sharp dependency not found (already absent)');
90
97
  }
91
98
  }
99
+ if (options.addDependencies) {
100
+ transformed.dependencies = {
101
+ ...transformed.dependencies,
102
+ ...options.addDependencies
103
+ };
104
+ }
105
+ if (options.removeDependencies) {
106
+ for (const dependencyGroup of [
107
+ 'dependencies',
108
+ 'devDependencies'
109
+ ]){
110
+ if (!transformed[dependencyGroup]) {
111
+ continue;
112
+ }
113
+ transformed[dependencyGroup] = {
114
+ ...transformed[dependencyGroup]
115
+ };
116
+ for (const packageName of options.removeDependencies){
117
+ delete transformed[dependencyGroup][packageName];
118
+ }
119
+ }
120
+ }
92
121
  // Update package name
93
122
  if (options.packageName) {
94
123
  debug(`[AST] Updated package name to: ${options.packageName}`);
@@ -96,8 +125,5 @@ function parsePackageJson(filePath) {
96
125
  }
97
126
  return transformed;
98
127
  }
99
- function writePackageJson(filePath, pkg) {
100
- fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
101
- }
102
128
 
103
129
  //# sourceMappingURL=package-json.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/package-json.ts"],"sourcesContent":["import * as fs from 'fs'\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { getDbPackageName, getStoragePackageName } from './adapter-config.js'\nimport { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js'\n\ntype PackageJsonTransformOptions = {\n databaseAdapter?: DatabaseAdapter\n packageName?: string\n removeSharp?: boolean\n storageAdapter?: StorageAdapter\n}\n\ntype PackageJsonStructure = {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n}\n\n/**\n * Main orchestration function\n */\nexport function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void {\n debug(`[AST] Updating package.json: ${filePath}`)\n\n // Phase 1: Detection\n const pkg = parsePackageJson(filePath)\n\n // Phase 2: Transformation\n const transformed = transformPackageJson(pkg, options)\n\n // Phase 3: Modification\n writePackageJson(filePath, transformed)\n\n debug('[AST] ✓ package.json updated successfully')\n}\n\n// Helper functions\n\nfunction parsePackageJson(filePath: string): PackageJsonStructure {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content)\n}\n\n/**\n * Transforms the package.json based upon provided options\n */\nfunction transformPackageJson(\n pkg: PackageJsonStructure,\n options: PackageJsonTransformOptions,\n): PackageJsonStructure {\n const transformed = { ...pkg }\n\n // Update database adapter\n if (options.databaseAdapter) {\n debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_DATABASE_ADAPTERS.forEach((adapter) => {\n const pkgName = getDbPackageName(adapter)\n if (transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n delete transformed.dependencies![pkgName]\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new adapter\n const dbAdapterPackageName = getDbPackageName(options.databaseAdapter)\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[dbAdapterPackageName] = payloadVersion\n\n debug(`[AST] Added adapter package: ${dbAdapterPackageName}`)\n }\n\n // Update storage adapter\n if (options.storageAdapter) {\n debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_STORAGE_ADAPTERS.forEach((adapter) => {\n const pkgName = getStoragePackageName(adapter)\n if (pkgName && transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n if (pkgName) {\n delete transformed.dependencies![pkgName]\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new storage adapter (if not localDisk)\n const storagePackageName = getStoragePackageName(options.storageAdapter)\n if (storagePackageName) {\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[storagePackageName] = payloadVersion\n debug(`[AST] Added storage adapter package: ${storagePackageName}`)\n } else {\n debug(`[AST] Storage adapter is localDisk, no package needed`)\n }\n }\n\n // Remove sharp\n if (options.removeSharp && transformed.dependencies) {\n transformed.dependencies = { ...transformed.dependencies }\n if (transformed.dependencies.sharp) {\n delete transformed.dependencies.sharp\n debug('[AST] Removed sharp dependency')\n } else {\n debug('[AST] Sharp dependency not found (already absent)')\n }\n }\n\n // Update package name\n if (options.packageName) {\n debug(`[AST] Updated package name to: ${options.packageName}`)\n transformed.name = options.packageName\n }\n\n return transformed\n}\n\nfunction writePackageJson(filePath: string, pkg: PackageJsonStructure): void {\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n')\n}\n"],"names":["fs","debug","getDbPackageName","getStoragePackageName","ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS","updatePackageJson","filePath","options","pkg","parsePackageJson","transformed","transformPackageJson","writePackageJson","content","readFileSync","JSON","parse","databaseAdapter","dependencies","removedAdapters","forEach","adapter","pkgName","push","length","join","dbAdapterPackageName","payloadVersion","payload","storageAdapter","storagePackageName","removeSharp","sharp","packageName","name","writeFileSync","stringify"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/ast/package-json.ts"],"sourcesContent":["import * as fs from 'fs'\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { getDbPackageName, getStoragePackageName } from './adapter-config.js'\nimport { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js'\n\ntype PackageJsonTransformOptions = {\n addDependencies?: Record<string, string>\n databaseAdapter?: DatabaseAdapter\n packageName?: string\n removeDependencies?: string[]\n removeSharp?: boolean\n storageAdapter?: StorageAdapter\n}\n\ntype PackageJsonStructure = {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n}\n\n/**\n * Main orchestration function\n */\nexport function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void {\n debug(`[AST] Updating package.json: ${filePath}`)\n\n const prepared = preparePackageJson({ filePath, options })\n fs.writeFileSync(prepared.filePath, prepared.content)\n\n debug('[AST] package.json updated successfully')\n}\n\nexport function preparePackageJson({\n filePath,\n options,\n}: {\n filePath: string\n options: PackageJsonTransformOptions\n}): { content: string; filePath: string } {\n const pkg = parsePackageJson(filePath)\n const transformed = transformPackageJson(pkg, options)\n\n return {\n content: `${JSON.stringify(transformed, null, 2)}\\n`,\n filePath,\n }\n}\n\n// Helper functions\n\nfunction parsePackageJson(filePath: string): PackageJsonStructure {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content)\n}\n\n/**\n * Transforms the package.json based upon provided options\n */\nfunction transformPackageJson(\n pkg: PackageJsonStructure,\n options: PackageJsonTransformOptions,\n): PackageJsonStructure {\n const transformed = { ...pkg }\n\n // Update database adapter\n if (options.databaseAdapter) {\n debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_DATABASE_ADAPTERS.forEach((adapter) => {\n const pkgName = getDbPackageName(adapter)\n if (transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n delete transformed.dependencies![pkgName]\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new adapter\n const dbAdapterPackageName = getDbPackageName(options.databaseAdapter)\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[dbAdapterPackageName] = payloadVersion\n\n debug(`[AST] Added adapter package: ${dbAdapterPackageName}`)\n }\n\n // Update storage adapter\n if (options.storageAdapter) {\n debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_STORAGE_ADAPTERS.forEach((adapter) => {\n const pkgName = getStoragePackageName(adapter)\n if (pkgName && transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n if (pkgName) {\n delete transformed.dependencies![pkgName]\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new storage adapter (if not localDisk)\n const storagePackageName = getStoragePackageName(options.storageAdapter)\n if (storagePackageName) {\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[storagePackageName] = payloadVersion\n debug(`[AST] Added storage adapter package: ${storagePackageName}`)\n } else {\n debug(`[AST] Storage adapter is localDisk, no package needed`)\n }\n }\n\n // Remove sharp\n if (options.removeSharp && transformed.dependencies) {\n transformed.dependencies = { ...transformed.dependencies }\n if (transformed.dependencies.sharp) {\n delete transformed.dependencies.sharp\n debug('[AST] Removed sharp dependency')\n } else {\n debug('[AST] Sharp dependency not found (already absent)')\n }\n }\n\n if (options.addDependencies) {\n transformed.dependencies = {\n ...transformed.dependencies,\n ...options.addDependencies,\n }\n }\n\n if (options.removeDependencies) {\n for (const dependencyGroup of ['dependencies', 'devDependencies'] as const) {\n if (!transformed[dependencyGroup]) {\n continue\n }\n\n transformed[dependencyGroup] = { ...transformed[dependencyGroup] }\n for (const packageName of options.removeDependencies) {\n delete transformed[dependencyGroup][packageName]\n }\n }\n }\n\n // Update package name\n if (options.packageName) {\n debug(`[AST] Updated package name to: ${options.packageName}`)\n transformed.name = options.packageName\n }\n\n return transformed\n}\n"],"names":["fs","debug","getDbPackageName","getStoragePackageName","ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS","updatePackageJson","filePath","options","prepared","preparePackageJson","writeFileSync","content","pkg","parsePackageJson","transformed","transformPackageJson","JSON","stringify","readFileSync","parse","databaseAdapter","dependencies","removedAdapters","forEach","adapter","pkgName","push","length","join","dbAdapterPackageName","payloadVersion","payload","storageAdapter","storagePackageName","removeSharp","sharp","addDependencies","removeDependencies","dependencyGroup","packageName","name"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { updatePackageJson } from './package-json';
2
+ import { preparePackageJson, updatePackageJson } from './package-json';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import * as os from 'os';
@@ -47,6 +47,78 @@ describe('updatePackageJson', ()=>{
47
47
  const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
48
48
  expect(updated.dependencies.sharp).toBeUndefined();
49
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
+ });
50
122
  it('updates package name', ()=>{
51
123
  const pkgPath = path.join(tempDir, 'package.json');
52
124
  const originalPkg = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/package-json.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { updatePackageJson } from './package-json'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('updatePackageJson', () => {\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('updates database dependencies', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n databaseAdapter: 'postgres',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined()\n expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined()\n })\n\n it('removes sharp when requested', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n payload: '^3.0.0',\n sharp: '^0.33.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n removeSharp: true,\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies.sharp).toBeUndefined()\n })\n\n it('updates package name', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'template-name',\n dependencies: {\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n packageName: 'my-new-app',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.name).toBe('my-new-app')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","updatePackageJson","fs","path","os","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","pkgPath","originalPkg","name","dependencies","payload","writeFileSync","JSON","stringify","databaseAdapter","updated","parse","readFileSync","toBeDefined","toBeUndefined","sharp","removeSharp","packageName","toBe"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,SAAS,QAAQ,SAAQ;AACpE,SAASC,iBAAiB,QAAQ,iBAAgB;AAClD,YAAYC,QAAQ,KAAI;AACxB,YAAYC,UAAU,OAAM;AAC5B,YAAYC,QAAQ,KAAI;AAExBR,SAAS,qBAAqB;IAC5B,IAAIS;IAEJN,WAAW;QACTM,UAAUH,GAAGI,WAAW,CAACH,KAAKI,IAAI,CAACH,GAAGI,MAAM,IAAI;IAClD;IAEAR,UAAU;QACRE,GAAGO,MAAM,CAACJ,SAAS;YAAEK,WAAW;YAAMC,OAAO;QAAK;IACpD;IAEAd,GAAG,iCAAiC;QAClC,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZ,0BAA0B;gBAC1BC,SAAS;YACX;QACF;QACAd,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBQ,iBAAiB;QACnB;QAEA,MAAMC,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQN,YAAY,CAAC,0BAA0B,EAAES,WAAW;QACnE1B,OAAOuB,QAAQN,YAAY,CAAC,yBAAyB,EAAEU,aAAa;IACtE;IAEA5B,GAAG,gCAAgC;QACjC,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;gBACTU,OAAO;YACT;QACF;QACAxB,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBe,aAAa;QACf;QAEA,MAAMN,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQN,YAAY,CAACW,KAAK,EAAED,aAAa;IAClD;IAEA5B,GAAG,wBAAwB;QACzB,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;YACX;QACF;QACAd,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBgB,aAAa;QACf;QAEA,MAAMP,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQP,IAAI,EAAEe,IAAI,CAAC;IAC5B;AACF"}
1
+ {"version":3,"sources":["../../../src/lib/ast/package-json.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { preparePackageJson, updatePackageJson } from './package-json'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('updatePackageJson', () => {\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('updates database dependencies', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n databaseAdapter: 'postgres',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined()\n expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined()\n })\n\n it('removes sharp when requested', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n payload: '^3.0.0',\n sharp: '^0.33.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n removeSharp: true,\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies.sharp).toBeUndefined()\n })\n\n it('should remove selected packages from dependencies and devDependencies', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n scripts: {\n dev: 'vite',\n },\n dependencies: {\n '@tanstack/router-plugin': '^1.0.0',\n payload: '^4.0.0',\n },\n devDependencies: {\n '@tanstack/router-plugin': '^1.0.0',\n typescript: '^6.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n removeDependencies: ['@tanstack/router-plugin'],\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n\n expect(updated).toEqual({\n name: 'test-app',\n scripts: {\n dev: 'vite',\n },\n dependencies: {\n payload: '^4.0.0',\n },\n devDependencies: {\n typescript: '^6.0.0',\n },\n })\n })\n\n it('should prepare exact package content without writing to disk', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const original = JSON.stringify(\n {\n dependencies: {\n '@tanstack/router-plugin': '^1.0.0',\n payload: '^4.0.0',\n },\n devDependencies: {\n '@tanstack/router-plugin': '^1.0.0',\n typescript: '^6.0.0',\n },\n name: 'router-app',\n },\n null,\n 2,\n )\n fs.writeFileSync(pkgPath, original)\n\n const prepared = preparePackageJson({\n filePath: pkgPath,\n options: { removeDependencies: ['@tanstack/router-plugin'] },\n })\n\n expect(prepared).toEqual({\n content: `${JSON.stringify(\n {\n dependencies: {\n payload: '^4.0.0',\n },\n devDependencies: {\n typescript: '^6.0.0',\n },\n name: 'router-app',\n },\n null,\n 2,\n )}\\n`,\n filePath: pkgPath,\n })\n expect(fs.readFileSync(pkgPath, 'utf8')).toBe(original)\n })\n\n it('updates package name', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'template-name',\n dependencies: {\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n packageName: 'my-new-app',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.name).toBe('my-new-app')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","preparePackageJson","updatePackageJson","fs","path","os","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","pkgPath","originalPkg","name","dependencies","payload","writeFileSync","JSON","stringify","databaseAdapter","updated","parse","readFileSync","toBeDefined","toBeUndefined","sharp","removeSharp","scripts","dev","devDependencies","typescript","removeDependencies","toEqual","original","prepared","filePath","options","content","toBe","packageName"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function configurePayloadTsConfig({ configPath, payloadConfigPath, }: {
2
+ configPath: string;
3
+ payloadConfigPath: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=configure-payload-tsconfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-payload-tsconfig.d.ts","sourceRoot":"","sources":["../../src/lib/configure-payload-tsconfig.ts"],"names":[],"mappings":"AAaA,wBAAsB,wBAAwB,CAAC,EAC7C,UAAU,EACV,iBAAiB,GAClB,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
@@ -0,0 +1,26 @@
1
+ import { parse, stringify } from 'comment-json';
2
+ import fse from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { warning } from '../utils/log.js';
5
+ export async function configurePayloadTsConfig({ configPath, payloadConfigPath }) {
6
+ if (!await fse.pathExists(configPath)) {
7
+ warning('Could not find tsconfig.json to add @payload-config path.');
8
+ return;
9
+ }
10
+ const content = await fse.readFile(configPath, 'utf8');
11
+ const tsConfig = parse(content);
12
+ tsConfig.compilerOptions ??= {};
13
+ tsConfig.compilerOptions.paths ??= {};
14
+ if (tsConfig.compilerOptions.paths['@payload-config']) {
15
+ return;
16
+ }
17
+ const baseUrlPath = path.resolve(path.dirname(configPath), tsConfig.compilerOptions.baseUrl ?? '.');
18
+ const relativePayloadConfigPath = path.relative(baseUrlPath, payloadConfigPath).split(path.sep).join('/');
19
+ const payloadAliasPath = relativePayloadConfigPath.startsWith('.') ? relativePayloadConfigPath : `./${relativePayloadConfigPath}`;
20
+ tsConfig.compilerOptions.paths['@payload-config'] = [
21
+ payloadAliasPath
22
+ ];
23
+ await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8');
24
+ }
25
+
26
+ //# sourceMappingURL=configure-payload-tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/configure-payload-tsconfig.ts"],"sourcesContent":["import { parse, stringify } from 'comment-json'\nimport fse from 'fs-extra'\nimport path from 'node:path'\n\nimport { warning } from '../utils/log.js'\n\ntype TsConfig = {\n compilerOptions?: {\n baseUrl?: string\n paths?: Record<string, string[]>\n }\n}\n\nexport async function configurePayloadTsConfig({\n configPath,\n payloadConfigPath,\n}: {\n configPath: string\n payloadConfigPath: string\n}): Promise<void> {\n if (!(await fse.pathExists(configPath))) {\n warning('Could not find tsconfig.json to add @payload-config path.')\n return\n }\n\n const content = await fse.readFile(configPath, 'utf8')\n const tsConfig = parse(content) as TsConfig\n\n tsConfig.compilerOptions ??= {}\n tsConfig.compilerOptions.paths ??= {}\n\n if (tsConfig.compilerOptions.paths['@payload-config']) {\n return\n }\n\n const baseUrlPath = path.resolve(\n path.dirname(configPath),\n tsConfig.compilerOptions.baseUrl ?? '.',\n )\n const relativePayloadConfigPath = path\n .relative(baseUrlPath, payloadConfigPath)\n .split(path.sep)\n .join('/')\n const payloadAliasPath = relativePayloadConfigPath.startsWith('.')\n ? relativePayloadConfigPath\n : `./${relativePayloadConfigPath}`\n\n tsConfig.compilerOptions.paths['@payload-config'] = [payloadAliasPath]\n await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8')\n}\n"],"names":["parse","stringify","fse","path","warning","configurePayloadTsConfig","configPath","payloadConfigPath","pathExists","content","readFile","tsConfig","compilerOptions","paths","baseUrlPath","resolve","dirname","baseUrl","relativePayloadConfigPath","relative","split","sep","join","payloadAliasPath","startsWith","writeFile"],"mappings":"AAAA,SAASA,KAAK,EAAEC,SAAS,QAAQ,eAAc;AAC/C,OAAOC,SAAS,WAAU;AAC1B,OAAOC,UAAU,YAAW;AAE5B,SAASC,OAAO,QAAQ,kBAAiB;AASzC,OAAO,eAAeC,yBAAyB,EAC7CC,UAAU,EACVC,iBAAiB,EAIlB;IACC,IAAI,CAAE,MAAML,IAAIM,UAAU,CAACF,aAAc;QACvCF,QAAQ;QACR;IACF;IAEA,MAAMK,UAAU,MAAMP,IAAIQ,QAAQ,CAACJ,YAAY;IAC/C,MAAMK,WAAWX,MAAMS;IAEvBE,SAASC,eAAe,KAAK,CAAC;IAC9BD,SAASC,eAAe,CAACC,KAAK,KAAK,CAAC;IAEpC,IAAIF,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,EAAE;QACrD;IACF;IAEA,MAAMC,cAAcX,KAAKY,OAAO,CAC9BZ,KAAKa,OAAO,CAACV,aACbK,SAASC,eAAe,CAACK,OAAO,IAAI;IAEtC,MAAMC,4BAA4Bf,KAC/BgB,QAAQ,CAACL,aAAaP,mBACtBa,KAAK,CAACjB,KAAKkB,GAAG,EACdC,IAAI,CAAC;IACR,MAAMC,mBAAmBL,0BAA0BM,UAAU,CAAC,OAC1DN,4BACA,CAAC,EAAE,EAAEA,2BAA2B;IAEpCP,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,GAAG;QAACU;KAAiB;IACtE,MAAMrB,IAAIuB,SAAS,CAACnB,YAAYL,UAAUU,UAAU,MAAM,IAAI;AAChE"}
@@ -0,0 +1,135 @@
1
+ import { parse } from 'comment-json';
2
+ import fse from 'fs-extra';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
6
+ import { configurePayloadTsConfig } from './configure-payload-tsconfig.js';
7
+ describe('configurePayloadTsConfig', ()=>{
8
+ let configPath;
9
+ let payloadConfigPath;
10
+ let projectDir;
11
+ beforeEach(()=>{
12
+ projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-payload-tsconfig-'));
13
+ configPath = path.join(projectDir, 'tsconfig.json');
14
+ payloadConfigPath = path.join(projectDir, 'src/payload.config.ts');
15
+ });
16
+ afterEach(()=>{
17
+ fse.removeSync(projectDir);
18
+ });
19
+ it('should add the Payload alias without changing existing paths', async ()=>{
20
+ writeTsConfig(`{
21
+ "compilerOptions": {
22
+ "paths": {
23
+ "@/*": ["./src/*"]
24
+ }
25
+ }
26
+ }`);
27
+ await configurePayloadTsConfig({
28
+ configPath,
29
+ payloadConfigPath
30
+ });
31
+ expect(readTsConfig().compilerOptions.paths).toEqual({
32
+ '@/*': [
33
+ './src/*'
34
+ ],
35
+ '@payload-config': [
36
+ './src/payload.config.ts'
37
+ ]
38
+ });
39
+ });
40
+ it('should create paths when compiler options do not define them', async ()=>{
41
+ writeTsConfig(`{
42
+ "compilerOptions": {
43
+ "strict": true
44
+ }
45
+ }`);
46
+ await configurePayloadTsConfig({
47
+ configPath,
48
+ payloadConfigPath
49
+ });
50
+ expect(readTsConfig().compilerOptions).toEqual({
51
+ paths: {
52
+ '@payload-config': [
53
+ './src/payload.config.ts'
54
+ ]
55
+ },
56
+ strict: true
57
+ });
58
+ });
59
+ it('should preserve comments while adding the Payload alias', async ()=>{
60
+ writeTsConfig(`{
61
+ // Keep this compiler explanation.
62
+ "compilerOptions": {
63
+ "paths": {
64
+ // Keep this application alias.
65
+ "@/*": ["./src/*"]
66
+ }
67
+ }
68
+ }`);
69
+ await configurePayloadTsConfig({
70
+ configPath,
71
+ payloadConfigPath
72
+ });
73
+ const content = fse.readFileSync(configPath, 'utf8');
74
+ expect(content).toContain('// Keep this compiler explanation.');
75
+ expect(content).toContain('// Keep this application alias.');
76
+ expect(readTsConfig().compilerOptions.paths['@payload-config']).toEqual([
77
+ './src/payload.config.ts'
78
+ ]);
79
+ });
80
+ it('should resolve the Payload alias relative to a non-default baseUrl', async ()=>{
81
+ writeTsConfig(`{
82
+ "compilerOptions": {
83
+ "baseUrl": "./src",
84
+ "paths": {}
85
+ }
86
+ }`);
87
+ await configurePayloadTsConfig({
88
+ configPath,
89
+ payloadConfigPath
90
+ });
91
+ expect(readTsConfig().compilerOptions.paths['@payload-config']).toEqual([
92
+ './payload.config.ts'
93
+ ]);
94
+ });
95
+ it('should leave an existing Payload alias unchanged', async ()=>{
96
+ const original = `{
97
+ "compilerOptions": {
98
+ "paths": {
99
+ "@payload-config": ["./custom/payload.ts"]
100
+ }
101
+ }
102
+ }`;
103
+ writeTsConfig(original);
104
+ await configurePayloadTsConfig({
105
+ configPath,
106
+ payloadConfigPath
107
+ });
108
+ expect(fse.readFileSync(configPath, 'utf8')).toBe(original);
109
+ });
110
+ it('should be idempotent after adding the Payload alias', async ()=>{
111
+ writeTsConfig(`{
112
+ "compilerOptions": {
113
+ "paths": {}
114
+ }
115
+ }`);
116
+ await configurePayloadTsConfig({
117
+ configPath,
118
+ payloadConfigPath
119
+ });
120
+ const firstResult = fse.readFileSync(configPath, 'utf8');
121
+ await configurePayloadTsConfig({
122
+ configPath,
123
+ payloadConfigPath
124
+ });
125
+ expect(fse.readFileSync(configPath, 'utf8')).toBe(firstResult);
126
+ });
127
+ function readTsConfig() {
128
+ return parse(fse.readFileSync(configPath, 'utf8'));
129
+ }
130
+ function writeTsConfig(content) {
131
+ fse.writeFileSync(configPath, content);
132
+ }
133
+ });
134
+
135
+ //# sourceMappingURL=configure-payload-tsconfig.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/configure-payload-tsconfig.spec.ts"],"sourcesContent":["import { parse } from 'comment-json'\nimport fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest'\n\nimport { configurePayloadTsConfig } from './configure-payload-tsconfig.js'\n\ndescribe('configurePayloadTsConfig', () => {\n let configPath: string\n let payloadConfigPath: string\n let projectDir: string\n\n beforeEach(() => {\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-payload-tsconfig-'))\n configPath = path.join(projectDir, 'tsconfig.json')\n payloadConfigPath = path.join(projectDir, 'src/payload.config.ts')\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should add the Payload alias without changing existing paths', async () => {\n writeTsConfig(`{\n \"compilerOptions\": {\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n }\n}`)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n expect(readTsConfig().compilerOptions.paths).toEqual({\n '@/*': ['./src/*'],\n '@payload-config': ['./src/payload.config.ts'],\n })\n })\n\n it('should create paths when compiler options do not define them', async () => {\n writeTsConfig(`{\n \"compilerOptions\": {\n \"strict\": true\n }\n}`)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n expect(readTsConfig().compilerOptions).toEqual({\n paths: {\n '@payload-config': ['./src/payload.config.ts'],\n },\n strict: true,\n })\n })\n\n it('should preserve comments while adding the Payload alias', async () => {\n writeTsConfig(`{\n // Keep this compiler explanation.\n \"compilerOptions\": {\n \"paths\": {\n // Keep this application alias.\n \"@/*\": [\"./src/*\"]\n }\n }\n}`)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n const content = fse.readFileSync(configPath, 'utf8')\n\n expect(content).toContain('// Keep this compiler explanation.')\n expect(content).toContain('// Keep this application alias.')\n expect(readTsConfig().compilerOptions.paths['@payload-config']).toEqual([\n './src/payload.config.ts',\n ])\n })\n\n it('should resolve the Payload alias relative to a non-default baseUrl', async () => {\n writeTsConfig(`{\n \"compilerOptions\": {\n \"baseUrl\": \"./src\",\n \"paths\": {}\n }\n}`)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n expect(readTsConfig().compilerOptions.paths['@payload-config']).toEqual(['./payload.config.ts'])\n })\n\n it('should leave an existing Payload alias unchanged', async () => {\n const original = `{\n \"compilerOptions\": {\n \"paths\": {\n \"@payload-config\": [\"./custom/payload.ts\"]\n }\n }\n}`\n writeTsConfig(original)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n expect(fse.readFileSync(configPath, 'utf8')).toBe(original)\n })\n\n it('should be idempotent after adding the Payload alias', async () => {\n writeTsConfig(`{\n \"compilerOptions\": {\n \"paths\": {}\n }\n}`)\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n const firstResult = fse.readFileSync(configPath, 'utf8')\n\n await configurePayloadTsConfig({ configPath, payloadConfigPath })\n\n expect(fse.readFileSync(configPath, 'utf8')).toBe(firstResult)\n })\n\n function readTsConfig(): {\n compilerOptions: {\n baseUrl?: string\n paths: Record<string, string[]>\n strict?: boolean\n }\n } {\n return parse(fse.readFileSync(configPath, 'utf8')) as {\n compilerOptions: {\n baseUrl?: string\n paths: Record<string, string[]>\n strict?: boolean\n }\n }\n }\n\n function writeTsConfig(content: string): void {\n fse.writeFileSync(configPath, content)\n }\n})\n"],"names":["parse","fse","os","path","afterEach","beforeEach","describe","expect","it","configurePayloadTsConfig","configPath","payloadConfigPath","projectDir","mkdtempSync","join","tmpdir","removeSync","writeTsConfig","readTsConfig","compilerOptions","paths","toEqual","strict","content","readFileSync","toContain","original","toBe","firstResult","writeFileSync"],"mappings":"AAAA,SAASA,KAAK,QAAQ,eAAc;AACpC,OAAOC,SAAS,WAAU;AAC1B,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAEpE,SAASC,wBAAwB,QAAQ,kCAAiC;AAE1EH,SAAS,4BAA4B;IACnC,IAAII;IACJ,IAAIC;IACJ,IAAIC;IAEJP,WAAW;QACTO,aAAaX,IAAIY,WAAW,CAACV,KAAKW,IAAI,CAACZ,GAAGa,MAAM,IAAI;QACpDL,aAAaP,KAAKW,IAAI,CAACF,YAAY;QACnCD,oBAAoBR,KAAKW,IAAI,CAACF,YAAY;IAC5C;IAEAR,UAAU;QACRH,IAAIe,UAAU,CAACJ;IACjB;IAEAJ,GAAG,gEAAgE;QACjES,cAAc,CAAC;;;;;;CAMlB,CAAC;QAEE,MAAMR,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/DJ,OAAOW,eAAeC,eAAe,CAACC,KAAK,EAAEC,OAAO,CAAC;YACnD,OAAO;gBAAC;aAAU;YAClB,mBAAmB;gBAAC;aAA0B;QAChD;IACF;IAEAb,GAAG,gEAAgE;QACjES,cAAc,CAAC;;;;CAIlB,CAAC;QAEE,MAAMR,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/DJ,OAAOW,eAAeC,eAAe,EAAEE,OAAO,CAAC;YAC7CD,OAAO;gBACL,mBAAmB;oBAAC;iBAA0B;YAChD;YACAE,QAAQ;QACV;IACF;IAEAd,GAAG,2DAA2D;QAC5DS,cAAc,CAAC;;;;;;;;CAQlB,CAAC;QAEE,MAAMR,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/D,MAAMY,UAAUtB,IAAIuB,YAAY,CAACd,YAAY;QAE7CH,OAAOgB,SAASE,SAAS,CAAC;QAC1BlB,OAAOgB,SAASE,SAAS,CAAC;QAC1BlB,OAAOW,eAAeC,eAAe,CAACC,KAAK,CAAC,kBAAkB,EAAEC,OAAO,CAAC;YACtE;SACD;IACH;IAEAb,GAAG,sEAAsE;QACvES,cAAc,CAAC;;;;;CAKlB,CAAC;QAEE,MAAMR,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/DJ,OAAOW,eAAeC,eAAe,CAACC,KAAK,CAAC,kBAAkB,EAAEC,OAAO,CAAC;YAAC;SAAsB;IACjG;IAEAb,GAAG,oDAAoD;QACrD,MAAMkB,WAAW,CAAC;;;;;;CAMrB,CAAC;QACET,cAAcS;QAEd,MAAMjB,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/DJ,OAAON,IAAIuB,YAAY,CAACd,YAAY,SAASiB,IAAI,CAACD;IACpD;IAEAlB,GAAG,uDAAuD;QACxDS,cAAc,CAAC;;;;CAIlB,CAAC;QAEE,MAAMR,yBAAyB;YAAEC;YAAYC;QAAkB;QAC/D,MAAMiB,cAAc3B,IAAIuB,YAAY,CAACd,YAAY;QAEjD,MAAMD,yBAAyB;YAAEC;YAAYC;QAAkB;QAE/DJ,OAAON,IAAIuB,YAAY,CAACd,YAAY,SAASiB,IAAI,CAACC;IACpD;IAEA,SAASV;QAOP,OAAOlB,MAAMC,IAAIuB,YAAY,CAACd,YAAY;IAO5C;IAEA,SAASO,cAAcM,OAAe;QACpCtB,IAAI4B,aAAa,CAACnB,YAAYa;IAChC;AACF"}
@@ -1,11 +1,10 @@
1
- import type { AgentType, CliArgs, DbDetails, PackageManager, ProjectExample, ProjectTemplate } from '../types.js';
1
+ import type { CliArgs, DbDetails, PackageManager, ProjectExample, ProjectTemplate } from '../types.js';
2
2
  type TemplateOrExample = {
3
3
  example: ProjectExample;
4
4
  } | {
5
5
  template: ProjectTemplate;
6
6
  };
7
7
  export declare function createProject(args: {
8
- agentType?: AgentType;
9
8
  cliArgs: CliArgs;
10
9
  dbDetails?: DbDetails;
11
10
  packageManager: PackageManager;
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AA4DpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,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,CA6Hf;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;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"}