create-payload-app 3.41.0-internal.8617025 → 3.41.0-internal.c12584b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +8 -11
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/create-project.spec.js +0 -56
- package/dist/lib/create-project.spec.js.map +1 -1
- package/dist/lib/manage-env-files.d.ts +1 -1
- package/dist/lib/manage-env-files.d.ts.map +1 -1
- package/dist/lib/manage-env-files.js +42 -21
- package/dist/lib/manage-env-files.js.map +1 -1
- package/dist/lib/manage-env-files.spec.js +118 -0
- package/dist/lib/manage-env-files.spec.js.map +1 -0
- package/package.json +3 -2
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AAmDpB,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,
|
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;AAmDpB,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,CAiGf;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
|
@@ -103,17 +103,14 @@ export async function createProject(args) {
|
|
103
103
|
});
|
104
104
|
}
|
105
105
|
}
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
template: 'template' in args ? args.template : undefined
|
115
|
-
});
|
116
|
-
}
|
106
|
+
await manageEnvFiles({
|
107
|
+
cliArgs,
|
108
|
+
databaseType: dbDetails?.type,
|
109
|
+
databaseUri: dbDetails?.dbUri,
|
110
|
+
payloadSecret: generateSecret(),
|
111
|
+
projectDir,
|
112
|
+
template: 'template' in args ? args.template : undefined
|
113
|
+
});
|
117
114
|
// Remove yarn.lock file. This is only desired in Payload Cloud.
|
118
115
|
const lockPath = path.resolve(projectDir, 'pnpm-lock.yaml');
|
119
116
|
if (fse.existsSync(lockPath)) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n let installCmd = 'npm install --legacy-peer-deps'\n\n if (packageManager === 'yarn') {\n installCmd = 'yarn'\n } else if (packageManager === 'pnpm') {\n installCmd = 'pnpm install'\n } else if (packageManager === 'bun') {\n installCmd = 'bun install'\n }\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n await updatePackageJSON({ projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n // Call manageEnvFiles before initializing Git\n if (dbDetails) {\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails.type,\n databaseUri: dbDetails.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n }\n\n // Remove yarn.lock file. This is only desired in Payload Cloud.\n const lockPath = path.resolve(projectDir, 'pnpm-lock.yaml')\n if (fse.existsSync(lockPath)) {\n await fse.remove(lockPath)\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\nexport async function updatePackageJSON(args: {\n projectDir: string\n projectName: string\n}): Promise<void> {\n const { projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","configurePayloadConfig","configurePluginProject","downloadExample","downloadTemplate","generateSecret","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","spinner","start","updatePackageJSON","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","lockPath","existsSync","remove","result","stop","packageJsonPath","packageObj","readJson","name","writeJson","spaces"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n let installCmd = 'npm install --legacy-peer-deps'\n\n if (packageManager === 'yarn') {\n installCmd = 'yarn'\n } else if (packageManager === 'pnpm') {\n installCmd = 'pnpm install'\n } else if (packageManager === 'bun') {\n installCmd = 'bun install'\n }\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n await updatePackageJSON({ projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n // Remove yarn.lock file. This is only desired in Payload Cloud.\n const lockPath = path.resolve(projectDir, 'pnpm-lock.yaml')\n if (fse.existsSync(lockPath)) {\n await fse.remove(lockPath)\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\nexport async function updatePackageJSON(args: {\n projectDir: string\n projectName: string\n}): Promise<void> {\n const { projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","configurePayloadConfig","configurePluginProject","downloadExample","downloadTemplate","generateSecret","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","spinner","start","updatePackageJSON","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","lockPath","existsSync","remove","result","stop","packageJsonPath","packageObj","readJson","name","writeJson","spaces"],"mappings":"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"}
|
@@ -7,7 +7,6 @@ import path from 'path';
|
|
7
7
|
import { createProject } from './create-project.js';
|
8
8
|
import { dbReplacements } from './replacements.js';
|
9
9
|
import { getValidTemplates } from './templates.js';
|
10
|
-
import { manageEnvFiles } from './manage-env-files.js';
|
11
10
|
describe('createProject', ()=>{
|
12
11
|
let projectDir;
|
13
12
|
beforeAll(()=>{
|
@@ -153,61 +152,6 @@ describe('createProject', ()=>{
|
|
153
152
|
expect(content).toContain(dbReplacement.configReplacement().join('\n'));
|
154
153
|
});
|
155
154
|
});
|
156
|
-
describe('managing env files', ()=>{
|
157
|
-
it('updates .env files without overwriting existing data', async ()=>{
|
158
|
-
const envFilePath = path.join(projectDir, '.env');
|
159
|
-
const envExampleFilePath = path.join(projectDir, '.env.example');
|
160
|
-
fse.ensureDirSync(projectDir);
|
161
|
-
fse.ensureFileSync(envFilePath);
|
162
|
-
fse.ensureFileSync(envExampleFilePath);
|
163
|
-
const initialEnvContent = `CUSTOM_VAR=custom-value\nDATABASE_URI=old-connection\n`;
|
164
|
-
const initialEnvExampleContent = `CUSTOM_VAR=custom-value\nDATABASE_URI=old-connection\nPAYLOAD_SECRET=YOUR_SECRET_HERE\n`;
|
165
|
-
fse.writeFileSync(envFilePath, initialEnvContent);
|
166
|
-
fse.writeFileSync(envExampleFilePath, initialEnvExampleContent);
|
167
|
-
await manageEnvFiles({
|
168
|
-
cliArgs: {
|
169
|
-
'--debug': true
|
170
|
-
},
|
171
|
-
databaseType: 'mongodb',
|
172
|
-
databaseUri: 'mongodb://localhost:27017/test',
|
173
|
-
payloadSecret: 'test-secret',
|
174
|
-
projectDir,
|
175
|
-
template: undefined
|
176
|
-
});
|
177
|
-
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
178
|
-
expect(updatedEnvContent).toContain('CUSTOM_VAR=custom-value');
|
179
|
-
expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test');
|
180
|
-
expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret');
|
181
|
-
const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8');
|
182
|
-
expect(updatedEnvExampleContent).toContain('CUSTOM_VAR=custom-value');
|
183
|
-
expect(updatedEnvContent).toContain('DATABASE_URI=mongodb://localhost:27017/test');
|
184
|
-
expect(updatedEnvContent).toContain('PAYLOAD_SECRET=test-secret');
|
185
|
-
});
|
186
|
-
it('creates .env and .env.example if they do not exist', async ()=>{
|
187
|
-
const envFilePath = path.join(projectDir, '.env');
|
188
|
-
const envExampleFilePath = path.join(projectDir, '.env.example');
|
189
|
-
fse.ensureDirSync(projectDir);
|
190
|
-
if (fse.existsSync(envFilePath)) fse.removeSync(envFilePath);
|
191
|
-
if (fse.existsSync(envExampleFilePath)) fse.removeSync(envExampleFilePath);
|
192
|
-
await manageEnvFiles({
|
193
|
-
cliArgs: {
|
194
|
-
'--debug': true
|
195
|
-
},
|
196
|
-
databaseUri: '',
|
197
|
-
payloadSecret: '',
|
198
|
-
projectDir,
|
199
|
-
template: undefined
|
200
|
-
});
|
201
|
-
expect(fse.existsSync(envFilePath)).toBe(true);
|
202
|
-
expect(fse.existsSync(envExampleFilePath)).toBe(true);
|
203
|
-
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
204
|
-
expect(updatedEnvContent).toContain('DATABASE_URI=your-connection-string-here');
|
205
|
-
expect(updatedEnvContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE');
|
206
|
-
const updatedEnvExampleContent = fse.readFileSync(envExampleFilePath, 'utf-8');
|
207
|
-
expect(updatedEnvExampleContent).toContain('DATABASE_URI=your-connection-string-here');
|
208
|
-
expect(updatedEnvExampleContent).toContain('PAYLOAD_SECRET=YOUR_SECRET_HERE');
|
209
|
-
});
|
210
|
-
});
|
211
155
|
});
|
212
156
|
});
|
213
157
|
|
@@ -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('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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"}
|
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'\n\ndescribe('createProject', () => {\n let projectDir: string\n\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 })\n})\n"],"names":["jest","fs","fse","globby","os","path","createProject","dbReplacements","getValidTemplates","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"],"mappings":"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"}
|
@@ -3,7 +3,7 @@ import type { CliArgs, DbType, ProjectTemplate } from '../types.js';
|
|
3
3
|
export declare function manageEnvFiles(args: {
|
4
4
|
cliArgs: CliArgs;
|
5
5
|
databaseType?: DbType;
|
6
|
-
databaseUri
|
6
|
+
databaseUri?: string;
|
7
7
|
payloadSecret: string;
|
8
8
|
projectDir: string;
|
9
9
|
template?: ProjectTemplate;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"manage-env-files.d.ts","sourceRoot":"","sources":["../../src/lib/manage-env-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
1
|
+
{"version":3,"file":"manage-env-files.d.ts","sourceRoot":"","sources":["../../src/lib/manage-env-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAsFnE,wDAAwD;AACxD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EhB"}
|
@@ -2,13 +2,21 @@ import fs from 'fs-extra';
|
|
2
2
|
import path from 'path';
|
3
3
|
import { debug, error } from '../utils/log.js';
|
4
4
|
import { dbChoiceRecord } from './select-db.js';
|
5
|
-
const
|
5
|
+
const sanitizeEnv = ({ contents, databaseType, databaseUri, payloadSecret })=>{
|
6
6
|
const seenKeys = new Set();
|
7
|
-
|
7
|
+
// add defaults
|
8
|
+
let withDefaults = contents;
|
9
|
+
if (!contents.includes('DATABASE_URI') && !contents.includes('POSTGRES_URL') && !contents.includes('MONGODB_URI')) {
|
10
|
+
withDefaults += '\nDATABASE_URI=your-connection-string-here';
|
11
|
+
}
|
12
|
+
if (!contents.includes('PAYLOAD_SECRET')) {
|
13
|
+
withDefaults += '\nPAYLOAD_SECRET=YOUR_SECRET_HERE';
|
14
|
+
}
|
15
|
+
let updatedEnv = withDefaults.split('\n').map((line)=>{
|
8
16
|
if (line.startsWith('#') || !line.includes('=')) {
|
9
17
|
return line;
|
10
18
|
}
|
11
|
-
const [key] = line.split('=');
|
19
|
+
const [key, value] = line.split('=');
|
12
20
|
if (!key) {
|
13
21
|
return;
|
14
22
|
}
|
@@ -17,6 +25,8 @@ const updateEnvExampleVariables = (contents, databaseType, payloadSecret, databa
|
|
17
25
|
if (dbChoice) {
|
18
26
|
const placeholderUri = databaseUri ? databaseUri : `${dbChoice.dbConnectionPrefix}your-database-name${dbChoice.dbConnectionSuffix || ''}`;
|
19
27
|
line = databaseType === 'vercel-postgres' ? `POSTGRES_URL=${placeholderUri}` : `DATABASE_URI=${placeholderUri}`;
|
28
|
+
} else {
|
29
|
+
line = `${key}=${value}`;
|
20
30
|
}
|
21
31
|
}
|
22
32
|
if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {
|
@@ -29,6 +39,9 @@ const updateEnvExampleVariables = (contents, databaseType, payloadSecret, databa
|
|
29
39
|
seenKeys.add(key);
|
30
40
|
return line;
|
31
41
|
}).filter(Boolean).reverse().join('\n');
|
42
|
+
if (!updatedEnv.includes('# Added by Payload')) {
|
43
|
+
updatedEnv = `# Added by Payload\n${updatedEnv}`;
|
44
|
+
}
|
32
45
|
return updatedEnv;
|
33
46
|
};
|
34
47
|
/** Parse and swap .env.example values and write .env */ export async function manageEnvFiles(args) {
|
@@ -38,42 +51,50 @@ const updateEnvExampleVariables = (contents, databaseType, payloadSecret, databa
|
|
38
51
|
debug(`DRY RUN: Environment files managed`);
|
39
52
|
return;
|
40
53
|
}
|
41
|
-
const
|
54
|
+
const pathToEnvExample = path.join(projectDir, '.env.example');
|
42
55
|
const envPath = path.join(projectDir, '.env');
|
43
|
-
|
56
|
+
let exampleEnv = '';
|
44
57
|
try {
|
45
|
-
let updatedExampleContents;
|
46
58
|
if (template?.type === 'plugin') {
|
47
59
|
if (debugFlag) {
|
48
60
|
debug(`plugin template detected - no .env added .env.example added`);
|
49
61
|
}
|
50
62
|
return;
|
51
63
|
}
|
52
|
-
|
53
|
-
|
54
|
-
await fs.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
updatedExampleContents = updateEnvExampleVariables(mergedEnvs, databaseType, payloadSecret, databaseUri);
|
62
|
-
await fs.writeFile(envExamplePath, updatedExampleContents);
|
64
|
+
// If there's a .env.example file, use it to create or update the .env file
|
65
|
+
if (fs.existsSync(pathToEnvExample)) {
|
66
|
+
const envExampleContents = await fs.readFile(pathToEnvExample, 'utf8');
|
67
|
+
exampleEnv = sanitizeEnv({
|
68
|
+
contents: envExampleContents,
|
69
|
+
databaseType,
|
70
|
+
databaseUri,
|
71
|
+
payloadSecret
|
72
|
+
});
|
63
73
|
if (debugFlag) {
|
64
|
-
debug(`.env.example file successfully
|
74
|
+
debug(`.env.example file successfully read`);
|
65
75
|
}
|
66
76
|
}
|
77
|
+
// If there's no .env file, create it using the .env.example content (if it exists)
|
67
78
|
if (!fs.existsSync(envPath)) {
|
68
|
-
const envContent =
|
79
|
+
const envContent = sanitizeEnv({
|
80
|
+
contents: exampleEnv,
|
81
|
+
databaseType,
|
82
|
+
databaseUri,
|
83
|
+
payloadSecret
|
84
|
+
});
|
69
85
|
await fs.writeFile(envPath, envContent);
|
70
86
|
if (debugFlag) {
|
71
87
|
debug(`.env file successfully created`);
|
72
88
|
}
|
73
89
|
} else {
|
90
|
+
// If the .env file already exists, sanitize it as-is
|
74
91
|
const envContents = await fs.readFile(envPath, 'utf8');
|
75
|
-
const
|
76
|
-
|
92
|
+
const updatedEnvContents = sanitizeEnv({
|
93
|
+
contents: envContents,
|
94
|
+
databaseType,
|
95
|
+
databaseUri,
|
96
|
+
payloadSecret
|
97
|
+
});
|
77
98
|
await fs.writeFile(envPath, updatedEnvContents);
|
78
99
|
if (debugFlag) {
|
79
100
|
debug(`.env file successfully updated`);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/lib/manage-env-files.ts"],"sourcesContent":["import fs from 'fs-extra'\nimport path from 'path'\n\nimport type { CliArgs, DbType, ProjectTemplate } from '../types.js'\n\nimport { debug, error } from '../utils/log.js'\nimport { dbChoiceRecord } from './select-db.js'\n\nconst
|
1
|
+
{"version":3,"sources":["../../src/lib/manage-env-files.ts"],"sourcesContent":["import fs from 'fs-extra'\nimport path from 'path'\n\nimport type { CliArgs, DbType, ProjectTemplate } from '../types.js'\n\nimport { debug, error } from '../utils/log.js'\nimport { dbChoiceRecord } from './select-db.js'\n\nconst sanitizeEnv = ({\n contents,\n databaseType,\n databaseUri,\n payloadSecret,\n}: {\n contents: string\n databaseType: DbType | undefined\n databaseUri?: string\n payloadSecret?: string\n}): string => {\n const seenKeys = new Set<string>()\n\n // add defaults\n let withDefaults = contents\n\n if (\n !contents.includes('DATABASE_URI') &&\n !contents.includes('POSTGRES_URL') &&\n !contents.includes('MONGODB_URI')\n ) {\n withDefaults += '\\nDATABASE_URI=your-connection-string-here'\n }\n\n if (!contents.includes('PAYLOAD_SECRET')) {\n withDefaults += '\\nPAYLOAD_SECRET=YOUR_SECRET_HERE'\n }\n\n let updatedEnv = withDefaults\n .split('\\n')\n .map((line) => {\n if (line.startsWith('#') || !line.includes('=')) {\n return line\n }\n\n const [key, value] = line.split('=')\n\n if (!key) {\n return\n }\n\n if (key === 'DATABASE_URI' || key === 'POSTGRES_URL' || key === 'MONGODB_URI') {\n const dbChoice = databaseType ? dbChoiceRecord[databaseType] : null\n\n if (dbChoice) {\n const placeholderUri = databaseUri\n ? databaseUri\n : `${dbChoice.dbConnectionPrefix}your-database-name${dbChoice.dbConnectionSuffix || ''}`\n line =\n databaseType === 'vercel-postgres'\n ? `POSTGRES_URL=${placeholderUri}`\n : `DATABASE_URI=${placeholderUri}`\n } else {\n line = `${key}=${value}`\n }\n }\n\n if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {\n line = `PAYLOAD_SECRET=${payloadSecret || 'YOUR_SECRET_HERE'}`\n }\n\n // handles dupes\n if (seenKeys.has(key)) {\n return null\n }\n\n seenKeys.add(key)\n\n return line\n })\n .filter(Boolean)\n .reverse()\n .join('\\n')\n\n if (!updatedEnv.includes('# Added by Payload')) {\n updatedEnv = `# Added by Payload\\n${updatedEnv}`\n }\n\n return updatedEnv\n}\n\n/** Parse and swap .env.example values and write .env */\nexport async function manageEnvFiles(args: {\n cliArgs: CliArgs\n databaseType?: DbType\n databaseUri?: string\n payloadSecret: string\n projectDir: string\n template?: ProjectTemplate\n}): Promise<void> {\n const { cliArgs, databaseType, databaseUri, payloadSecret, projectDir, template } = args\n\n const debugFlag = cliArgs['--debug']\n\n if (cliArgs['--dry-run']) {\n debug(`DRY RUN: Environment files managed`)\n return\n }\n\n const pathToEnvExample = path.join(projectDir, '.env.example')\n const envPath = path.join(projectDir, '.env')\n\n let exampleEnv: null | string = ''\n\n try {\n if (template?.type === 'plugin') {\n if (debugFlag) {\n debug(`plugin template detected - no .env added .env.example added`)\n }\n\n return\n }\n\n // If there's a .env.example file, use it to create or update the .env file\n if (fs.existsSync(pathToEnvExample)) {\n const envExampleContents = await fs.readFile(pathToEnvExample, 'utf8')\n\n exampleEnv = sanitizeEnv({\n contents: envExampleContents,\n databaseType,\n databaseUri,\n payloadSecret,\n })\n\n if (debugFlag) {\n debug(`.env.example file successfully read`)\n }\n }\n\n // If there's no .env file, create it using the .env.example content (if it exists)\n if (!fs.existsSync(envPath)) {\n const envContent = sanitizeEnv({\n contents: exampleEnv,\n databaseType,\n databaseUri,\n payloadSecret,\n })\n\n await fs.writeFile(envPath, envContent)\n\n if (debugFlag) {\n debug(`.env file successfully created`)\n }\n } else {\n // If the .env file already exists, sanitize it as-is\n const envContents = await fs.readFile(envPath, 'utf8')\n\n const updatedEnvContents = sanitizeEnv({\n contents: envContents,\n databaseType,\n databaseUri,\n payloadSecret,\n })\n\n await fs.writeFile(envPath, updatedEnvContents)\n\n if (debugFlag) {\n debug(`.env file successfully updated`)\n }\n }\n } catch (err: unknown) {\n error('Unable to manage environment files')\n if (err instanceof Error) {\n error(err.message)\n }\n process.exit(1)\n }\n}\n"],"names":["fs","path","debug","error","dbChoiceRecord","sanitizeEnv","contents","databaseType","databaseUri","payloadSecret","seenKeys","Set","withDefaults","includes","updatedEnv","split","map","line","startsWith","key","value","dbChoice","placeholderUri","dbConnectionPrefix","dbConnectionSuffix","has","add","filter","Boolean","reverse","join","manageEnvFiles","args","cliArgs","projectDir","template","debugFlag","pathToEnvExample","envPath","exampleEnv","type","existsSync","envExampleContents","readFile","envContent","writeFile","envContents","updatedEnvContents","err","Error","message","process","exit"],"mappings":"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"}
|
@@ -0,0 +1,118 @@
|
|
1
|
+
import { jest } from '@jest/globals';
|
2
|
+
import fs from 'fs';
|
3
|
+
import fse from 'fs-extra';
|
4
|
+
import * as os from 'node:os';
|
5
|
+
import path from 'path';
|
6
|
+
import { manageEnvFiles } from './manage-env-files.js';
|
7
|
+
describe('createProject', ()=>{
|
8
|
+
let projectDir;
|
9
|
+
let envFilePath = '';
|
10
|
+
let envExampleFilePath = '';
|
11
|
+
beforeAll(()=>{
|
12
|
+
// eslint-disable-next-line no-console
|
13
|
+
console.log = jest.fn();
|
14
|
+
});
|
15
|
+
beforeEach(()=>{
|
16
|
+
const tempDirectory = fs.realpathSync(os.tmpdir());
|
17
|
+
projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`;
|
18
|
+
envFilePath = path.join(projectDir, '.env');
|
19
|
+
envExampleFilePath = path.join(projectDir, '.env.example');
|
20
|
+
if (fse.existsSync(envFilePath)) {
|
21
|
+
fse.removeSync(envFilePath);
|
22
|
+
}
|
23
|
+
fse.ensureDirSync(projectDir);
|
24
|
+
});
|
25
|
+
afterEach(()=>{
|
26
|
+
if (fse.existsSync(projectDir)) {
|
27
|
+
fse.rmSync(projectDir, {
|
28
|
+
recursive: true
|
29
|
+
});
|
30
|
+
}
|
31
|
+
});
|
32
|
+
it('generates .env using defaults (not from .env.example)', async ()=>{
|
33
|
+
// ensure no .env.example exists so that the default values are used
|
34
|
+
// the `manageEnvFiles` function will look for .env.example in the file system
|
35
|
+
if (fse.existsSync(envExampleFilePath)) {
|
36
|
+
fse.removeSync(envExampleFilePath);
|
37
|
+
}
|
38
|
+
await manageEnvFiles({
|
39
|
+
cliArgs: {
|
40
|
+
'--debug': true
|
41
|
+
},
|
42
|
+
databaseUri: '',
|
43
|
+
payloadSecret: '',
|
44
|
+
projectDir,
|
45
|
+
template: undefined
|
46
|
+
});
|
47
|
+
expect(fse.existsSync(envFilePath)).toBe(true);
|
48
|
+
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
49
|
+
expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=YOUR_SECRET_HERE\nDATABASE_URI=your-connection-string-here`);
|
50
|
+
});
|
51
|
+
it('generates .env from .env.example', async ()=>{
|
52
|
+
// create or override the .env.example file with a connection string that will NOT be overridden
|
53
|
+
fse.ensureFileSync(envExampleFilePath);
|
54
|
+
fse.writeFileSync(envExampleFilePath, `DATABASE_URI=example-connection-string\nCUSTOM_VAR=custom-value\n`);
|
55
|
+
await manageEnvFiles({
|
56
|
+
cliArgs: {
|
57
|
+
'--debug': true
|
58
|
+
},
|
59
|
+
databaseUri: '',
|
60
|
+
payloadSecret: '',
|
61
|
+
projectDir,
|
62
|
+
template: undefined
|
63
|
+
});
|
64
|
+
expect(fse.existsSync(envFilePath)).toBe(true);
|
65
|
+
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
66
|
+
expect(updatedEnvContent).toBe(`DATABASE_URI=example-connection-string\nCUSTOM_VAR=custom-value\nPAYLOAD_SECRET=YOUR_SECRET_HERE\n# Added by Payload`);
|
67
|
+
});
|
68
|
+
it('updates existing .env without overriding vars', async ()=>{
|
69
|
+
// create an existing .env file with some custom variables that should NOT be overridden
|
70
|
+
fse.ensureFileSync(envFilePath);
|
71
|
+
fse.writeFileSync(envFilePath, `CUSTOM_VAR=custom-value\nDATABASE_URI=example-connection-string\n`);
|
72
|
+
// create an .env.example file to ensure that its contents DO NOT override existing .env vars
|
73
|
+
fse.ensureFileSync(envExampleFilePath);
|
74
|
+
fse.writeFileSync(envExampleFilePath, `CUSTOM_VAR=custom-value-2\nDATABASE_URI=example-connection-string-2\n`);
|
75
|
+
await manageEnvFiles({
|
76
|
+
cliArgs: {
|
77
|
+
'--debug': true
|
78
|
+
},
|
79
|
+
databaseUri: '',
|
80
|
+
payloadSecret: '',
|
81
|
+
projectDir,
|
82
|
+
template: undefined
|
83
|
+
});
|
84
|
+
expect(fse.existsSync(envFilePath)).toBe(true);
|
85
|
+
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
86
|
+
expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=YOUR_SECRET_HERE\nDATABASE_URI=example-connection-string\nCUSTOM_VAR=custom-value`);
|
87
|
+
});
|
88
|
+
it('sanitizes .env based on selected database type', async ()=>{
|
89
|
+
await manageEnvFiles({
|
90
|
+
cliArgs: {
|
91
|
+
'--debug': true
|
92
|
+
},
|
93
|
+
databaseType: 'mongodb',
|
94
|
+
databaseUri: 'mongodb://localhost:27017/test',
|
95
|
+
payloadSecret: 'test-secret',
|
96
|
+
projectDir,
|
97
|
+
template: undefined
|
98
|
+
});
|
99
|
+
const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
|
100
|
+
expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=test-secret\nDATABASE_URI=mongodb://localhost:27017/test`);
|
101
|
+
// delete the generated .env file and do it again, but this time, omit the databaseUri to ensure the default is generated
|
102
|
+
fse.removeSync(envFilePath);
|
103
|
+
await manageEnvFiles({
|
104
|
+
cliArgs: {
|
105
|
+
'--debug': true
|
106
|
+
},
|
107
|
+
databaseType: 'mongodb',
|
108
|
+
databaseUri: '',
|
109
|
+
payloadSecret: 'test-secret',
|
110
|
+
projectDir,
|
111
|
+
template: undefined
|
112
|
+
});
|
113
|
+
const updatedEnvContentWithDefault = fse.readFileSync(envFilePath, 'utf-8');
|
114
|
+
expect(updatedEnvContentWithDefault).toBe(`# Added by Payload\nPAYLOAD_SECRET=test-secret\nDATABASE_URI=mongodb://127.0.0.1/your-database-name`);
|
115
|
+
});
|
116
|
+
});
|
117
|
+
|
118
|
+
//# sourceMappingURL=manage-env-files.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/lib/manage-env-files.spec.ts"],"sourcesContent":["import { jest } from '@jest/globals'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport * as os from 'node:os'\nimport path from 'path'\n\nimport type { CliArgs } from '../types.js'\n\nimport { manageEnvFiles } from './manage-env-files.js'\n\ndescribe('createProject', () => {\n let projectDir: string\n let envFilePath = ''\n let envExampleFilePath = ''\n\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 envFilePath = path.join(projectDir, '.env')\n envExampleFilePath = path.join(projectDir, '.env.example')\n\n if (fse.existsSync(envFilePath)) {\n fse.removeSync(envFilePath)\n }\n\n fse.ensureDirSync(projectDir)\n })\n\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n it('generates .env using defaults (not from .env.example)', async () => {\n // ensure no .env.example exists so that the default values are used\n // the `manageEnvFiles` function will look for .env.example in the file system\n if (fse.existsSync(envExampleFilePath)) {\n fse.removeSync(envExampleFilePath)\n }\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the default vars are used\n payloadSecret: '', // omitting this will ensure the default vars are used\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\nDATABASE_URI=your-connection-string-here`,\n )\n })\n\n it('generates .env from .env.example', async () => {\n // create or override the .env.example file with a connection string that will NOT be overridden\n fse.ensureFileSync(envExampleFilePath)\n fse.writeFileSync(\n envExampleFilePath,\n `DATABASE_URI=example-connection-string\\nCUSTOM_VAR=custom-value\\n`,\n )\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the `.env.example` vars are used\n payloadSecret: '', // omitting this will ensure the `.env.example` vars are used\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `DATABASE_URI=example-connection-string\\nCUSTOM_VAR=custom-value\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\n# Added by Payload`,\n )\n })\n\n it('updates existing .env without overriding vars', async () => {\n // create an existing .env file with some custom variables that should NOT be overridden\n fse.ensureFileSync(envFilePath)\n fse.writeFileSync(\n envFilePath,\n `CUSTOM_VAR=custom-value\\nDATABASE_URI=example-connection-string\\n`,\n )\n\n // create an .env.example file to ensure that its contents DO NOT override existing .env vars\n fse.ensureFileSync(envExampleFilePath)\n fse.writeFileSync(\n envExampleFilePath,\n `CUSTOM_VAR=custom-value-2\\nDATABASE_URI=example-connection-string-2\\n`,\n )\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the `.env` vars are kept\n payloadSecret: '', // omitting this will ensure the `.env` vars are kept\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\nDATABASE_URI=example-connection-string\\nCUSTOM_VAR=custom-value`,\n )\n })\n\n it('sanitizes .env based on selected database type', async () => {\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb', // this mimics the CLI selection and will be used as the DATABASE_URI\n databaseUri: 'mongodb://localhost:27017/test', // this mimics the CLI selection and will be used as the DATABASE_URI\n payloadSecret: 'test-secret', // this mimics the CLI selection and will be used as the PAYLOAD_SECRET\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=test-secret\\nDATABASE_URI=mongodb://localhost:27017/test`,\n )\n\n // delete the generated .env file and do it again, but this time, omit the databaseUri to ensure the default is generated\n fse.removeSync(envFilePath)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb', // this mimics the CLI selection and will be used as the DATABASE_URI\n databaseUri: '', // omit this to ensure the default is generated based on the selected database type\n payloadSecret: 'test-secret',\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContentWithDefault = fse.readFileSync(envFilePath, 'utf-8')\n expect(updatedEnvContentWithDefault).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=test-secret\\nDATABASE_URI=mongodb://127.0.0.1/your-database-name`,\n )\n })\n})\n"],"names":["jest","fs","fse","os","path","manageEnvFiles","describe","projectDir","envFilePath","envExampleFilePath","beforeAll","console","log","fn","beforeEach","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","join","existsSync","removeSync","ensureDirSync","afterEach","rmSync","recursive","it","cliArgs","databaseUri","payloadSecret","template","undefined","expect","toBe","updatedEnvContent","readFileSync","ensureFileSync","writeFileSync","databaseType","updatedEnvContentWithDefault"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "create-payload-app",
|
3
|
-
"version": "3.41.0-internal.
|
3
|
+
"version": "3.41.0-internal.c12584b",
|
4
4
|
"homepage": "https://payloadcms.com",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -16,6 +16,7 @@
|
|
16
16
|
"url": "https://payloadcms.com"
|
17
17
|
}
|
18
18
|
],
|
19
|
+
"sideEffects": false,
|
19
20
|
"type": "module",
|
20
21
|
"exports": {
|
21
22
|
"./types": {
|
@@ -49,7 +50,7 @@
|
|
49
50
|
"dependencies": {
|
50
51
|
"@clack/prompts": "^0.7.0",
|
51
52
|
"@sindresorhus/slugify": "^1.1.0",
|
52
|
-
"@swc/core": "1.
|
53
|
+
"@swc/core": "1.11.29",
|
53
54
|
"arg": "^5.0.0",
|
54
55
|
"chalk": "^4.1.0",
|
55
56
|
"comment-json": "^4.2.3",
|