create-payload-app 3.44.0-canary.9 → 3.44.0
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 +22 -0
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +53 -2
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/create-project.spec.js +29 -1
- package/dist/lib/create-project.spec.js.map +1 -1
- package/dist/lib/download-template.js +1 -1
- package/dist/lib/download-template.js.map +1 -1
- package/dist/template/src/payload-types.ts +158 -0
- package/package.json +1 -1
@@ -11,9 +11,31 @@ export declare function createProject(args: {
|
|
11
11
|
projectDir: string;
|
12
12
|
projectName: string;
|
13
13
|
} & TemplateOrExample): Promise<void>;
|
14
|
+
/**
|
15
|
+
* Reads the package.json file into an object and then does the following:
|
16
|
+
* - Sets the `name` property to the provided `projectName`.
|
17
|
+
* - Bumps the payload packages from workspace:* to the latest version.
|
18
|
+
* - Writes the updated object back to the package.json file.
|
19
|
+
*/
|
14
20
|
export declare function updatePackageJSON(args: {
|
21
|
+
/**
|
22
|
+
* The latest version of Payload to use in the package.json.
|
23
|
+
*/
|
24
|
+
latestVersion: string;
|
15
25
|
projectDir: string;
|
26
|
+
/**
|
27
|
+
* The name of the project to set in package.json.
|
28
|
+
*/
|
16
29
|
projectName: string;
|
17
30
|
}): Promise<void>;
|
31
|
+
/**
|
32
|
+
* Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.
|
33
|
+
*
|
34
|
+
* Does not return and instead modifies the `packageJson` object in place.
|
35
|
+
*/
|
36
|
+
export declare function updatePackageJSONDependencies(args: {
|
37
|
+
latestVersion: string;
|
38
|
+
packageJson: Record<string, unknown>;
|
39
|
+
}): void;
|
18
40
|
export {};
|
19
41
|
//# sourceMappingURL=create-project.d.ts.map
|
@@ -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,CAqGf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
|
@@ -82,7 +82,12 @@ export async function createProject(args) {
|
|
82
82
|
}
|
83
83
|
const spinner = p.spinner();
|
84
84
|
spinner.start('Checking latest Payload version...');
|
85
|
+
const payloadVersion = await getLatestPackageVersion({
|
86
|
+
packageName: 'payload'
|
87
|
+
});
|
88
|
+
spinner.stop(`Found latest version of Payload ${payloadVersion}`);
|
85
89
|
await updatePackageJSON({
|
90
|
+
latestVersion: payloadVersion,
|
86
91
|
projectDir,
|
87
92
|
projectName
|
88
93
|
});
|
@@ -138,12 +143,21 @@ export async function createProject(args) {
|
|
138
143
|
});
|
139
144
|
}
|
140
145
|
}
|
141
|
-
|
142
|
-
|
146
|
+
/**
|
147
|
+
* Reads the package.json file into an object and then does the following:
|
148
|
+
* - Sets the `name` property to the provided `projectName`.
|
149
|
+
* - Bumps the payload packages from workspace:* to the latest version.
|
150
|
+
* - Writes the updated object back to the package.json file.
|
151
|
+
*/ export async function updatePackageJSON(args) {
|
152
|
+
const { latestVersion, projectDir, projectName } = args;
|
143
153
|
const packageJsonPath = path.resolve(projectDir, 'package.json');
|
144
154
|
try {
|
145
155
|
const packageObj = await fse.readJson(packageJsonPath);
|
146
156
|
packageObj.name = projectName;
|
157
|
+
updatePackageJSONDependencies({
|
158
|
+
latestVersion,
|
159
|
+
packageJson: packageObj
|
160
|
+
});
|
147
161
|
await fse.writeJson(packageJsonPath, packageObj, {
|
148
162
|
spaces: 2
|
149
163
|
});
|
@@ -151,5 +165,42 @@ export async function updatePackageJSON(args) {
|
|
151
165
|
warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`);
|
152
166
|
}
|
153
167
|
}
|
168
|
+
/**
|
169
|
+
* Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.
|
170
|
+
*
|
171
|
+
* Does not return and instead modifies the `packageJson` object in place.
|
172
|
+
*/ export function updatePackageJSONDependencies(args) {
|
173
|
+
const { latestVersion, packageJson } = args;
|
174
|
+
const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce((acc, [key, value])=>{
|
175
|
+
if (typeof value === 'string' && value.startsWith('workspace:')) {
|
176
|
+
acc[key] = `${latestVersion}`;
|
177
|
+
} else if (key === 'payload' || key.startsWith('@payloadcms')) {
|
178
|
+
acc[key] = `${latestVersion}`;
|
179
|
+
} else {
|
180
|
+
acc[key] = value;
|
181
|
+
}
|
182
|
+
return acc;
|
183
|
+
}, {});
|
184
|
+
packageJson.dependencies = updatedDependencies;
|
185
|
+
}
|
186
|
+
/**
|
187
|
+
* Fetches the latest version of a package from the NPM registry.
|
188
|
+
*
|
189
|
+
* Used in determining the latest version of Payload to use in the generated templates.
|
190
|
+
*/ async function getLatestPackageVersion({ packageName = 'payload' }) {
|
191
|
+
try {
|
192
|
+
const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`);
|
193
|
+
const data = await response.json();
|
194
|
+
// Monster chaining for type safety just checking for data.latest
|
195
|
+
const latestVersion = data && typeof data === 'object' && 'latest' in data && data.latest && typeof data.latest === 'string' ? data.latest : null;
|
196
|
+
if (!latestVersion) {
|
197
|
+
throw new Error(`No latest version found for package: ${packageName}`);
|
198
|
+
}
|
199
|
+
return latestVersion;
|
200
|
+
} catch (error) {
|
201
|
+
console.error('Error fetching Payload version:', error);
|
202
|
+
throw error;
|
203
|
+
}
|
204
|
+
}
|
154
205
|
|
155
206
|
//# sourceMappingURL=create-project.js.map
|
@@ -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 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"}
|
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 const payloadVersion = await getLatestPackageVersion({ packageName: 'payload' })\n\n spinner.stop(`Found latest version of Payload ${payloadVersion}`)\n\n await updatePackageJSON({ latestVersion: payloadVersion, 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\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, 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\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\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\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n\n/**\n * Fetches the latest version of a package from the NPM registry.\n *\n * Used in determining the latest version of Payload to use in the generated templates.\n */\nasync function getLatestPackageVersion({\n packageName = 'payload',\n}: {\n /**\n * Package name to fetch the latest version for based on the NPM registry URL\n *\n * Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`\n *\n * @default 'payload'\n */\n packageName?: string\n}): Promise<string> {\n try {\n const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`)\n const data = await response.json()\n\n // Monster chaining for type safety just checking for data.latest\n const latestVersion =\n data &&\n typeof data === 'object' &&\n 'latest' in data &&\n data.latest &&\n typeof data.latest === 'string'\n ? data.latest\n : null\n\n if (!latestVersion) {\n throw new Error(`No latest version found for package: ${packageName}`)\n }\n\n return latestVersion\n } catch (error) {\n console.error('Error fetching Payload version:', error)\n throw error\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","payloadVersion","getLatestPackageVersion","packageName","stop","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","lockPath","existsSync","remove","result","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith","response","fetch","data","json","latest","console"],"mappings":"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"}
|
@@ -4,7 +4,7 @@ import fse from 'fs-extra';
|
|
4
4
|
import globby from 'globby';
|
5
5
|
import * as os from 'node:os';
|
6
6
|
import path from 'path';
|
7
|
-
import { createProject } from './create-project.js';
|
7
|
+
import { createProject, updatePackageJSONDependencies } from './create-project.js';
|
8
8
|
import { dbReplacements } from './replacements.js';
|
9
9
|
import { getValidTemplates } from './templates.js';
|
10
10
|
describe('createProject', ()=>{
|
@@ -152,6 +152,34 @@ describe('createProject', ()=>{
|
|
152
152
|
expect(content).toContain(dbReplacement.configReplacement().join('\n'));
|
153
153
|
});
|
154
154
|
});
|
155
|
+
describe('updates package.json', ()=>{
|
156
|
+
it('updates package name and bumps workspace versions', async ()=>{
|
157
|
+
const latestVersion = '3.0.0';
|
158
|
+
const initialJSON = {
|
159
|
+
name: 'test-project',
|
160
|
+
version: '1.0.0',
|
161
|
+
dependencies: {
|
162
|
+
'@payloadcms/db-mongodb': 'workspace:*',
|
163
|
+
payload: 'workspace:*',
|
164
|
+
'@payloadcms/ui': 'workspace:*'
|
165
|
+
}
|
166
|
+
};
|
167
|
+
const correctlyModifiedJSON = {
|
168
|
+
name: 'test-project',
|
169
|
+
version: '1.0.0',
|
170
|
+
dependencies: {
|
171
|
+
'@payloadcms/db-mongodb': `${latestVersion}`,
|
172
|
+
payload: `${latestVersion}`,
|
173
|
+
'@payloadcms/ui': `${latestVersion}`
|
174
|
+
}
|
175
|
+
};
|
176
|
+
updatePackageJSONDependencies({
|
177
|
+
latestVersion,
|
178
|
+
packageJson: initialJSON
|
179
|
+
});
|
180
|
+
expect(initialJSON).toEqual(correctlyModifiedJSON);
|
181
|
+
});
|
182
|
+
});
|
155
183
|
});
|
156
184
|
});
|
157
185
|
|
@@ -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'\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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"}
|
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, updatePackageJSONDependencies } 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 describe('updates package.json', () => {\n it('updates package name and bumps workspace versions', async () => {\n const latestVersion = '3.0.0'\n const initialJSON = {\n name: 'test-project',\n version: '1.0.0',\n dependencies: {\n '@payloadcms/db-mongodb': 'workspace:*',\n payload: 'workspace:*',\n '@payloadcms/ui': 'workspace:*',\n },\n }\n\n const correctlyModifiedJSON = {\n name: 'test-project',\n version: '1.0.0',\n dependencies: {\n '@payloadcms/db-mongodb': `${latestVersion}`,\n payload: `${latestVersion}`,\n '@payloadcms/ui': `${latestVersion}`,\n },\n }\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: initialJSON,\n })\n\n expect(initialJSON).toEqual(correctlyModifiedJSON)\n })\n })\n })\n})\n"],"names":["jest","fs","fse","globby","os","path","createProject","updatePackageJSONDependencies","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","latestVersion","initialJSON","version","payload","correctlyModifiedJSON","toEqual"],"mappings":"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"}
|
@@ -5,7 +5,7 @@ import { debug as debugLog } from '../utils/log.js';
|
|
5
5
|
export async function downloadTemplate({ debug, projectDir, template }) {
|
6
6
|
const branchOrTag = template.url.split('#')?.[1] || 'latest';
|
7
7
|
const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branchOrTag}`;
|
8
|
-
const filter = `payload-${branchOrTag.replace(/^v/, '')}/templates/${template.name}/`;
|
8
|
+
const filter = `payload-${branchOrTag.replace(/^v/, '').replaceAll('/', '-')}/templates/${template.name}/`;
|
9
9
|
if (debug) {
|
10
10
|
debugLog(`Using template url: ${template.url}`);
|
11
11
|
debugLog(`Codeload url: ${url}`);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/lib/download-template.ts"],"sourcesContent":["import { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { x } from 'tar'\n\nimport type { ProjectTemplate } from '../types.js'\n\nimport { debug as debugLog } from '../utils/log.js'\n\nexport async function downloadTemplate({\n debug,\n projectDir,\n template,\n}: {\n debug?: boolean\n projectDir: string\n template: ProjectTemplate\n}) {\n const branchOrTag = template.url.split('#')?.[1] || 'latest'\n const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branchOrTag}`\n const filter = `payload-${branchOrTag.replace(/^v/, '')}/templates/${template.name}/`\n\n if (debug) {\n debugLog(`Using template url: ${template.url}`)\n debugLog(`Codeload url: ${url}`)\n debugLog(`Filter: ${filter}`)\n }\n\n await pipeline(\n await downloadTarStream(url),\n x({\n cwd: projectDir,\n filter: (p) => p.includes(filter),\n strip: 2 + template.name.split('/').length,\n }),\n )\n}\n\nasync function downloadTarStream(url: string) {\n const res = await fetch(url)\n\n if (!res.body) {\n throw new Error(`Failed to download: ${url}`)\n }\n\n return Readable.from(res.body as unknown as NodeJS.ReadableStream)\n}\n"],"names":["Readable","pipeline","x","debug","debugLog","downloadTemplate","projectDir","template","branchOrTag","url","split","filter","replace","name","downloadTarStream","cwd","p","includes","strip","length","res","fetch","body","Error","from"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,SAASC,CAAC,QAAQ,MAAK;AAIvB,SAASC,SAASC,QAAQ,QAAQ,kBAAiB;AAEnD,OAAO,eAAeC,iBAAiB,EACrCF,KAAK,EACLG,UAAU,EACVC,QAAQ,EAKT;IACC,MAAMC,cAAcD,SAASE,GAAG,CAACC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI;IACpD,MAAMD,MAAM,CAAC,sDAAsD,EAAED,aAAa;IAClF,MAAMG,SAAS,CAAC,QAAQ,EAAEH,YAAYI,OAAO,CAAC,MAAM,
|
1
|
+
{"version":3,"sources":["../../src/lib/download-template.ts"],"sourcesContent":["import { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { x } from 'tar'\n\nimport type { ProjectTemplate } from '../types.js'\n\nimport { debug as debugLog } from '../utils/log.js'\n\nexport async function downloadTemplate({\n debug,\n projectDir,\n template,\n}: {\n debug?: boolean\n projectDir: string\n template: ProjectTemplate\n}) {\n const branchOrTag = template.url.split('#')?.[1] || 'latest'\n const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branchOrTag}`\n const filter = `payload-${branchOrTag.replace(/^v/, '').replaceAll('/', '-')}/templates/${template.name}/`\n\n if (debug) {\n debugLog(`Using template url: ${template.url}`)\n debugLog(`Codeload url: ${url}`)\n debugLog(`Filter: ${filter}`)\n }\n\n await pipeline(\n await downloadTarStream(url),\n x({\n cwd: projectDir,\n filter: (p) => p.includes(filter),\n strip: 2 + template.name.split('/').length,\n }),\n )\n}\n\nasync function downloadTarStream(url: string) {\n const res = await fetch(url)\n\n if (!res.body) {\n throw new Error(`Failed to download: ${url}`)\n }\n\n return Readable.from(res.body as unknown as NodeJS.ReadableStream)\n}\n"],"names":["Readable","pipeline","x","debug","debugLog","downloadTemplate","projectDir","template","branchOrTag","url","split","filter","replace","replaceAll","name","downloadTarStream","cwd","p","includes","strip","length","res","fetch","body","Error","from"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,SAASC,CAAC,QAAQ,MAAK;AAIvB,SAASC,SAASC,QAAQ,QAAQ,kBAAiB;AAEnD,OAAO,eAAeC,iBAAiB,EACrCF,KAAK,EACLG,UAAU,EACVC,QAAQ,EAKT;IACC,MAAMC,cAAcD,SAASE,GAAG,CAACC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI;IACpD,MAAMD,MAAM,CAAC,sDAAsD,EAAED,aAAa;IAClF,MAAMG,SAAS,CAAC,QAAQ,EAAEH,YAAYI,OAAO,CAAC,MAAM,IAAIC,UAAU,CAAC,KAAK,KAAK,WAAW,EAAEN,SAASO,IAAI,CAAC,CAAC,CAAC;IAE1G,IAAIX,OAAO;QACTC,SAAS,CAAC,oBAAoB,EAAEG,SAASE,GAAG,EAAE;QAC9CL,SAAS,CAAC,cAAc,EAAEK,KAAK;QAC/BL,SAAS,CAAC,QAAQ,EAAEO,QAAQ;IAC9B;IAEA,MAAMV,SACJ,MAAMc,kBAAkBN,MACxBP,EAAE;QACAc,KAAKV;QACLK,QAAQ,CAACM,IAAMA,EAAEC,QAAQ,CAACP;QAC1BQ,OAAO,IAAIZ,SAASO,IAAI,CAACJ,KAAK,CAAC,KAAKU,MAAM;IAC5C;AAEJ;AAEA,eAAeL,kBAAkBN,GAAW;IAC1C,MAAMY,MAAM,MAAMC,MAAMb;IAExB,IAAI,CAACY,IAAIE,IAAI,EAAE;QACb,MAAM,IAAIC,MAAM,CAAC,oBAAoB,EAAEf,KAAK;IAC9C;IAEA,OAAOT,SAASyB,IAAI,CAACJ,IAAIE,IAAI;AAC/B"}
|
@@ -6,24 +6,94 @@
|
|
6
6
|
* and re-run `payload generate:types` to regenerate this file.
|
7
7
|
*/
|
8
8
|
|
9
|
+
/**
|
10
|
+
* Supported timezones in IANA format.
|
11
|
+
*
|
12
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
13
|
+
* via the `definition` "supportedTimezones".
|
14
|
+
*/
|
15
|
+
export type SupportedTimezones =
|
16
|
+
| 'Pacific/Midway'
|
17
|
+
| 'Pacific/Niue'
|
18
|
+
| 'Pacific/Honolulu'
|
19
|
+
| 'Pacific/Rarotonga'
|
20
|
+
| 'America/Anchorage'
|
21
|
+
| 'Pacific/Gambier'
|
22
|
+
| 'America/Los_Angeles'
|
23
|
+
| 'America/Tijuana'
|
24
|
+
| 'America/Denver'
|
25
|
+
| 'America/Phoenix'
|
26
|
+
| 'America/Chicago'
|
27
|
+
| 'America/Guatemala'
|
28
|
+
| 'America/New_York'
|
29
|
+
| 'America/Bogota'
|
30
|
+
| 'America/Caracas'
|
31
|
+
| 'America/Santiago'
|
32
|
+
| 'America/Buenos_Aires'
|
33
|
+
| 'America/Sao_Paulo'
|
34
|
+
| 'Atlantic/South_Georgia'
|
35
|
+
| 'Atlantic/Azores'
|
36
|
+
| 'Atlantic/Cape_Verde'
|
37
|
+
| 'Europe/London'
|
38
|
+
| 'Europe/Berlin'
|
39
|
+
| 'Africa/Lagos'
|
40
|
+
| 'Europe/Athens'
|
41
|
+
| 'Africa/Cairo'
|
42
|
+
| 'Europe/Moscow'
|
43
|
+
| 'Asia/Riyadh'
|
44
|
+
| 'Asia/Dubai'
|
45
|
+
| 'Asia/Baku'
|
46
|
+
| 'Asia/Karachi'
|
47
|
+
| 'Asia/Tashkent'
|
48
|
+
| 'Asia/Calcutta'
|
49
|
+
| 'Asia/Dhaka'
|
50
|
+
| 'Asia/Almaty'
|
51
|
+
| 'Asia/Jakarta'
|
52
|
+
| 'Asia/Bangkok'
|
53
|
+
| 'Asia/Shanghai'
|
54
|
+
| 'Asia/Singapore'
|
55
|
+
| 'Asia/Tokyo'
|
56
|
+
| 'Asia/Seoul'
|
57
|
+
| 'Australia/Brisbane'
|
58
|
+
| 'Australia/Sydney'
|
59
|
+
| 'Pacific/Guam'
|
60
|
+
| 'Pacific/Noumea'
|
61
|
+
| 'Pacific/Auckland'
|
62
|
+
| 'Pacific/Fiji';
|
63
|
+
|
9
64
|
export interface Config {
|
10
65
|
auth: {
|
11
66
|
users: UserAuthOperations;
|
12
67
|
};
|
68
|
+
blocks: {};
|
13
69
|
collections: {
|
14
70
|
users: User;
|
15
71
|
media: Media;
|
72
|
+
'payload-locked-documents': PayloadLockedDocument;
|
16
73
|
'payload-preferences': PayloadPreference;
|
17
74
|
'payload-migrations': PayloadMigration;
|
18
75
|
};
|
76
|
+
collectionsJoins: {};
|
77
|
+
collectionsSelect: {
|
78
|
+
users: UsersSelect<false> | UsersSelect<true>;
|
79
|
+
media: MediaSelect<false> | MediaSelect<true>;
|
80
|
+
'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;
|
81
|
+
'payload-preferences': PayloadPreferencesSelect<false> | PayloadPreferencesSelect<true>;
|
82
|
+
'payload-migrations': PayloadMigrationsSelect<false> | PayloadMigrationsSelect<true>;
|
83
|
+
};
|
19
84
|
db: {
|
20
85
|
defaultIDType: string;
|
21
86
|
};
|
22
87
|
globals: {};
|
88
|
+
globalsSelect: {};
|
23
89
|
locale: null;
|
24
90
|
user: User & {
|
25
91
|
collection: 'users';
|
26
92
|
};
|
93
|
+
jobs: {
|
94
|
+
tasks: unknown;
|
95
|
+
workflows: unknown;
|
96
|
+
};
|
27
97
|
}
|
28
98
|
export interface UserAuthOperations {
|
29
99
|
forgotPassword: {
|
@@ -79,6 +149,29 @@ export interface Media {
|
|
79
149
|
focalX?: number | null;
|
80
150
|
focalY?: number | null;
|
81
151
|
}
|
152
|
+
/**
|
153
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
154
|
+
* via the `definition` "payload-locked-documents".
|
155
|
+
*/
|
156
|
+
export interface PayloadLockedDocument {
|
157
|
+
id: string;
|
158
|
+
document?:
|
159
|
+
| ({
|
160
|
+
relationTo: 'users';
|
161
|
+
value: string | User;
|
162
|
+
} | null)
|
163
|
+
| ({
|
164
|
+
relationTo: 'media';
|
165
|
+
value: string | Media;
|
166
|
+
} | null);
|
167
|
+
globalSlug?: string | null;
|
168
|
+
user: {
|
169
|
+
relationTo: 'users';
|
170
|
+
value: string | User;
|
171
|
+
};
|
172
|
+
updatedAt: string;
|
173
|
+
createdAt: string;
|
174
|
+
}
|
82
175
|
/**
|
83
176
|
* This interface was referenced by `Config`'s JSON-Schema
|
84
177
|
* via the `definition` "payload-preferences".
|
@@ -113,6 +206,71 @@ export interface PayloadMigration {
|
|
113
206
|
updatedAt: string;
|
114
207
|
createdAt: string;
|
115
208
|
}
|
209
|
+
/**
|
210
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
211
|
+
* via the `definition` "users_select".
|
212
|
+
*/
|
213
|
+
export interface UsersSelect<T extends boolean = true> {
|
214
|
+
updatedAt?: T;
|
215
|
+
createdAt?: T;
|
216
|
+
email?: T;
|
217
|
+
resetPasswordToken?: T;
|
218
|
+
resetPasswordExpiration?: T;
|
219
|
+
salt?: T;
|
220
|
+
hash?: T;
|
221
|
+
loginAttempts?: T;
|
222
|
+
lockUntil?: T;
|
223
|
+
}
|
224
|
+
/**
|
225
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
226
|
+
* via the `definition` "media_select".
|
227
|
+
*/
|
228
|
+
export interface MediaSelect<T extends boolean = true> {
|
229
|
+
alt?: T;
|
230
|
+
updatedAt?: T;
|
231
|
+
createdAt?: T;
|
232
|
+
url?: T;
|
233
|
+
thumbnailURL?: T;
|
234
|
+
filename?: T;
|
235
|
+
mimeType?: T;
|
236
|
+
filesize?: T;
|
237
|
+
width?: T;
|
238
|
+
height?: T;
|
239
|
+
focalX?: T;
|
240
|
+
focalY?: T;
|
241
|
+
}
|
242
|
+
/**
|
243
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
244
|
+
* via the `definition` "payload-locked-documents_select".
|
245
|
+
*/
|
246
|
+
export interface PayloadLockedDocumentsSelect<T extends boolean = true> {
|
247
|
+
document?: T;
|
248
|
+
globalSlug?: T;
|
249
|
+
user?: T;
|
250
|
+
updatedAt?: T;
|
251
|
+
createdAt?: T;
|
252
|
+
}
|
253
|
+
/**
|
254
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
255
|
+
* via the `definition` "payload-preferences_select".
|
256
|
+
*/
|
257
|
+
export interface PayloadPreferencesSelect<T extends boolean = true> {
|
258
|
+
user?: T;
|
259
|
+
key?: T;
|
260
|
+
value?: T;
|
261
|
+
updatedAt?: T;
|
262
|
+
createdAt?: T;
|
263
|
+
}
|
264
|
+
/**
|
265
|
+
* This interface was referenced by `Config`'s JSON-Schema
|
266
|
+
* via the `definition` "payload-migrations_select".
|
267
|
+
*/
|
268
|
+
export interface PayloadMigrationsSelect<T extends boolean = true> {
|
269
|
+
name?: T;
|
270
|
+
batch?: T;
|
271
|
+
updatedAt?: T;
|
272
|
+
createdAt?: T;
|
273
|
+
}
|
116
274
|
/**
|
117
275
|
* This interface was referenced by `Config`'s JSON-Schema
|
118
276
|
* via the `definition` "auth".
|