create-payload-app 3.40.0-canary.3 → 3.40.0-canary.5
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.
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"configure-plugin-project.d.ts","sourceRoot":"","sources":["../../src/lib/configure-plugin-project.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,sBAAsB,qCAGhC;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB,
|
1
|
+
{"version":3,"file":"configure-plugin-project.d.ts","sourceRoot":"","sources":["../../src/lib/configure-plugin-project.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,sBAAsB,qCAGhC;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB,SAmCA,CAAA"}
|
@@ -7,10 +7,13 @@ import { toCamelCase, toPascalCase } from '../utils/casing.js';
|
|
7
7
|
const devPayloadConfigPath = path.resolve(projectDirPath, './dev/payload.config.ts');
|
8
8
|
const devTsConfigPath = path.resolve(projectDirPath, './dev/tsconfig.json');
|
9
9
|
const indexTsPath = path.resolve(projectDirPath, './src/index.ts');
|
10
|
+
const devImportMapPath = path.resolve(projectDirPath, './dev/app/(payload)/admin/importMap.js');
|
10
11
|
const devPayloadConfig = fse.readFileSync(devPayloadConfigPath, 'utf8');
|
11
12
|
const devTsConfig = fse.readFileSync(devTsConfigPath, 'utf8');
|
12
13
|
const indexTs = fse.readFileSync(indexTsPath, 'utf-8');
|
14
|
+
const devImportMap = fse.readFileSync(devImportMapPath, 'utf-8');
|
13
15
|
const updatedTsConfig = devTsConfig.replaceAll('plugin-package-name-placeholder', projectName);
|
16
|
+
const updatedImportMap = devImportMap.replaceAll('plugin-package-name-placeholder', projectName);
|
14
17
|
let updatedIndexTs = indexTs.replaceAll('plugin-package-name-placeholder', projectName);
|
15
18
|
const pluginExportVariableName = toCamelCase(projectName);
|
16
19
|
updatedIndexTs = updatedIndexTs.replace('export const myPlugin', `export const ${pluginExportVariableName}`);
|
@@ -20,6 +23,7 @@ import { toCamelCase, toPascalCase } from '../utils/casing.js';
|
|
20
23
|
fse.writeFileSync(devPayloadConfigPath, updatedPayloadConfig);
|
21
24
|
fse.writeFileSync(devTsConfigPath, updatedTsConfig);
|
22
25
|
fse.writeFileSync(indexTsPath, updatedIndexTs);
|
26
|
+
fse.writeFileSync(devImportMapPath, updatedImportMap);
|
23
27
|
};
|
24
28
|
|
25
29
|
//# sourceMappingURL=configure-plugin-project.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/lib/configure-plugin-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport path from 'path'\n\nimport { toCamelCase, toPascalCase } from '../utils/casing.js'\n\n/**\n * Configures a plugin project by updating all package name placeholders to projectName\n */\nexport const configurePluginProject = ({\n projectDirPath,\n projectName,\n}: {\n projectDirPath: string\n projectName: string\n}) => {\n const devPayloadConfigPath = path.resolve(projectDirPath, './dev/payload.config.ts')\n const devTsConfigPath = path.resolve(projectDirPath, './dev/tsconfig.json')\n const indexTsPath = path.resolve(projectDirPath, './src/index.ts')\n\n const devPayloadConfig = fse.readFileSync(devPayloadConfigPath, 'utf8')\n const devTsConfig = fse.readFileSync(devTsConfigPath, 'utf8')\n const indexTs = fse.readFileSync(indexTsPath, 'utf-8')\n\n const updatedTsConfig = devTsConfig.replaceAll('plugin-package-name-placeholder', projectName)\n let updatedIndexTs = indexTs.replaceAll('plugin-package-name-placeholder', projectName)\n\n const pluginExportVariableName = toCamelCase(projectName)\n\n updatedIndexTs = updatedIndexTs.replace(\n 'export const myPlugin',\n `export const ${pluginExportVariableName}`,\n )\n\n updatedIndexTs = updatedIndexTs.replaceAll('MyPluginConfig', `${toPascalCase(projectName)}Config`)\n\n let updatedPayloadConfig = devPayloadConfig.replace(\n 'plugin-package-name-placeholder',\n projectName,\n )\n\n updatedPayloadConfig = updatedPayloadConfig.replaceAll('myPlugin', pluginExportVariableName)\n\n fse.writeFileSync(devPayloadConfigPath, updatedPayloadConfig)\n fse.writeFileSync(devTsConfigPath, updatedTsConfig)\n fse.writeFileSync(indexTsPath, updatedIndexTs)\n}\n"],"names":["fse","path","toCamelCase","toPascalCase","configurePluginProject","projectDirPath","projectName","devPayloadConfigPath","resolve","devTsConfigPath","indexTsPath","devPayloadConfig","readFileSync","devTsConfig","indexTs","updatedTsConfig","replaceAll","updatedIndexTs","pluginExportVariableName","replace","updatedPayloadConfig","writeFileSync"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,OAAOC,UAAU,OAAM;AAEvB,SAASC,WAAW,EAAEC,YAAY,QAAQ,qBAAoB;AAE9D;;CAEC,GACD,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,cAAc,EACdC,WAAW,EAIZ;IACC,MAAMC,uBAAuBN,KAAKO,OAAO,CAACH,gBAAgB;IAC1D,MAAMI,kBAAkBR,KAAKO,OAAO,CAACH,gBAAgB;IACrD,MAAMK,cAAcT,KAAKO,OAAO,CAACH,gBAAgB;
|
1
|
+
{"version":3,"sources":["../../src/lib/configure-plugin-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport path from 'path'\n\nimport { toCamelCase, toPascalCase } from '../utils/casing.js'\n\n/**\n * Configures a plugin project by updating all package name placeholders to projectName\n */\nexport const configurePluginProject = ({\n projectDirPath,\n projectName,\n}: {\n projectDirPath: string\n projectName: string\n}) => {\n const devPayloadConfigPath = path.resolve(projectDirPath, './dev/payload.config.ts')\n const devTsConfigPath = path.resolve(projectDirPath, './dev/tsconfig.json')\n const indexTsPath = path.resolve(projectDirPath, './src/index.ts')\n const devImportMapPath = path.resolve(projectDirPath, './dev/app/(payload)/admin/importMap.js')\n\n const devPayloadConfig = fse.readFileSync(devPayloadConfigPath, 'utf8')\n const devTsConfig = fse.readFileSync(devTsConfigPath, 'utf8')\n const indexTs = fse.readFileSync(indexTsPath, 'utf-8')\n const devImportMap = fse.readFileSync(devImportMapPath, 'utf-8')\n\n const updatedTsConfig = devTsConfig.replaceAll('plugin-package-name-placeholder', projectName)\n const updatedImportMap = devImportMap.replaceAll('plugin-package-name-placeholder', projectName)\n let updatedIndexTs = indexTs.replaceAll('plugin-package-name-placeholder', projectName)\n\n const pluginExportVariableName = toCamelCase(projectName)\n\n updatedIndexTs = updatedIndexTs.replace(\n 'export const myPlugin',\n `export const ${pluginExportVariableName}`,\n )\n\n updatedIndexTs = updatedIndexTs.replaceAll('MyPluginConfig', `${toPascalCase(projectName)}Config`)\n\n let updatedPayloadConfig = devPayloadConfig.replace(\n 'plugin-package-name-placeholder',\n projectName,\n )\n\n updatedPayloadConfig = updatedPayloadConfig.replaceAll('myPlugin', pluginExportVariableName)\n\n fse.writeFileSync(devPayloadConfigPath, updatedPayloadConfig)\n fse.writeFileSync(devTsConfigPath, updatedTsConfig)\n fse.writeFileSync(indexTsPath, updatedIndexTs)\n fse.writeFileSync(devImportMapPath, updatedImportMap)\n}\n"],"names":["fse","path","toCamelCase","toPascalCase","configurePluginProject","projectDirPath","projectName","devPayloadConfigPath","resolve","devTsConfigPath","indexTsPath","devImportMapPath","devPayloadConfig","readFileSync","devTsConfig","indexTs","devImportMap","updatedTsConfig","replaceAll","updatedImportMap","updatedIndexTs","pluginExportVariableName","replace","updatedPayloadConfig","writeFileSync"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,OAAOC,UAAU,OAAM;AAEvB,SAASC,WAAW,EAAEC,YAAY,QAAQ,qBAAoB;AAE9D;;CAEC,GACD,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,cAAc,EACdC,WAAW,EAIZ;IACC,MAAMC,uBAAuBN,KAAKO,OAAO,CAACH,gBAAgB;IAC1D,MAAMI,kBAAkBR,KAAKO,OAAO,CAACH,gBAAgB;IACrD,MAAMK,cAAcT,KAAKO,OAAO,CAACH,gBAAgB;IACjD,MAAMM,mBAAmBV,KAAKO,OAAO,CAACH,gBAAgB;IAEtD,MAAMO,mBAAmBZ,IAAIa,YAAY,CAACN,sBAAsB;IAChE,MAAMO,cAAcd,IAAIa,YAAY,CAACJ,iBAAiB;IACtD,MAAMM,UAAUf,IAAIa,YAAY,CAACH,aAAa;IAC9C,MAAMM,eAAehB,IAAIa,YAAY,CAACF,kBAAkB;IAExD,MAAMM,kBAAkBH,YAAYI,UAAU,CAAC,mCAAmCZ;IAClF,MAAMa,mBAAmBH,aAAaE,UAAU,CAAC,mCAAmCZ;IACpF,IAAIc,iBAAiBL,QAAQG,UAAU,CAAC,mCAAmCZ;IAE3E,MAAMe,2BAA2BnB,YAAYI;IAE7Cc,iBAAiBA,eAAeE,OAAO,CACrC,yBACA,CAAC,aAAa,EAAED,0BAA0B;IAG5CD,iBAAiBA,eAAeF,UAAU,CAAC,kBAAkB,GAAGf,aAAaG,aAAa,MAAM,CAAC;IAEjG,IAAIiB,uBAAuBX,iBAAiBU,OAAO,CACjD,mCACAhB;IAGFiB,uBAAuBA,qBAAqBL,UAAU,CAAC,YAAYG;IAEnErB,IAAIwB,aAAa,CAACjB,sBAAsBgB;IACxCvB,IAAIwB,aAAa,CAACf,iBAAiBQ;IACnCjB,IAAIwB,aAAa,CAACd,aAAaU;IAC/BpB,IAAIwB,aAAa,CAACb,kBAAkBQ;AACtC,EAAC"}
|
@@ -58,6 +58,29 @@ describe('createProject', ()=>{
|
|
58
58
|
// Check package name and description
|
59
59
|
expect(packageJson.name).toStrictEqual(projectName);
|
60
60
|
});
|
61
|
+
it('updates project name in plugin template importMap file', async ()=>{
|
62
|
+
const projectName = 'my-custom-plugin';
|
63
|
+
const template = {
|
64
|
+
name: 'plugin',
|
65
|
+
type: 'plugin',
|
66
|
+
description: 'Template for creating a Payload plugin',
|
67
|
+
url: 'https://github.com/payloadcms/payload/templates/plugin'
|
68
|
+
};
|
69
|
+
await createProject({
|
70
|
+
cliArgs: {
|
71
|
+
...args,
|
72
|
+
'--local-template': 'plugin'
|
73
|
+
},
|
74
|
+
packageManager,
|
75
|
+
projectDir,
|
76
|
+
projectName,
|
77
|
+
template
|
78
|
+
});
|
79
|
+
const importMapPath = path.resolve(projectDir, './dev/app/(payload)/admin/importMap.js');
|
80
|
+
const importMapFile = fse.readFileSync(importMapPath, 'utf-8');
|
81
|
+
expect(importMapFile).not.toContain('plugin-package-name-placeholder');
|
82
|
+
expect(importMapFile).toContain('my-custom-plugin');
|
83
|
+
});
|
61
84
|
it('creates example', async ()=>{
|
62
85
|
const projectName = 'custom-server-example';
|
63
86
|
const example = {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import { jest } from '@jest/globals'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport * as os from 'node:os'\nimport path from 'path'\n\nimport type { CliArgs, DbType, ProjectExample, ProjectTemplate } from '../types.js'\n\nimport { createProject } from './create-project.js'\nimport { dbReplacements } from './replacements.js'\nimport { getValidTemplates } from './templates.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\ndescribe('createProject', () => {\n let projectDir: string\n beforeAll(() => {\n // eslint-disable-next-line no-console\n console.log = jest.fn()\n })\n\n beforeEach(() => {\n const tempDirectory = fs.realpathSync(os.tmpdir())\n projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`\n })\n\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n describe('#createProject', () => {\n const args = {\n _: ['project-name'],\n '--db': 'mongodb',\n '--local-template': 'blank',\n '--no-deps': true,\n } as CliArgs\n const packageManager = 'yarn'\n\n it('creates plugin template', async () => {\n const projectName = 'plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin',\n }\n\n await createProject({\n cliArgs: { ...args, '--local-template': 'plugin' } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n template,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n })\n\n it('creates example', async () => {\n const projectName = 'custom-server-example'\n const example: ProjectExample = {\n name: 'custom-server',\n url: 'https://github.com/payloadcms/payload/examples/custom-server#main',\n }\n\n await createProject({\n cliArgs: {\n ...args,\n '--local-template': undefined,\n '--local-example': 'custom-server',\n } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n example,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n })\n\n describe('creates project from template', () => {\n const templates = getValidTemplates()\n\n it.each([\n ['blank', 'mongodb'],\n ['blank', 'postgres'],\n\n // TODO: Re-enable these once 3.0 is stable and templates updated\n // ['website', 'mongodb'],\n // ['website', 'postgres'],\n // ['ecommerce', 'mongodb'],\n // ['ecommerce', 'postgres'],\n ])('update config and deps: %s, %s', async (templateName, db) => {\n const projectName = 'starter-project'\n\n const template = templates.find((t) => t.name === templateName)\n\n const cliArgs = {\n ...args,\n '--db': db,\n '--local-template': templateName,\n } as CliArgs\n\n await createProject({\n cliArgs,\n dbDetails: {\n type: db as DbType,\n dbUri: `${db}://localhost:27017/create-project-test`,\n },\n packageManager,\n projectDir,\n projectName,\n template: template as ProjectTemplate,\n })\n\n const dbReplacement = dbReplacements[db as DbType]\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Verify git was initialized\n expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true)\n\n // Should only have one db adapter\n expect(\n Object.keys(packageJson.dependencies).filter((n) => n.startsWith('@payloadcms/db-')),\n ).toHaveLength(1)\n\n const payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: projectDir,\n })\n )?.[0]\n\n const content = fse.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check payload.config.ts\n expect(content).not.toContain('// database-adapter-import')\n expect(content).toContain(dbReplacement.importReplacement)\n\n expect(content).not.toContain('// database-adapter-config-start')\n expect(content).not.toContain('// database-adapter-config-end')\n expect(content).toContain(dbReplacement.configReplacement().join('\\n'))\n })\n })\n describe('managing env files', () => {\n it('updates .env files without overwriting existing data', async () => {\n const envFilePath = path.join(projectDir, '.env')\n const envExampleFilePath = path.join(projectDir, '.env.example')\n\n fse.ensureDirSync(projectDir)\n fse.ensureFileSync(envFilePath)\n fse.ensureFileSync(envExampleFilePath)\n\n const initialEnvContent = `CUSTOM_VAR=custom-value\\nDATABASE_URI=old-connection\\n`\n const initialEnvExampleContent = `CUSTOM_VAR=custom-value\\nDATABASE_URI=old-connection\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\n`\n\n fse.writeFileSync(envFilePath, initialEnvContent)\n fse.writeFileSync(envExampleFilePath, initialEnvExampleContent)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb',\n databaseUri: 'mongodb://localhost:27017/test',\n payloadSecret: 'test-secret',\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toContain('CUSTOM_VAR=custom-value')\n expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret')\n\n const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8')\n\n expect(updatedEnvExampleContent).toContain('CUSTOM_VAR=custom-value')\n expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret')\n })\n\n it('creates .env and .env.example if they do not exist', async () => {\n const envFilePath = path.join(projectDir, '.env')\n const envExampleFilePath = path.join(projectDir, '.env.example')\n\n fse.ensureDirSync(projectDir)\n\n if (fse.existsSync(envFilePath)) fse.removeSync(envFilePath)\n if (fse.existsSync(envExampleFilePath)) fse.removeSync(envExampleFilePath)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '',\n payloadSecret: '',\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n expect(fse.existsSync(envExampleFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n expect(updatedEnvContent).toContain('DATABASE_URI=your-connection-string-here')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE')\n\n const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8')\n expect(updatedEnvExampleContent).toContain('DATABASE_URI=your-connection-string-here')\n expect(updatedEnvExampleContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE')\n })\n })\n })\n})\n"],"names":["jest","fs","fse","globby","os","path","createProject","dbReplacements","getValidTemplates","manageEnvFiles","describe","projectDir","beforeAll","console","log","fn","beforeEach","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","afterEach","existsSync","rmSync","recursive","args","_","packageManager","it","projectName","template","name","type","description","url","cliArgs","packageJsonPath","resolve","packageJson","readJsonSync","expect","toStrictEqual","example","undefined","templates","each","templateName","db","find","t","dbDetails","dbUri","dbReplacement","toBe","Object","keys","dependencies","filter","n","startsWith","toHaveLength","payloadConfigPath","absolute","cwd","content","readFileSync","not","toContain","importReplacement","configReplacement","join","envFilePath","envExampleFilePath","ensureDirSync","ensureFileSync","initialEnvContent","initialEnvExampleContent","writeFileSync","databaseType","databaseUri","payloadSecret","updatedEnvContent","updatedEnvExampleContent","removeSync"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import { jest } from '@jest/globals'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport * as os from 'node:os'\nimport path from 'path'\n\nimport type { CliArgs, DbType, ProjectExample, ProjectTemplate } from '../types.js'\n\nimport { createProject } from './create-project.js'\nimport { dbReplacements } from './replacements.js'\nimport { getValidTemplates } from './templates.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\ndescribe('createProject', () => {\n let projectDir: string\n beforeAll(() => {\n // eslint-disable-next-line no-console\n console.log = jest.fn()\n })\n\n beforeEach(() => {\n const tempDirectory = fs.realpathSync(os.tmpdir())\n projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`\n })\n\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n describe('#createProject', () => {\n const args = {\n _: ['project-name'],\n '--db': 'mongodb',\n '--local-template': 'blank',\n '--no-deps': true,\n } as CliArgs\n const packageManager = 'yarn'\n\n it('creates plugin template', async () => {\n const projectName = 'plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin',\n }\n\n await createProject({\n cliArgs: { ...args, '--local-template': 'plugin' } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n template,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n })\n\n it('updates project name in plugin template importMap file', async () => {\n const projectName = 'my-custom-plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin',\n }\n\n await createProject({\n cliArgs: { ...args, '--local-template': 'plugin' } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n template,\n })\n\n const importMapPath = path.resolve(projectDir, './dev/app/(payload)/admin/importMap.js')\n const importMapFile = fse.readFileSync(importMapPath, 'utf-8')\n\n expect(importMapFile).not.toContain('plugin-package-name-placeholder')\n expect(importMapFile).toContain('my-custom-plugin')\n })\n\n it('creates example', async () => {\n const projectName = 'custom-server-example'\n const example: ProjectExample = {\n name: 'custom-server',\n url: 'https://github.com/payloadcms/payload/examples/custom-server#main',\n }\n\n await createProject({\n cliArgs: {\n ...args,\n '--local-template': undefined,\n '--local-example': 'custom-server',\n } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n example,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n })\n\n describe('creates project from template', () => {\n const templates = getValidTemplates()\n\n it.each([\n ['blank', 'mongodb'],\n ['blank', 'postgres'],\n\n // TODO: Re-enable these once 3.0 is stable and templates updated\n // ['website', 'mongodb'],\n // ['website', 'postgres'],\n // ['ecommerce', 'mongodb'],\n // ['ecommerce', 'postgres'],\n ])('update config and deps: %s, %s', async (templateName, db) => {\n const projectName = 'starter-project'\n\n const template = templates.find((t) => t.name === templateName)\n\n const cliArgs = {\n ...args,\n '--db': db,\n '--local-template': templateName,\n } as CliArgs\n\n await createProject({\n cliArgs,\n dbDetails: {\n type: db as DbType,\n dbUri: `${db}://localhost:27017/create-project-test`,\n },\n packageManager,\n projectDir,\n projectName,\n template: template as ProjectTemplate,\n })\n\n const dbReplacement = dbReplacements[db as DbType]\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Verify git was initialized\n expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true)\n\n // Should only have one db adapter\n expect(\n Object.keys(packageJson.dependencies).filter((n) => n.startsWith('@payloadcms/db-')),\n ).toHaveLength(1)\n\n const payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: projectDir,\n })\n )?.[0]\n\n const content = fse.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check payload.config.ts\n expect(content).not.toContain('// database-adapter-import')\n expect(content).toContain(dbReplacement.importReplacement)\n\n expect(content).not.toContain('// database-adapter-config-start')\n expect(content).not.toContain('// database-adapter-config-end')\n expect(content).toContain(dbReplacement.configReplacement().join('\\n'))\n })\n })\n describe('managing env files', () => {\n it('updates .env files without overwriting existing data', async () => {\n const envFilePath = path.join(projectDir, '.env')\n const envExampleFilePath = path.join(projectDir, '.env.example')\n\n fse.ensureDirSync(projectDir)\n fse.ensureFileSync(envFilePath)\n fse.ensureFileSync(envExampleFilePath)\n\n const initialEnvContent = `CUSTOM_VAR=custom-value\\nDATABASE_URI=old-connection\\n`\n const initialEnvExampleContent = `CUSTOM_VAR=custom-value\\nDATABASE_URI=old-connection\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\n`\n\n fse.writeFileSync(envFilePath, initialEnvContent)\n fse.writeFileSync(envExampleFilePath, initialEnvExampleContent)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb',\n databaseUri: 'mongodb://localhost:27017/test',\n payloadSecret: 'test-secret',\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toContain('CUSTOM_VAR=custom-value')\n expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret')\n\n const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8')\n\n expect(updatedEnvExampleContent).toContain('CUSTOM_VAR=custom-value')\n expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret')\n })\n\n it('creates .env and .env.example if they do not exist', async () => {\n const envFilePath = path.join(projectDir, '.env')\n const envExampleFilePath = path.join(projectDir, '.env.example')\n\n fse.ensureDirSync(projectDir)\n\n if (fse.existsSync(envFilePath)) fse.removeSync(envFilePath)\n if (fse.existsSync(envExampleFilePath)) fse.removeSync(envExampleFilePath)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '',\n payloadSecret: '',\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n expect(fse.existsSync(envExampleFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n expect(updatedEnvContent).toContain('DATABASE_URI=your-connection-string-here')\n expect(updatedEnvContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE')\n\n const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8')\n expect(updatedEnvExampleContent).toContain('DATABASE_URI=your-connection-string-here')\n expect(updatedEnvExampleContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE')\n })\n })\n })\n})\n"],"names":["jest","fs","fse","globby","os","path","createProject","dbReplacements","getValidTemplates","manageEnvFiles","describe","projectDir","beforeAll","console","log","fn","beforeEach","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","afterEach","existsSync","rmSync","recursive","args","_","packageManager","it","projectName","template","name","type","description","url","cliArgs","packageJsonPath","resolve","packageJson","readJsonSync","expect","toStrictEqual","importMapPath","importMapFile","readFileSync","not","toContain","example","undefined","templates","each","templateName","db","find","t","dbDetails","dbUri","dbReplacement","toBe","Object","keys","dependencies","filter","n","startsWith","toHaveLength","payloadConfigPath","absolute","cwd","content","importReplacement","configReplacement","join","envFilePath","envExampleFilePath","ensureDirSync","ensureFileSync","initialEnvContent","initialEnvExampleContent","writeFileSync","databaseType","databaseUri","payloadSecret","updatedEnvContent","updatedEnvExampleContent","removeSync"],"mappings":"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"}
|