create-payload-app 3.41.0-canary.0 → 3.41.0-canary.1

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":"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,CAoGf;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
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
- // Call manageEnvFiles before initializing Git
107
- if (dbDetails) {
108
- await manageEnvFiles({
109
- cliArgs,
110
- databaseType: dbDetails.type,
111
- databaseUri: dbDetails.dbUri,
112
- payloadSecret: generateSecret(),
113
- projectDir,
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":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,WAAW,QAAO;AACzB,OAAOC,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAC1B,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,UAAU,OAAM;AAUvB,SAASC,oBAAoB,QAAQ,kBAAiB;AACtD,SAASC,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAEC,OAAO,QAAQ,kBAAiB;AAC7D,SAASC,sBAAsB,QAAQ,gCAA+B;AACtE,SAASC,sBAAsB,QAAQ,gCAA+B;AACtE,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,gBAAgB,QAAQ,yBAAwB;AACzD,SAASC,cAAc,QAAQ,uBAAsB;AACrD,SAASC,cAAc,QAAQ,wBAAuB;AAEtD,MAAMC,WAAWb,cAAc,YAAYc,GAAG;AAC9C,MAAMC,UAAUd,KAAKc,OAAO,CAACF;AAE7B,eAAeG,uBAAuBC,UAAkB;IACtD,MAAMC,aAAa,MAAMnB,IAAImB,UAAU,CAACD;IACxC,IAAI,CAACC,YAAY;QACf,MAAMnB,IAAIoB,KAAK,CAACF;IAClB;AACF;AAEA,eAAeG,YAAYC,IAI1B;IACC,MAAM,EAAEC,OAAO,EAAEC,cAAc,EAAEN,UAAU,EAAE,GAAGI;IAChD,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxB,OAAO;IACT;IACA,IAAIE,aAAa;IAEjB,IAAID,mBAAmB,QAAQ;QAC7BC,aAAa;IACf,OAAO,IAAID,mBAAmB,QAAQ;QACpCC,aAAa;IACf,OAAO,IAAID,mBAAmB,OAAO;QACnCC,aAAa;IACf;IAEA,IAAI;QACF,MAAM1B,MAAM2B,OAAO,CAACD,YAAY;YAC9BE,KAAKzB,KAAK0B,OAAO,CAACV;QACpB;QACA,OAAO;IACT,EAAE,OAAOW,KAAc;QACrBxB,MAAM,CAAC,6BAA6B,EAAEwB,eAAeC,QAAQ,CAAC,EAAE,EAAED,IAAIE,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;QACvF,OAAO;IACT;AACF;AAUA,OAAO,eAAeC,cACpBV,IAMqB;IAErB,MAAM,EAAEC,OAAO,EAAEU,SAAS,EAAET,cAAc,EAAEN,UAAU,EAAEgB,WAAW,EAAE,GAAGZ;IAExE,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxBnB,MAAM,CAAC,6BAA6B,EAAEN,MAAMqC,KAAK,CAACjB,aAAa;QAC/D;IACF;IAEA,MAAMD,uBAAuBC;IAE7B,IAAIK,OAAO,CAAC,kBAAkB,EAAE;QAC9B,0DAA0D;QAC1D,MAAMa,eAAelC,KAAK0B,OAAO,CAACZ,SAAS,yBAAyBO,OAAO,CAAC,kBAAkB;QAC9F,MAAMvB,IAAIqC,IAAI,CAACD,cAAclB;IAC/B;IAEA,IAAIK,OAAO,CAAC,mBAAmB,EAAE;QAC/B,2DAA2D;QAC3D,MAAMe,gBAAgBpC,KAAK0B,OAAO,CAChCZ,SACA,0BACAO,OAAO,CAAC,mBAAmB;QAE7B,MAAMvB,IAAIqC,IAAI,CAACC,eAAepB;IAChC,OAAO,IAAI,cAAcI,QAAQ,SAASA,KAAKiB,QAAQ,EAAE;QACvD,MAAM,EAAEA,QAAQ,EAAE,GAAGjB;QACrB,IAAIC,OAAO,CAAC,WAAW,EAAE;YACvBgB,SAASxB,GAAG,GAAG,GAAGwB,SAASxB,GAAG,CAACyB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAEjB,OAAO,CAAC,WAAW,EAAE;QACzE;QAEA,MAAMZ,iBAAiB;YACrBP,OAAOmB,OAAO,CAAC,UAAU;YACzBL;YACAqB;QACF;IACF,OAAO,IAAI,aAAajB,QAAQ,SAASA,KAAKmB,OAAO,EAAE;QACrD,MAAM,EAAEA,OAAO,EAAE,GAAGnB;QACpB,IAAIC,OAAO,CAAC,WAAW,EAAE;YACvBkB,QAAQ1B,GAAG,GAAG,GAAG0B,QAAQ1B,GAAG,CAACyB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAEjB,OAAO,CAAC,WAAW,EAAE;QACvE;QAEA,MAAMb,gBAAgB;YACpBN,OAAOmB,OAAO,CAAC,UAAU;YACzBkB;YACAvB;QACF;IACF;IAEA,MAAMwB,UAAU7C,EAAE6C,OAAO;IACzBA,QAAQC,KAAK,CAAC;IAEd,MAAMC,kBAAkB;QAAE1B;QAAYgB;IAAY;IAElD,IAAI,cAAcZ,MAAM;QACtB,IAAIA,KAAKiB,QAAQ,CAACM,IAAI,KAAK,UAAU;YACnCH,QAAQX,OAAO,CAAC;YAChBtB,uBAAuB;gBAAEqC,gBAAgB5B;gBAAYgB;YAAY;QACnE,OAAO;YACLQ,QAAQX,OAAO,CAAC;YAChB,MAAMvB,uBAAuB;gBAC3BuC,QAAQd,WAAWY;gBACnBG,wBAAwB;oBAAE9B;gBAAW;YACvC;QACF;IACF;IAEA,MAAML,eAAe;QACnBU;QACA0B,cAAchB,WAAWY;QACzBK,aAAajB,WAAWkB;QACxBC,eAAexC;QACfM;QACAqB,UAAU,cAAcjB,OAAOA,KAAKiB,QAAQ,GAAGc;IACjD;IAEA,gEAAgE;IAChE,MAAMC,WAAWpD,KAAK0B,OAAO,CAACV,YAAY;IAC1C,IAAIlB,IAAIuD,UAAU,CAACD,WAAW;QAC5B,MAAMtD,IAAIwD,MAAM,CAACF;IACnB;IAEA,IAAI,CAAC/B,OAAO,CAAC,YAAY,EAAE;QACzBjB,KAAK,CAAC,MAAM,EAAEkB,eAAe,GAAG,CAAC;QACjCkB,QAAQX,OAAO,CAAC;QAChB,MAAM0B,SAAS,MAAMpC,YAAY;YAAEE;YAASC;YAAgBN;QAAW;QACvE,IAAIuC,QAAQ;YACVf,QAAQgB,IAAI,CAAC;QACf,OAAO;YACLhB,QAAQgB,IAAI,CAAC,iCAAiC;QAChD;IACF,OAAO;QACLhB,QAAQgB,IAAI,CAAC;IACf;IAEA,IAAI,CAACnC,OAAO,CAAC,WAAW,EAAE;QACxBpB,qBAAqB;YAAEwB,KAAKT;QAAW;IACzC;AACF;AAEA,OAAO,eAAe0B,kBAAkBtB,IAGvC;IACC,MAAM,EAAEJ,UAAU,EAAEgB,WAAW,EAAE,GAAGZ;IACpC,MAAMqC,kBAAkBzD,KAAK0B,OAAO,CAACV,YAAY;IACjD,IAAI;QACF,MAAM0C,aAAa,MAAM5D,IAAI6D,QAAQ,CAACF;QACtCC,WAAWE,IAAI,GAAG5B;QAClB,MAAMlC,IAAI+D,SAAS,CAACJ,iBAAiBC,YAAY;YAAEI,QAAQ;QAAE;IAC/D,EAAE,OAAOnC,KAAc;QACrBtB,QAAQ,CAAC,uCAAuC,EAAEsB,eAAeC,QAAQD,IAAIE,OAAO,GAAG,IAAI;IAC7F;AACF"}
@@ -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: string;
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;AA0DnE,wDAAwD;AACxD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFhB"}
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 updateEnvExampleVariables = (contents, databaseType, payloadSecret, databaseUri)=>{
5
+ const sanitizeEnv = ({ contents, databaseType, databaseUri, payloadSecret })=>{
6
6
  const seenKeys = new Set();
7
- const updatedEnv = contents.split('\n').map((line)=>{
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 envExamplePath = path.join(projectDir, '.env.example');
54
+ const pathToEnvExample = path.join(projectDir, '.env.example');
42
55
  const envPath = path.join(projectDir, '.env');
43
- const emptyEnvContent = `# Added by Payload\nDATABASE_URI=your-connection-string-here\nPAYLOAD_SECRET=YOUR_SECRET_HERE\n`;
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
- if (!fs.existsSync(envExamplePath)) {
53
- updatedExampleContents = updateEnvExampleVariables(emptyEnvContent, databaseType, payloadSecret, databaseUri);
54
- await fs.writeFile(envExamplePath, updatedExampleContents);
55
- if (debugFlag) {
56
- debug(`.env.example file successfully created`);
57
- }
58
- } else {
59
- const envExampleContents = await fs.readFile(envExamplePath, 'utf8');
60
- const mergedEnvs = envExampleContents + '\n' + emptyEnvContent;
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 updated`);
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 = updateEnvExampleVariables(emptyEnvContent, databaseType, payloadSecret, databaseUri);
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 mergedEnvs = envContents + '\n' + emptyEnvContent;
76
- const updatedEnvContents = updateEnvExampleVariables(mergedEnvs, databaseType, payloadSecret, databaseUri);
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 updateEnvExampleVariables = (\n contents: string,\n databaseType: DbType | undefined,\n payloadSecret?: string,\n databaseUri?: string,\n): string => {\n const seenKeys = new Set<string>()\n const updatedEnv = contents\n .split('\\n')\n .map((line) => {\n if (line.startsWith('#') || !line.includes('=')) {\n return line\n }\n\n const [key] = 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 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 }\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 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 envExamplePath = path.join(projectDir, '.env.example')\n const envPath = path.join(projectDir, '.env')\n const emptyEnvContent = `# Added by Payload\\nDATABASE_URI=your-connection-string-here\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\n`\n try {\n let updatedExampleContents: string\n\n if (template?.type === 'plugin') {\n if (debugFlag) {\n debug(`plugin template detected - no .env added .env.example added`)\n }\n return\n }\n\n if (!fs.existsSync(envExamplePath)) {\n updatedExampleContents = updateEnvExampleVariables(\n emptyEnvContent,\n databaseType,\n payloadSecret,\n databaseUri,\n )\n\n await fs.writeFile(envExamplePath, updatedExampleContents)\n if (debugFlag) {\n debug(`.env.example file successfully created`)\n }\n } else {\n const envExampleContents = await fs.readFile(envExamplePath, 'utf8')\n const mergedEnvs = envExampleContents + '\\n' + emptyEnvContent\n updatedExampleContents = updateEnvExampleVariables(\n mergedEnvs,\n databaseType,\n payloadSecret,\n databaseUri,\n )\n\n await fs.writeFile(envExamplePath, updatedExampleContents)\n if (debugFlag) {\n debug(`.env.example file successfully updated`)\n }\n }\n\n if (!fs.existsSync(envPath)) {\n const envContent = updateEnvExampleVariables(\n emptyEnvContent,\n databaseType,\n payloadSecret,\n databaseUri,\n )\n await fs.writeFile(envPath, envContent)\n\n if (debugFlag) {\n debug(`.env file successfully created`)\n }\n } else {\n const envContents = await fs.readFile(envPath, 'utf8')\n const mergedEnvs = envContents + '\\n' + emptyEnvContent\n const updatedEnvContents = updateEnvExampleVariables(\n mergedEnvs,\n databaseType,\n payloadSecret,\n databaseUri,\n )\n\n await fs.writeFile(envPath, updatedEnvContents)\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","updateEnvExampleVariables","contents","databaseType","payloadSecret","databaseUri","seenKeys","Set","updatedEnv","split","map","line","startsWith","includes","key","dbChoice","placeholderUri","dbConnectionPrefix","dbConnectionSuffix","has","add","filter","Boolean","reverse","join","manageEnvFiles","args","cliArgs","projectDir","template","debugFlag","envExamplePath","envPath","emptyEnvContent","updatedExampleContents","type","existsSync","writeFile","envExampleContents","readFile","mergedEnvs","envContent","envContents","updatedEnvContents","err","Error","message","process","exit"],"mappings":"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"}
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-canary.0",
3
+ "version": "3.41.0-canary.1",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",