From b3665fed1d15ca7867964231f1260ad3395183a1 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 15 Aug 2023 17:50:32 +0100 Subject: [PATCH 01/32] c3 add final commit to pages projects --- .changeset/nasty-dolphins-prove.md | 11 ++++++++ packages/create-cloudflare/src/common.ts | 15 ++++++----- packages/create-cloudflare/src/pages.ts | 33 ++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 .changeset/nasty-dolphins-prove.md diff --git a/.changeset/nasty-dolphins-prove.md b/.changeset/nasty-dolphins-prove.md new file mode 100644 index 000000000000..1653772ef09e --- /dev/null +++ b/.changeset/nasty-dolphins-prove.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": minor +--- + +add final commit when generating Pages projects + +before after the user would have completed the creation of a Pages project +they would find the Cloudflare added/modified files uncommitted, instead of +leaving these uncommitted this change adds an extra commit (on top of the +framework specific) which also contains some useful information about the +project diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 1b822fcfde2b..ed479b6c7326 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -249,18 +249,19 @@ export const offerGit = async (ctx: PagesGeneratorContext) => { } }; -export const gitCommit = async (ctx: PagesGeneratorContext) => { - if (!ctx.args.git) return; +export const gitCommit = async ( + ctx: PagesGeneratorContext, + commitMessage = "Initial commit (by Create-Cloudflare CLI)" +) => { + if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) + return; await runCommands({ silent: true, cwd: ctx.project.path, - commands: [ - "git add .", - ["git", "commit", "-m", "Initial commit (by Create-Cloudflare CLI)"], - ], + commands: ["git add .", ["git", "commit", "-m", commitMessage]], startText: "Committing new files", - doneText: `${brandColor("git")} ${dim(`initial commit`)}`, + doneText: `${brandColor("git")} ${dim(`commit`)}`, }); }; diff --git a/packages/create-cloudflare/src/pages.ts b/packages/create-cloudflare/src/pages.ts index de88c48db3c3..23aaeed2933d 100644 --- a/packages/create-cloudflare/src/pages.ts +++ b/packages/create-cloudflare/src/pages.ts @@ -1,13 +1,18 @@ #!/usr/bin/env node import { resolve } from "path"; import { chdir } from "process"; -import { FrameworkMap, supportedFramework } from "frameworks/index"; +import { + FrameworkMap, + getFrameworkVersion, + supportedFramework, +} from "frameworks/index"; import { crash, endSection, startSection } from "helpers/cli"; import { dim, brandColor } from "helpers/colors"; import { installWrangler, retry, runCommand } from "helpers/command"; import { readJSON, writeFile } from "helpers/files"; import { processArgument, spinner } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; +import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import { getProductionBranch, @@ -61,7 +66,7 @@ export const runPagesGenerator = async (args: C3Args) => { } await updatePackageScripts(ctx); await offerGit(ctx); - await gitCommit(ctx); + await gitCommit(ctx, generatePagesCommitMessage(ctx)); endSection(`Application configured`); // Deploy @@ -176,3 +181,27 @@ const createProject = async (ctx: PagesGeneratorContext) => { crash("Failed to create pages project. See output above."); } }; + +const generatePagesCommitMessage = (ctx: PagesGeneratorContext) => { + const header = "Web application initialized by Create-Cloudflare CLI"; + + const details: { key: string; value: string }[] = [ + { key: "date", value: new Date().toISOString() }, + { key: "create-cloudflare version", value: version }, + { key: "project name", value: ctx.project.name }, + ]; + + if (ctx.framework) { + details.push({ key: "framework", value: `${ctx.framework.name}` }); + details.push({ + key: "framework cli version", + value: `${getFrameworkVersion(ctx)}`, + }); + } + + const body = `Details:\n${details + .map(({ key, value }) => ` ${key} = ${value}`) + .join("\n")}\n`; + + return `${header}\n\n${body}\n`; +}; From 85a107135f9f91d179ff80f87b7cba0a378fa290 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 15 Aug 2023 23:02:38 +0100 Subject: [PATCH 02/32] move framework commit message generation inside gitCommit --- packages/create-cloudflare/src/common.ts | 35 +++++++++++++++++++++--- packages/create-cloudflare/src/pages.ts | 33 ++-------------------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index ed479b6c7326..1dfd99e492ac 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -1,6 +1,7 @@ import { existsSync, mkdirSync, readdirSync } from "fs"; import { basename, dirname, resolve } from "path"; import { chdir } from "process"; +import { getFrameworkVersion } from "frameworks/index"; import { crash, endSection, @@ -23,6 +24,7 @@ import { import { inputPrompt, processArgument, spinner } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; import { poll } from "helpers/poll"; +import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import type { C3Args, PagesGeneratorContext } from "types"; @@ -249,13 +251,14 @@ export const offerGit = async (ctx: PagesGeneratorContext) => { } }; -export const gitCommit = async ( - ctx: PagesGeneratorContext, - commitMessage = "Initial commit (by Create-Cloudflare CLI)" -) => { +export const gitCommit = async (ctx: PagesGeneratorContext) => { if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) return; + const commitMessage = + generateFrameworkCommitMessage(ctx) ?? + "Initial commit (by Create-Cloudflare CLI)"; + await runCommands({ silent: true, cwd: ctx.project.path, @@ -265,6 +268,30 @@ export const gitCommit = async ( }); }; +const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { + if (!ctx.framework) return; + + const header = "Web application initialized by Create-Cloudflare CLI"; + + const details: { key: string; value: string }[] = [ + { key: "date", value: new Date().toISOString() }, + { key: "create-cloudflare version", value: version }, + { key: "project name", value: ctx.project.name }, + ]; + + details.push({ key: "framework", value: `${ctx.framework.name}` }); + details.push({ + key: "framework cli version", + value: `${getFrameworkVersion(ctx)}`, + }); + + const body = `Details:\n${details + .map(({ key, value }) => ` ${key} = ${value}`) + .join("\n")}\n`; + + return `${header}\n\n${body}\n`; +}; + /** * Check whether git is available on the user's machine. */ diff --git a/packages/create-cloudflare/src/pages.ts b/packages/create-cloudflare/src/pages.ts index 23aaeed2933d..de88c48db3c3 100644 --- a/packages/create-cloudflare/src/pages.ts +++ b/packages/create-cloudflare/src/pages.ts @@ -1,18 +1,13 @@ #!/usr/bin/env node import { resolve } from "path"; import { chdir } from "process"; -import { - FrameworkMap, - getFrameworkVersion, - supportedFramework, -} from "frameworks/index"; +import { FrameworkMap, supportedFramework } from "frameworks/index"; import { crash, endSection, startSection } from "helpers/cli"; import { dim, brandColor } from "helpers/colors"; import { installWrangler, retry, runCommand } from "helpers/command"; import { readJSON, writeFile } from "helpers/files"; import { processArgument, spinner } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; -import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import { getProductionBranch, @@ -66,7 +61,7 @@ export const runPagesGenerator = async (args: C3Args) => { } await updatePackageScripts(ctx); await offerGit(ctx); - await gitCommit(ctx, generatePagesCommitMessage(ctx)); + await gitCommit(ctx); endSection(`Application configured`); // Deploy @@ -181,27 +176,3 @@ const createProject = async (ctx: PagesGeneratorContext) => { crash("Failed to create pages project. See output above."); } }; - -const generatePagesCommitMessage = (ctx: PagesGeneratorContext) => { - const header = "Web application initialized by Create-Cloudflare CLI"; - - const details: { key: string; value: string }[] = [ - { key: "date", value: new Date().toISOString() }, - { key: "create-cloudflare version", value: version }, - { key: "project name", value: ctx.project.name }, - ]; - - if (ctx.framework) { - details.push({ key: "framework", value: `${ctx.framework.name}` }); - details.push({ - key: "framework cli version", - value: `${getFrameworkVersion(ctx)}`, - }); - } - - const body = `Details:\n${details - .map(({ key, value }) => ` ${key} = ${value}`) - .join("\n")}\n`; - - return `${header}\n\n${body}\n`; -}; From 8788ea445d2f2295d4f5d26a08fd49f45296a3c6 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 11:30:04 +0100 Subject: [PATCH 03/32] add framework cli name and version to framework commit --- packages/create-cloudflare/src/common.ts | 15 ++---- .../src/frameworks/angular/index.ts | 9 ++-- .../src/frameworks/astro/index.ts | 6 +-- .../src/frameworks/cliMap.json | 53 +++++++++++++++++++ .../src/frameworks/docusaurus/index.ts | 6 +-- .../src/frameworks/gatsby/index.ts | 6 +-- .../src/frameworks/hono/index.ts | 6 +-- .../create-cloudflare/src/frameworks/index.ts | 20 +++++-- .../src/frameworks/next/index.ts | 6 +-- .../src/frameworks/nuxt/index.ts | 6 +-- .../src/frameworks/qwik/index.ts | 6 +-- .../src/frameworks/react/index.ts | 6 +-- .../src/frameworks/remix/index.ts | 6 +-- .../src/frameworks/solid/index.ts | 6 +-- .../src/frameworks/svelte/index.ts | 6 +-- .../src/frameworks/versionMap.json | 15 ------ .../src/frameworks/vue/index.ts | 6 +-- 17 files changed, 114 insertions(+), 70 deletions(-) create mode 100644 packages/create-cloudflare/src/frameworks/cliMap.json delete mode 100644 packages/create-cloudflare/src/frameworks/versionMap.json diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 1dfd99e492ac..8a7dec38c58f 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -1,7 +1,7 @@ import { existsSync, mkdirSync, readdirSync } from "fs"; import { basename, dirname, resolve } from "path"; import { chdir } from "process"; -import { getFrameworkVersion } from "frameworks/index"; +import { getFrameworkCli } from "frameworks/index"; import { crash, endSection, @@ -273,18 +273,13 @@ const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { const header = "Web application initialized by Create-Cloudflare CLI"; - const details: { key: string; value: string }[] = [ - { key: "date", value: new Date().toISOString() }, - { key: "create-cloudflare version", value: version }, + const details = [ + { key: "C3", value: `create-cloudflare@${version}` }, { key: "project name", value: ctx.project.name }, + { key: "framework", value: ctx.framework.name }, + { key: "framework cli", value: getFrameworkCli(ctx) }, ]; - details.push({ key: "framework", value: `${ctx.framework.name}` }); - details.push({ - key: "framework cli version", - value: `${getFrameworkVersion(ctx)}`, - }); - const body = `Details:\n${details .map(({ key, value }) => ` ${key} = ${value}`) .join("\n")}\n`; diff --git a/packages/create-cloudflare/src/frameworks/angular/index.ts b/packages/create-cloudflare/src/frameworks/angular/index.ts index 30c597a46365..7676b9197bf8 100644 --- a/packages/create-cloudflare/src/frameworks/angular/index.ts +++ b/packages/create-cloudflare/src/frameworks/angular/index.ts @@ -10,25 +10,26 @@ import { import { readFile, readJSON, writeFile } from "helpers/files"; import { spinner } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { dlx, npx, npm } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} @angular/cli@${version} new ${ctx.project.name} --standalone` + `${dlx} ${cli} new ${ctx.project.name} --standalone` ); logRaw(""); }; const configure = async (ctx: PagesGeneratorContext) => { + const cli = getFrameworkCli(ctx, false); process.chdir(ctx.project.path); - await runCommand(`${npx} @angular/cli@next analytics disable`, { + await runCommand(`${npx} ${cli}@next analytics disable`, { silent: true, }); await addSSRAdapter(); diff --git a/packages/create-cloudflare/src/frameworks/astro/index.ts b/packages/create-cloudflare/src/frameworks/astro/index.ts index 02004f0dc53d..916ac7304621 100644 --- a/packages/create-cloudflare/src/frameworks/astro/index.ts +++ b/packages/create-cloudflare/src/frameworks/astro/index.ts @@ -3,17 +3,17 @@ import { brandColor, dim } from "helpers/colors"; import { npmInstall, runCommand, runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npx, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-astro@${version} ${ctx.project.name} --no-install` + `${dlx} ${cli} ${ctx.project.name} --no-install` ); logRaw(""); // newline diff --git a/packages/create-cloudflare/src/frameworks/cliMap.json b/packages/create-cloudflare/src/frameworks/cliMap.json new file mode 100644 index 000000000000..f63f59fa06ef --- /dev/null +++ b/packages/create-cloudflare/src/frameworks/cliMap.json @@ -0,0 +1,53 @@ +{ + "angular": { + "cli": "@angular/cli", + "version": "16.1.x" + }, + "astro": { + "cli": "create-astro", + "version": "3.1.5" + }, + "docusaurus": { + "cli": "create-docusaurus", + "version": "2.4.1" + }, + "gatsby": { + "cli": "gatsby", + "version": "5.10.0" + }, + "hono": { + "cli": "create-hono", + "version": "0.2.6" + }, + "next": { + "cli": "create-next-app", + "version": "13.4.2" + }, + "nuxt": { + "cli": "nuxi", + "version": "3.4.2" + }, + "qwik": { + "cli": "create-qwik", + "version": "1.2.7" + }, + "react": { + "cli": "create-react-app", + "version": "5.0.1" + }, + "remix": { + "cli": "create-remix", + "version": "1.16.0" + }, + "solid": { + "cli": "create-solid", + "version": "0.2.26" + }, + "svelte": { + "cli": "create-svelte", + "version": "4.2.0" + }, + "vue": { + "cli": "create-vue", + "version": "3.6.4" +} } diff --git a/packages/create-cloudflare/src/frameworks/docusaurus/index.ts b/packages/create-cloudflare/src/frameworks/docusaurus/index.ts index 8f2ae8bd29ac..96ce8127e791 100644 --- a/packages/create-cloudflare/src/frameworks/docusaurus/index.ts +++ b/packages/create-cloudflare/src/frameworks/docusaurus/index.ts @@ -1,17 +1,17 @@ import { runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-docusaurus@${version} ${ctx.project.name} classic` + `${dlx} ${cli} ${ctx.project.name} classic` ); }; diff --git a/packages/create-cloudflare/src/frameworks/gatsby/index.ts b/packages/create-cloudflare/src/frameworks/gatsby/index.ts index ba51be6214a1..3370ea0f4632 100644 --- a/packages/create-cloudflare/src/frameworks/gatsby/index.ts +++ b/packages/create-cloudflare/src/frameworks/gatsby/index.ts @@ -2,7 +2,7 @@ import { runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { inputPrompt } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); @@ -27,10 +27,10 @@ const generate = async (ctx: PagesGeneratorContext) => { }); } - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} gatsby@${version} new ${ctx.project.name} ${templateUrl}` + `${dlx} ${cli} new ${ctx.project.name} ${templateUrl}` ); }; diff --git a/packages/create-cloudflare/src/frameworks/hono/index.ts b/packages/create-cloudflare/src/frameworks/hono/index.ts index f37073000030..7f3bb0e0efe1 100644 --- a/packages/create-cloudflare/src/frameworks/hono/index.ts +++ b/packages/create-cloudflare/src/frameworks/hono/index.ts @@ -1,17 +1,17 @@ import { logRaw } from "helpers/cli"; import { runFrameworkGenerator } from "helpers/command"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-hono@${version} ${ctx.project.name} --template cloudflare-workers` + `${dlx} ${cli} ${ctx.project.name} --template cloudflare-workers` ); logRaw(""); // newline diff --git a/packages/create-cloudflare/src/frameworks/index.ts b/packages/create-cloudflare/src/frameworks/index.ts index 5fa9552d5fac..0775e0e23dc7 100644 --- a/packages/create-cloudflare/src/frameworks/index.ts +++ b/packages/create-cloudflare/src/frameworks/index.ts @@ -1,6 +1,7 @@ import { crash } from "helpers/cli"; import angular from "./angular"; import astro from "./astro"; +import cliMap from "./cliMap.json"; import docusaurus from "./docusaurus"; import gatsby from "./gatsby"; import hono from "./hono"; @@ -11,7 +12,6 @@ import react from "./react"; import remix from "./remix"; import solid from "./solid"; import svelte from "./svelte"; -import versionMap from "./versionMap.json"; import vue from "./vue"; import type { FrameworkConfig, PagesGeneratorContext } from "types"; @@ -31,15 +31,25 @@ export const FrameworkMap: Record = { vue, }; +export const supportedFramework = (framework: string) => { + return Object.keys(FrameworkMap).includes(framework); +}; + export const getFrameworkVersion = (ctx: PagesGeneratorContext) => { if (!ctx.framework) { return crash("Framework not specified."); } - const framework = ctx.framework.name as keyof typeof versionMap; - return versionMap[framework]; + const framework = ctx.framework.name as keyof typeof cliMap; + return cliMap[framework].version; }; -export const supportedFramework = (framework: string) => { - return Object.keys(FrameworkMap).includes(framework); +export const getFrameworkCli = (ctx: PagesGeneratorContext, withVersion = true) => { + if (!ctx.framework) { + return crash("Framework not specified."); + } + + const framework = ctx.framework.name as keyof typeof cliMap; + const { cli, version } = cliMap[framework]; + return withVersion ? `${cli}@${version}` : cli; }; diff --git a/packages/create-cloudflare/src/frameworks/next/index.ts b/packages/create-cloudflare/src/frameworks/next/index.ts index 56cb80919d52..52d93957323f 100644 --- a/packages/create-cloudflare/src/frameworks/next/index.ts +++ b/packages/create-cloudflare/src/frameworks/next/index.ts @@ -12,7 +12,7 @@ import { } from "helpers/files"; import { processArgument } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import { apiAppDirHelloJs, apiAppDirHelloTs, @@ -25,11 +25,11 @@ const { npm, npx, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const projectName = ctx.project.name; - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-next-app@${version} ${projectName}` + `${dlx} ${cli} ${projectName}` ); }; diff --git a/packages/create-cloudflare/src/frameworks/nuxt/index.ts b/packages/create-cloudflare/src/frameworks/nuxt/index.ts index b17f58c9e4ef..a0691bf4d137 100644 --- a/packages/create-cloudflare/src/frameworks/nuxt/index.ts +++ b/packages/create-cloudflare/src/frameworks/nuxt/index.ts @@ -3,17 +3,17 @@ import { npmInstall, runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from ".."; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} nuxi@${version} init ${ctx.project.name}` + `${dlx} ${cli} init ${ctx.project.name}` ); logRaw(""); // newline diff --git a/packages/create-cloudflare/src/frameworks/qwik/index.ts b/packages/create-cloudflare/src/frameworks/qwik/index.ts index 8afdc55c621c..be1b6729806d 100644 --- a/packages/create-cloudflare/src/frameworks/qwik/index.ts +++ b/packages/create-cloudflare/src/frameworks/qwik/index.ts @@ -2,19 +2,19 @@ import { endSection } from "helpers/cli"; import { npmInstall, runCommand, runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, npx, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); // TODO: make this interactive when its possible to specify the project name // to create-qwik in interactive mode await runFrameworkGenerator( ctx, - `${dlx} create-qwik@${version} basic ${ctx.project.name}` + `${dlx} ${cli} basic ${ctx.project.name}` ); }; diff --git a/packages/create-cloudflare/src/frameworks/react/index.ts b/packages/create-cloudflare/src/frameworks/react/index.ts index 221fe2ae8c34..a9b77befa62c 100644 --- a/packages/create-cloudflare/src/frameworks/react/index.ts +++ b/packages/create-cloudflare/src/frameworks/react/index.ts @@ -2,17 +2,17 @@ import { logRaw } from "helpers/cli"; import { resetPackageManager, runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-react-app@${version} ${ctx.project.name}` + `${dlx} ${cli} ${ctx.project.name}` ); logRaw(""); diff --git a/packages/create-cloudflare/src/frameworks/remix/index.ts b/packages/create-cloudflare/src/frameworks/remix/index.ts index c8a030283763..5d48c339ce7a 100644 --- a/packages/create-cloudflare/src/frameworks/remix/index.ts +++ b/packages/create-cloudflare/src/frameworks/remix/index.ts @@ -1,17 +1,17 @@ import { logRaw } from "helpers/cli"; import { runFrameworkGenerator } from "helpers/command.js"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-remix@${version} ${ctx.project.name} --template https://github.com/remix-run/remix/tree/main/templates/cloudflare-pages` + `${dlx} ${cli} ${ctx.project.name} --template https://github.com/remix-run/remix/tree/main/templates/cloudflare-pages` ); logRaw(""); // newline diff --git a/packages/create-cloudflare/src/frameworks/solid/index.ts b/packages/create-cloudflare/src/frameworks/solid/index.ts index cdfe281f2c3b..37aea0c3c6a6 100644 --- a/packages/create-cloudflare/src/frameworks/solid/index.ts +++ b/packages/create-cloudflare/src/frameworks/solid/index.ts @@ -4,7 +4,7 @@ import { blue, brandColor, dim } from "helpers/colors"; import { installPackages, runFrameworkGenerator } from "helpers/command"; import { compatDateFlag, usesTypescript, writeFile } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import { viteConfig } from "./templates"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; @@ -16,8 +16,8 @@ const generate = async (ctx: PagesGeneratorContext) => { process.chdir(ctx.project.path); // Run the create-solid command - const version = getFrameworkVersion(ctx); - await runFrameworkGenerator(ctx, `${dlx} create-solid@${version}`); + const cli = getFrameworkCli(ctx); + await runFrameworkGenerator(ctx, `${dlx} ${cli}`); logRaw(""); }; diff --git a/packages/create-cloudflare/src/frameworks/svelte/index.ts b/packages/create-cloudflare/src/frameworks/svelte/index.ts index 118ef29805ca..018a32b7cf44 100644 --- a/packages/create-cloudflare/src/frameworks/svelte/index.ts +++ b/packages/create-cloudflare/src/frameworks/svelte/index.ts @@ -8,7 +8,7 @@ import { } from "helpers/command"; import { compatDateFlag, usesTypescript } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import { platformInterface } from "./templates"; import type * as recast from "recast"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; @@ -16,10 +16,10 @@ import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-svelte@${version} ${ctx.project.name}` + `${dlx} ${cli} ${ctx.project.name}` ); logRaw(""); diff --git a/packages/create-cloudflare/src/frameworks/versionMap.json b/packages/create-cloudflare/src/frameworks/versionMap.json deleted file mode 100644 index 109a9b8ddb3e..000000000000 --- a/packages/create-cloudflare/src/frameworks/versionMap.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "angular": "16.1.x", - "astro": "3.1.5", - "docusaurus": "2.4.1", - "gatsby": "5.10.0", - "hono": "0.2.6", - "next": "13.4.2", - "nuxt": "3.4.2", - "qwik": "1.2.7", - "react": "5.0.1", - "remix": "1.16.0", - "solid": "0.2.26", - "svelte": "4.2.0", - "vue": "3.6.4" -} diff --git a/packages/create-cloudflare/src/frameworks/vue/index.ts b/packages/create-cloudflare/src/frameworks/vue/index.ts index d8822e584f54..04ba39a71491 100644 --- a/packages/create-cloudflare/src/frameworks/vue/index.ts +++ b/packages/create-cloudflare/src/frameworks/vue/index.ts @@ -1,16 +1,16 @@ import { runFrameworkGenerator } from "helpers/command"; import { compatDateFlag } from "helpers/files"; import { detectPackageManager } from "helpers/packages"; -import { getFrameworkVersion } from "../index"; +import { getFrameworkCli } from "../index"; import type { PagesGeneratorContext, FrameworkConfig } from "types"; const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { - const version = getFrameworkVersion(ctx); + const cli = getFrameworkCli(ctx); await runFrameworkGenerator( ctx, - `${dlx} create-vue@${version} ${ctx.project.name}` + `${dlx} ${cli} ${ctx.project.name}` ); }; From 5f36888d66fc0e086a863a27584271b648da82bd Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 12:04:55 +0100 Subject: [PATCH 04/32] add package manager info to framework commit --- packages/create-cloudflare/src/common.ts | 3 +++ packages/create-cloudflare/src/helpers/packages.ts | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 8a7dec38c58f..3ac5ab5cd201 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -273,11 +273,14 @@ const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { const header = "Web application initialized by Create-Cloudflare CLI"; + const packageManager = detectPackageManager(); + const details = [ { key: "C3", value: `create-cloudflare@${version}` }, { key: "project name", value: ctx.project.name }, { key: "framework", value: ctx.framework.name }, { key: "framework cli", value: getFrameworkCli(ctx) }, + { key: "package manager", value: `${packageManager.name}@${packageManager.version}` } ]; const body = `Details:\n${details diff --git a/packages/create-cloudflare/src/helpers/packages.ts b/packages/create-cloudflare/src/helpers/packages.ts index f8a84a3284fb..ea25cc897e7c 100644 --- a/packages/create-cloudflare/src/helpers/packages.ts +++ b/packages/create-cloudflare/src/helpers/packages.ts @@ -31,12 +31,16 @@ export const detectPackageManager = () => { case "pnpm": if (semver.gt(version, "6.0.0")) { return { + name, + version, npm: "pnpm", npx: "pnpm", dlx: "pnpm dlx", }; } return { + name, + version, npm: "pnpm", npx: "pnpx", dlx: "pnpx", @@ -44,12 +48,16 @@ export const detectPackageManager = () => { case "yarn": if (semver.gt(version, "2.0.0")) { return { + name, + version, npm: "yarn", npx: "yarn", dlx: "yarn dlx", }; } return { + name, + version, npm: "yarn", npx: "yarn", dlx: "yarn", @@ -57,6 +65,8 @@ export const detectPackageManager = () => { case "npm": default: return { + name, + version, npm: "npm", npx: "npx", dlx: "npx", From 7b26f2c793b90c15f604ef2d2f8e3c64fddbfc9d Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 13:32:09 +0100 Subject: [PATCH 05/32] run prettify --- packages/create-cloudflare/src/common.ts | 5 ++++- packages/create-cloudflare/src/frameworks/cliMap.json | 3 ++- .../create-cloudflare/src/frameworks/docusaurus/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/index.ts | 5 ++++- packages/create-cloudflare/src/frameworks/next/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/nuxt/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/qwik/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/react/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/svelte/index.ts | 5 +---- packages/create-cloudflare/src/frameworks/vue/index.ts | 5 +---- 10 files changed, 17 insertions(+), 31 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 3ac5ab5cd201..fd955c913942 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -280,7 +280,10 @@ const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { { key: "project name", value: ctx.project.name }, { key: "framework", value: ctx.framework.name }, { key: "framework cli", value: getFrameworkCli(ctx) }, - { key: "package manager", value: `${packageManager.name}@${packageManager.version}` } + { + key: "package manager", + value: `${packageManager.name}@${packageManager.version}`, + }, ]; const body = `Details:\n${details diff --git a/packages/create-cloudflare/src/frameworks/cliMap.json b/packages/create-cloudflare/src/frameworks/cliMap.json index f63f59fa06ef..ea733de193f5 100644 --- a/packages/create-cloudflare/src/frameworks/cliMap.json +++ b/packages/create-cloudflare/src/frameworks/cliMap.json @@ -50,4 +50,5 @@ "vue": { "cli": "create-vue", "version": "3.6.4" -} } + } +} diff --git a/packages/create-cloudflare/src/frameworks/docusaurus/index.ts b/packages/create-cloudflare/src/frameworks/docusaurus/index.ts index 96ce8127e791..06bc57b01e44 100644 --- a/packages/create-cloudflare/src/frameworks/docusaurus/index.ts +++ b/packages/create-cloudflare/src/frameworks/docusaurus/index.ts @@ -9,10 +9,7 @@ const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} ${ctx.project.name} classic` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} ${ctx.project.name} classic`); }; const config: FrameworkConfig = { diff --git a/packages/create-cloudflare/src/frameworks/index.ts b/packages/create-cloudflare/src/frameworks/index.ts index 0775e0e23dc7..1f63bd0fee63 100644 --- a/packages/create-cloudflare/src/frameworks/index.ts +++ b/packages/create-cloudflare/src/frameworks/index.ts @@ -44,7 +44,10 @@ export const getFrameworkVersion = (ctx: PagesGeneratorContext) => { return cliMap[framework].version; }; -export const getFrameworkCli = (ctx: PagesGeneratorContext, withVersion = true) => { +export const getFrameworkCli = ( + ctx: PagesGeneratorContext, + withVersion = true +) => { if (!ctx.framework) { return crash("Framework not specified."); } diff --git a/packages/create-cloudflare/src/frameworks/next/index.ts b/packages/create-cloudflare/src/frameworks/next/index.ts index 52d93957323f..617a85a3aa7c 100644 --- a/packages/create-cloudflare/src/frameworks/next/index.ts +++ b/packages/create-cloudflare/src/frameworks/next/index.ts @@ -27,10 +27,7 @@ const generate = async (ctx: PagesGeneratorContext) => { const projectName = ctx.project.name; const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} ${projectName}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} ${projectName}`); }; const getApiTemplate = ( diff --git a/packages/create-cloudflare/src/frameworks/nuxt/index.ts b/packages/create-cloudflare/src/frameworks/nuxt/index.ts index a0691bf4d137..bf675c02f1d3 100644 --- a/packages/create-cloudflare/src/frameworks/nuxt/index.ts +++ b/packages/create-cloudflare/src/frameworks/nuxt/index.ts @@ -11,10 +11,7 @@ const { dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} init ${ctx.project.name}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} init ${ctx.project.name}`); logRaw(""); // newline }; diff --git a/packages/create-cloudflare/src/frameworks/qwik/index.ts b/packages/create-cloudflare/src/frameworks/qwik/index.ts index be1b6729806d..cea477c140f3 100644 --- a/packages/create-cloudflare/src/frameworks/qwik/index.ts +++ b/packages/create-cloudflare/src/frameworks/qwik/index.ts @@ -12,10 +12,7 @@ const generate = async (ctx: PagesGeneratorContext) => { // TODO: make this interactive when its possible to specify the project name // to create-qwik in interactive mode - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} basic ${ctx.project.name}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} basic ${ctx.project.name}`); }; const configure = async (ctx: PagesGeneratorContext) => { diff --git a/packages/create-cloudflare/src/frameworks/react/index.ts b/packages/create-cloudflare/src/frameworks/react/index.ts index a9b77befa62c..dc50848f6cda 100644 --- a/packages/create-cloudflare/src/frameworks/react/index.ts +++ b/packages/create-cloudflare/src/frameworks/react/index.ts @@ -10,10 +10,7 @@ const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} ${ctx.project.name}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} ${ctx.project.name}`); logRaw(""); }; diff --git a/packages/create-cloudflare/src/frameworks/svelte/index.ts b/packages/create-cloudflare/src/frameworks/svelte/index.ts index 018a32b7cf44..7830a67fff2b 100644 --- a/packages/create-cloudflare/src/frameworks/svelte/index.ts +++ b/packages/create-cloudflare/src/frameworks/svelte/index.ts @@ -17,10 +17,7 @@ const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} ${ctx.project.name}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} ${ctx.project.name}`); logRaw(""); }; diff --git a/packages/create-cloudflare/src/frameworks/vue/index.ts b/packages/create-cloudflare/src/frameworks/vue/index.ts index 04ba39a71491..adbd4b6aeada 100644 --- a/packages/create-cloudflare/src/frameworks/vue/index.ts +++ b/packages/create-cloudflare/src/frameworks/vue/index.ts @@ -8,10 +8,7 @@ const { npm, dlx } = detectPackageManager(); const generate = async (ctx: PagesGeneratorContext) => { const cli = getFrameworkCli(ctx); - await runFrameworkGenerator( - ctx, - `${dlx} ${cli} ${ctx.project.name}` - ); + await runFrameworkGenerator(ctx, `${dlx} ${cli} ${ctx.project.name}`); }; const config: FrameworkConfig = { From b30bacb6ff178653e87c56334975177d37fa23bb Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 13:55:42 +0100 Subject: [PATCH 06/32] make commit header imperative --- packages/create-cloudflare/src/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index fd955c913942..13ff66bfbeac 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -271,7 +271,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { if (!ctx.framework) return; - const header = "Web application initialized by Create-Cloudflare CLI"; + const header = "Initialize Web application via Create-Cloudflare CLI"; const packageManager = detectPackageManager(); From 6cef3d317007b1ecbd7a9dbad4881ef10369a676 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 14:00:22 +0100 Subject: [PATCH 07/32] update Web to web --- packages/create-cloudflare/src/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 13ff66bfbeac..f168ac62014f 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -271,7 +271,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { if (!ctx.framework) return; - const header = "Initialize Web application via Create-Cloudflare CLI"; + const header = "Initialize web application via Create-Cloudflare CLI"; const packageManager = detectPackageManager(); From cdd9cb227db94a6d394b575d9db1034b3fa24c43 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 15:08:04 +0100 Subject: [PATCH 08/32] lowercase Create-Cloudflare --- packages/create-cloudflare/src/common.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index f168ac62014f..7782a07709e3 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -257,7 +257,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { const commitMessage = generateFrameworkCommitMessage(ctx) ?? - "Initial commit (by Create-Cloudflare CLI)"; + "Initial commit (by create-cloudflare CLI)"; await runCommands({ silent: true, @@ -271,7 +271,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { if (!ctx.framework) return; - const header = "Initialize web application via Create-Cloudflare CLI"; + const header = "Initialize web application via create-cloudflare CLI"; const packageManager = detectPackageManager(); From 975da3ea8eaccf4d625da58697be51d548b1066f Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 16:20:21 +0100 Subject: [PATCH 09/32] refactor generateFrameworkCommitMessage to generateCommit message --- packages/create-cloudflare/src/common.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 7782a07709e3..08a6d30c0c61 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -255,9 +255,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) return; - const commitMessage = - generateFrameworkCommitMessage(ctx) ?? - "Initial commit (by create-cloudflare CLI)"; + const commitMessage = generateCommitMessage(ctx); await runCommands({ silent: true, @@ -268,8 +266,8 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { }); }; -const generateFrameworkCommitMessage = (ctx: PagesGeneratorContext) => { - if (!ctx.framework) return; +const generateCommitMessage = (ctx: PagesGeneratorContext) => { + if (!ctx.framework) return "Initial commit (by create-cloudflare CLI)"; const header = "Initialize web application via create-cloudflare CLI"; From e3e0e42a8ff52efc7af0a2208822da3450536524 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 16:40:38 +0100 Subject: [PATCH 10/32] convert cliMap.json to package.json so that we can leverage dependabot --- .../src/frameworks/cliMap.json | 54 ------------------- .../create-cloudflare/src/frameworks/index.ts | 21 +++----- .../src/frameworks/package.json | 36 +++++++++++++ 3 files changed, 44 insertions(+), 67 deletions(-) delete mode 100644 packages/create-cloudflare/src/frameworks/cliMap.json create mode 100644 packages/create-cloudflare/src/frameworks/package.json diff --git a/packages/create-cloudflare/src/frameworks/cliMap.json b/packages/create-cloudflare/src/frameworks/cliMap.json deleted file mode 100644 index ea733de193f5..000000000000 --- a/packages/create-cloudflare/src/frameworks/cliMap.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "angular": { - "cli": "@angular/cli", - "version": "16.1.x" - }, - "astro": { - "cli": "create-astro", - "version": "3.1.5" - }, - "docusaurus": { - "cli": "create-docusaurus", - "version": "2.4.1" - }, - "gatsby": { - "cli": "gatsby", - "version": "5.10.0" - }, - "hono": { - "cli": "create-hono", - "version": "0.2.6" - }, - "next": { - "cli": "create-next-app", - "version": "13.4.2" - }, - "nuxt": { - "cli": "nuxi", - "version": "3.4.2" - }, - "qwik": { - "cli": "create-qwik", - "version": "1.2.7" - }, - "react": { - "cli": "create-react-app", - "version": "5.0.1" - }, - "remix": { - "cli": "create-remix", - "version": "1.16.0" - }, - "solid": { - "cli": "create-solid", - "version": "0.2.26" - }, - "svelte": { - "cli": "create-svelte", - "version": "4.2.0" - }, - "vue": { - "cli": "create-vue", - "version": "3.6.4" - } -} diff --git a/packages/create-cloudflare/src/frameworks/index.ts b/packages/create-cloudflare/src/frameworks/index.ts index 1f63bd0fee63..d5f9e9520875 100644 --- a/packages/create-cloudflare/src/frameworks/index.ts +++ b/packages/create-cloudflare/src/frameworks/index.ts @@ -1,12 +1,12 @@ import { crash } from "helpers/cli"; import angular from "./angular"; import astro from "./astro"; -import cliMap from "./cliMap.json"; import docusaurus from "./docusaurus"; import gatsby from "./gatsby"; import hono from "./hono"; import next from "./next"; import nuxt from "./nuxt"; +import clisPackageJson from "./package.json"; import qwik from "./qwik"; import react from "./react"; import remix from "./remix"; @@ -35,15 +35,6 @@ export const supportedFramework = (framework: string) => { return Object.keys(FrameworkMap).includes(framework); }; -export const getFrameworkVersion = (ctx: PagesGeneratorContext) => { - if (!ctx.framework) { - return crash("Framework not specified."); - } - - const framework = ctx.framework.name as keyof typeof cliMap; - return cliMap[framework].version; -}; - export const getFrameworkCli = ( ctx: PagesGeneratorContext, withVersion = true @@ -52,7 +43,11 @@ export const getFrameworkCli = ( return crash("Framework not specified."); } - const framework = ctx.framework.name as keyof typeof cliMap; - const { cli, version } = cliMap[framework]; - return withVersion ? `${cli}@${version}` : cli; + const framework = ctx.framework + .name as keyof typeof clisPackageJson.frameworkCliMap; + const frameworkCli = clisPackageJson.frameworkCliMap[ + framework + ] as keyof typeof clisPackageJson.dependencies; + const version = clisPackageJson.dependencies[frameworkCli]; + return withVersion ? `${frameworkCli}@${version}` : frameworkCli; }; diff --git a/packages/create-cloudflare/src/frameworks/package.json b/packages/create-cloudflare/src/frameworks/package.json new file mode 100644 index 000000000000..d7870f123ad0 --- /dev/null +++ b/packages/create-cloudflare/src/frameworks/package.json @@ -0,0 +1,36 @@ +{ + "name": "frameworks_clis_info", + "dependencies": { + "@angular/cli": "^0.4.5", + "create-astro": "3.1.5", + "create-docusaurus": "2.4.1", + "create-hono": "0.2.6", + "create-next-app": "13.4.2", + "create-qwik": "1.2.7", + "create-react-app": "5.0.1", + "create-remix": "1.16.0", + "create-solid": "0.2.26", + "create-svelte": "4.2.0", + "create-vue": "3.6.4", + "gatsby": "5.10.0", + "nuxi": "3.4.2" + }, + "//1": "this package.json is only used to keep track of the frameworks cli dependencies", + "//2": "so that we can use dependabot to update these dependencies automatically", + "//3": "additionally it also contains a map that maps frameworks to their respective clis", + "frameworkCliMap": { + "angular": "@angular/cli", + "astro": "create-astro", + "docusaurus": "create-docusaurus", + "gatsby": "gatsby", + "hono": "create-hono", + "next": "create-next-app", + "nuxt": "nuxi", + "qwik": "create-qwik", + "react": "create-react-app", + "remix": "create-remix", + "solid": "create-solid", + "svelte": "create-svelte", + "vue": "create-vue" + } +} From 3129445de5b506bb8fc25de1f81fa49cfaa7d8b3 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 17:01:13 +0100 Subject: [PATCH 11/32] add wrangler version to commit message --- packages/create-cloudflare/src/common.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 08a6d30c0c61..b99bd74c86c5 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -27,6 +27,7 @@ import { poll } from "helpers/poll"; import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import type { C3Args, PagesGeneratorContext } from "types"; +import { version as wranglerVersion } from "wrangler/package.json"; const { npm } = detectPackageManager(); @@ -255,7 +256,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) return; - const commitMessage = generateCommitMessage(ctx); + const commitMessage = createCommitMessage(ctx); await runCommands({ silent: true, @@ -266,7 +267,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { }); }; -const generateCommitMessage = (ctx: PagesGeneratorContext) => { +const createCommitMessage = (ctx: PagesGeneratorContext) => { if (!ctx.framework) return "Initial commit (by create-cloudflare CLI)"; const header = "Initialize web application via create-cloudflare CLI"; @@ -282,6 +283,10 @@ const generateCommitMessage = (ctx: PagesGeneratorContext) => { key: "package manager", value: `${packageManager.name}@${packageManager.version}`, }, + { + key: "wrangler", + value: `wrangler@${wranglerVersion}`, + }, ]; const body = `Details:\n${details From 54ac49018fbbd9a7ace0277aa1e1676088f78418 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 17:26:41 +0100 Subject: [PATCH 12/32] add git version to commit --- packages/create-cloudflare/src/common.ts | 28 +++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index b99bd74c86c5..b7eb45ba0df2 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -256,7 +256,7 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) return; - const commitMessage = createCommitMessage(ctx); + const commitMessage = await createCommitMessage(ctx); await runCommands({ silent: true, @@ -267,13 +267,16 @@ export const gitCommit = async (ctx: PagesGeneratorContext) => { }); }; -const createCommitMessage = (ctx: PagesGeneratorContext) => { +const createCommitMessage = async (ctx: PagesGeneratorContext) => { if (!ctx.framework) return "Initial commit (by create-cloudflare CLI)"; const header = "Initialize web application via create-cloudflare CLI"; const packageManager = detectPackageManager(); + const gitVersion = await getGitVersion(); + const insideRepo = await isInsideGitRepo(ctx.project.path); + const details = [ { key: "C3", value: `create-cloudflare@${version}` }, { key: "project name", value: ctx.project.name }, @@ -287,6 +290,10 @@ const createCommitMessage = (ctx: PagesGeneratorContext) => { key: "wrangler", value: `wrangler@${wranglerVersion}`, }, + { + key: "git", + value: insideRepo ? gitVersion : 'N/A', + } ]; const body = `Details:\n${details @@ -297,18 +304,23 @@ const createCommitMessage = (ctx: PagesGeneratorContext) => { }; /** - * Check whether git is available on the user's machine. + * Return the version of git on the user's machine, or null if git is not available. */ -export async function isGitInstalled() { +async function getGitVersion() { try { - await runCommand("git -v", { useSpinner: false, silent: true }); - - return true; + return runCommand("git -v", { useSpinner: false, silent: true }); } catch { - return false; + return null; } } +/** + * Check whether git is available on the user's machine. + */ +async function isGitInstalled() { + return (await getGitVersion()) !== null; +} + /** * Check whether the given current working directory is within a git repository * by looking for a `.git` directory in this or an ancestor directory. From f81bea2b5805c28c95121388fe53d579c6f1eb1f Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 17:42:19 +0100 Subject: [PATCH 13/32] run prettify --- packages/create-cloudflare/src/common.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index b7eb45ba0df2..afe2627af889 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -292,8 +292,8 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { }, { key: "git", - value: insideRepo ? gitVersion : 'N/A', - } + value: insideRepo ? gitVersion : "N/A", + }, ]; const body = `Details:\n${details From 0eb3c54af1fe9218eaff325fa8c40697dd251e55 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 18:16:35 +0100 Subject: [PATCH 14/32] move comments to description field --- packages/create-cloudflare/src/frameworks/package.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/create-cloudflare/src/frameworks/package.json b/packages/create-cloudflare/src/frameworks/package.json index d7870f123ad0..33eddcf257fd 100644 --- a/packages/create-cloudflare/src/frameworks/package.json +++ b/packages/create-cloudflare/src/frameworks/package.json @@ -1,5 +1,10 @@ { "name": "frameworks_clis_info", + "description": [ + "this package.json is only used to keep track of the frameworks cli dependencies", + "so that we can use dependabot to update these dependencies automatically", + "additionally it also contains a map that maps frameworks to their respective clis" + ], "dependencies": { "@angular/cli": "^0.4.5", "create-astro": "3.1.5", @@ -15,9 +20,6 @@ "gatsby": "5.10.0", "nuxi": "3.4.2" }, - "//1": "this package.json is only used to keep track of the frameworks cli dependencies", - "//2": "so that we can use dependabot to update these dependencies automatically", - "//3": "additionally it also contains a map that maps frameworks to their respective clis", "frameworkCliMap": { "angular": "@angular/cli", "astro": "create-astro", From 829bf69625db062a7459ae67080b1d0a8ffc12ad Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 18:41:04 +0100 Subject: [PATCH 15/32] improve git version gathering --- packages/create-cloudflare/src/common.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index afe2627af889..f2669fa69672 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -308,7 +308,13 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { */ async function getGitVersion() { try { - return runCommand("git -v", { useSpinner: false, silent: true }); + const rawGitVersion = await runCommand("git --version", { + useSpinner: false, + silent: true, + }); + // let's remove the "git version " prefix as it isn't really helpful + const gitVersion = rawGitVersion.replace(/^git\s+version\s+/, ""); + return gitVersion; } catch { return null; } From 78a9bb40e26e057200daf3c8f163b4d176a94e7d Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 22:45:40 +0100 Subject: [PATCH 16/32] add commit message to deployment without git --- packages/create-cloudflare/src/common.ts | 27 ++++++++++++++----- .../create-cloudflare/src/helpers/command.ts | 2 +- packages/create-cloudflare/src/types.ts | 1 + 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index f2669fa69672..16f134ed823f 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -24,10 +24,10 @@ import { import { inputPrompt, processArgument, spinner } from "helpers/interactive"; import { detectPackageManager } from "helpers/packages"; import { poll } from "helpers/poll"; +import { version as wranglerVersion } from "wrangler/package.json"; import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import type { C3Args, PagesGeneratorContext } from "types"; -import { version as wranglerVersion } from "wrangler/package.json"; const { npm } = detectPackageManager(); @@ -90,15 +90,28 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { return; } - const deployCmd = `${npm} run ${ - ctx.framework?.config.deployCommand ?? "deploy" - }`; + const baseDeployCmd = [ + npm, + "run", + ctx.framework?.config.deployCommand ?? "deploy", + ]; + + const insideGitRepo = await isInsideGitRepo(ctx.project.path); + + const deployCmd = [ + ...baseDeployCmd, + // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` + ctx.framework?.commitMessage && !insideGitRepo + ? `--commit-message="${ctx.framework.commitMessage}"` + : "", + ]; + const result = await runCommand(deployCmd, { silent: true, cwd: ctx.project.path, env: { CLOUDFLARE_ACCOUNT_ID: ctx.account.id, NODE_ENV: "production" }, startText: `Deploying your application`, - doneText: `${brandColor("deployed")} ${dim(`via \`${deployCmd}\``)}`, + doneText: `${brandColor("deployed")} ${dim(`via \`${baseDeployCmd}\``)}`, }); const deployedUrlRegex = /https:\/\/.+\.(pages|workers)\.dev/; @@ -300,7 +313,9 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { .map(({ key, value }) => ` ${key} = ${value}`) .join("\n")}\n`; - return `${header}\n\n${body}\n`; + ctx.framework.commitMessage = `${header}\n\n${body}\n`; + + return ctx.framework.commitMessage; }; /** diff --git a/packages/create-cloudflare/src/helpers/command.ts b/packages/create-cloudflare/src/helpers/command.ts index 98dca36a58d9..a56233c6b035 100644 --- a/packages/create-cloudflare/src/helpers/command.ts +++ b/packages/create-cloudflare/src/helpers/command.ts @@ -47,7 +47,7 @@ export const runCommand = async ( opts: RunOptions = {} ): Promise => { if (typeof command === "string") { - command = command.trim().replace(/\s+/g, ` `).split(" "); + command = command.trim().replace(/\s+/g, " ").split(" "); } return printAsyncStatus({ diff --git a/packages/create-cloudflare/src/types.ts b/packages/create-cloudflare/src/types.ts index e213b9df3de0..2d5dc30ce434 100644 --- a/packages/create-cloudflare/src/types.ts +++ b/packages/create-cloudflare/src/types.ts @@ -29,6 +29,7 @@ export type PagesGeneratorContext = { framework?: { name: string; config: FrameworkConfig; + commitMessage?: string; }; project: { name: string; From e06694541edbba812e0c3433bfbf481f5e30936d Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 23:33:01 +0100 Subject: [PATCH 17/32] fix the commit message addition to wrangler pages deploy --- packages/create-cloudflare/src/common.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 16f134ed823f..2ab64d0c8822 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -102,9 +102,9 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { ...baseDeployCmd, // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` ctx.framework?.commitMessage && !insideGitRepo - ? `--commit-message="${ctx.framework.commitMessage}"` + ? `--commit-message="${ctx.framework.commitMessage.replaceAll('"', "\\\"")}"` : "", - ]; + ].filter(Boolean); const result = await runCommand(deployCmd, { silent: true, @@ -266,11 +266,14 @@ export const offerGit = async (ctx: PagesGeneratorContext) => { }; export const gitCommit = async (ctx: PagesGeneratorContext) => { + // Note: createCommitMessage stores the message in ctx so that it can + // be used later even if we're not in a git repository, that's why + // we unconditionally run this command here + const commitMessage = await createCommitMessage(ctx); + if (!(await isGitInstalled()) || !(await isInsideGitRepo(ctx.project.path))) return; - const commitMessage = await createCommitMessage(ctx); - await runCommands({ silent: true, cwd: ctx.project.path, From eb202b0a32bd6e97ab6903979087b17a01863535 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Wed, 16 Aug 2023 23:53:47 +0100 Subject: [PATCH 18/32] fix user facing label --- packages/create-cloudflare/src/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 2ab64d0c8822..920b0457c41b 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -111,7 +111,7 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { cwd: ctx.project.path, env: { CLOUDFLARE_ACCOUNT_ID: ctx.account.id, NODE_ENV: "production" }, startText: `Deploying your application`, - doneText: `${brandColor("deployed")} ${dim(`via \`${baseDeployCmd}\``)}`, + doneText: `${brandColor("deployed")} ${dim(`via \`${baseDeployCmd.join(' ')}\``)}`, }); const deployedUrlRegex = /https:\/\/.+\.(pages|workers)\.dev/; From 9adc9496f27d0baeb4f79e8ab856be9b35301891 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Thu, 17 Aug 2023 00:35:11 +0100 Subject: [PATCH 19/32] fix commit message not being properly passed --- packages/create-cloudflare/src/common.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 920b0457c41b..0c52c616dfce 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -101,16 +101,16 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { const deployCmd = [ ...baseDeployCmd, // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` - ctx.framework?.commitMessage && !insideGitRepo - ? `--commit-message="${ctx.framework.commitMessage.replaceAll('"', "\\\"")}"` - : "", - ].filter(Boolean); + ...(ctx.framework?.commitMessage && !insideGitRepo + ? ['--', `--commit-message="${ctx.framework.commitMessage.replaceAll('"', "\\\"")}"`] + : []), + ]; const result = await runCommand(deployCmd, { silent: true, cwd: ctx.project.path, env: { CLOUDFLARE_ACCOUNT_ID: ctx.account.id, NODE_ENV: "production" }, - startText: `Deploying your application`, + startText: "Deploying your application", doneText: `${brandColor("deployed")} ${dim(`via \`${baseDeployCmd.join(' ')}\``)}`, }); From 88da1c777fbfa15a7504627b4036ecf7ce9e03f8 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Thu, 17 Aug 2023 00:50:04 +0100 Subject: [PATCH 20/32] run prettify --- packages/create-cloudflare/src/common.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 0c52c616dfce..897d16d6db9c 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -102,7 +102,13 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { ...baseDeployCmd, // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` ...(ctx.framework?.commitMessage && !insideGitRepo - ? ['--', `--commit-message="${ctx.framework.commitMessage.replaceAll('"', "\\\"")}"`] + ? [ + "--", + `--commit-message="${ctx.framework.commitMessage.replaceAll( + '"', + '\\"' + )}"`, + ] : []), ]; @@ -111,7 +117,9 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { cwd: ctx.project.path, env: { CLOUDFLARE_ACCOUNT_ID: ctx.account.id, NODE_ENV: "production" }, startText: "Deploying your application", - doneText: `${brandColor("deployed")} ${dim(`via \`${baseDeployCmd.join(' ')}\``)}`, + doneText: `${brandColor("deployed")} ${dim( + `via \`${baseDeployCmd.join(" ")}\`` + )}`, }); const deployedUrlRegex = /https:\/\/.+\.(pages|workers)\.dev/; From 56a3d0a9c01ccbf47d9df6083922303039a6255c Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Thu, 17 Aug 2023 13:19:52 +0100 Subject: [PATCH 21/32] add e2e for deployment commit message --- .../create-cloudflare/e2e-tests/pages.test.ts | 34 +++++++++++++++++++ packages/create-cloudflare/turbo.json | 3 ++ 2 files changed, 37 insertions(+) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 41c22d248a1e..8df90040a6b3 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -3,6 +3,7 @@ import { FrameworkMap } from "frameworks/index"; import { readJSON } from "helpers/files"; import { fetch } from "undici"; import { describe, expect, test, afterEach, beforeEach } from "vitest"; +import { version } from '../package.json'; import { deleteProject } from "../scripts/e2eCleanup"; import { keys, runC3, testProjectDir } from "./helpers"; import type { RunnerConfig } from "./helpers"; @@ -119,6 +120,9 @@ describe(`E2E: Web frameworks`, () => { body, `(${framework}) Deployed page (${projectUrl}) didn't contain expected string: "${expectResponseToContain}"` ).toContain(expectResponseToContain); + + const projectName = output.match(/Navigate to the new directory cd (.+)/)?.[1] ?? ''; + await testDeploymentCommitMessage(projectName, framework); }; // These are ordered based on speed and reliability for ease of debugging @@ -212,3 +216,33 @@ describe(`E2E: Web frameworks`, () => { await runCli("hono", { argv: ["--wrangler-defaults"] }); }); }); + +const testDeploymentCommitMessage = async (projectName: string, framework: string) => { + // Note: we cannot simply run git and check the result since the commit can be part of the + // deployment even without git, so instead we fetch the deployment info from the pages api + const response = await fetch( + `https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/pages/projects`, { + headers: { + Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, + }, + }); + + const result = (await response.json() as { + result: { + name: string; + latest_deployment?: { + deployment_trigger: { + metadata?: { + commit_message: string; + }; + }; + }; + }[]; + }).result; + + const projectLatestCommitMessage = result.find(project => project.name === projectName)?.latest_deployment?.deployment_trigger?.metadata?.commit_message; + expect(projectLatestCommitMessage).toMatch(/^Initialize web application via create-cloudflare CLI/); + expect(projectLatestCommitMessage).toContain(`C3 = create-cloudflare@${version}`); + expect(projectLatestCommitMessage).toContain(`project name = ${projectName}`); + expect(projectLatestCommitMessage).toContain(`framework = ${framework}`); +} diff --git a/packages/create-cloudflare/turbo.json b/packages/create-cloudflare/turbo.json index 5b9b41f5e820..f91f0099985e 100644 --- a/packages/create-cloudflare/turbo.json +++ b/packages/create-cloudflare/turbo.json @@ -5,6 +5,9 @@ "pipeline": { "build": { "env": ["VITEST", "TEST_PM"] + }, + "test:e2e:*": { + "env": ["CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_API_TOKEN"] } } } From c0a8e9ae8f065a5d564de1d54b11c904e0a6bb4a Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Thu, 17 Aug 2023 13:41:20 +0100 Subject: [PATCH 22/32] run prettify --- .../create-cloudflare/e2e-tests/pages.test.ts | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 8df90040a6b3..30dc8c3043f0 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -121,7 +121,8 @@ describe(`E2E: Web frameworks`, () => { `(${framework}) Deployed page (${projectUrl}) didn't contain expected string: "${expectResponseToContain}"` ).toContain(expectResponseToContain); - const projectName = output.match(/Navigate to the new directory cd (.+)/)?.[1] ?? ''; + const projectName = + output.match(/Navigate to the new directory cd (.+)/)?.[1] ?? ""; await testDeploymentCommitMessage(projectName, framework); }; @@ -217,32 +218,45 @@ describe(`E2E: Web frameworks`, () => { }); }); -const testDeploymentCommitMessage = async (projectName: string, framework: string) => { +const testDeploymentCommitMessage = async ( + projectName: string, + framework: string +) => { // Note: we cannot simply run git and check the result since the commit can be part of the // deployment even without git, so instead we fetch the deployment info from the pages api const response = await fetch( - `https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/pages/projects`, { - headers: { - Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, - }, - }); + `https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/pages/projects`, + { + headers: { + Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, + }, + } + ); - const result = (await response.json() as { - result: { - name: string; - latest_deployment?: { - deployment_trigger: { - metadata?: { - commit_message: string; + const result = ( + (await response.json()) as { + result: { + name: string; + latest_deployment?: { + deployment_trigger: { + metadata?: { + commit_message: string; + }; }; }; - }; - }[]; - }).result; + }[]; + } + ).result; - const projectLatestCommitMessage = result.find(project => project.name === projectName)?.latest_deployment?.deployment_trigger?.metadata?.commit_message; - expect(projectLatestCommitMessage).toMatch(/^Initialize web application via create-cloudflare CLI/); - expect(projectLatestCommitMessage).toContain(`C3 = create-cloudflare@${version}`); + const projectLatestCommitMessage = result.find( + (project) => project.name === projectName + )?.latest_deployment?.deployment_trigger?.metadata?.commit_message; + expect(projectLatestCommitMessage).toMatch( + /^Initialize web application via create-cloudflare CLI/ + ); + expect(projectLatestCommitMessage).toContain( + `C3 = create-cloudflare@${version}` + ); expect(projectLatestCommitMessage).toContain(`project name = ${projectName}`); expect(projectLatestCommitMessage).toContain(`framework = ${framework}`); -} +}; From 647f775345cdf80bd27b02f9538b1fb655ff4d89 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Thu, 17 Aug 2023 15:53:15 +0100 Subject: [PATCH 23/32] fix incorrectly gathering projectName --- packages/create-cloudflare/e2e-tests/pages.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 30dc8c3043f0..9503e8e20492 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -121,9 +121,7 @@ describe(`E2E: Web frameworks`, () => { `(${framework}) Deployed page (${projectUrl}) didn't contain expected string: "${expectResponseToContain}"` ).toContain(expectResponseToContain); - const projectName = - output.match(/Navigate to the new directory cd (.+)/)?.[1] ?? ""; - await testDeploymentCommitMessage(projectName, framework); + await testDeploymentCommitMessage(getName(framework), framework); }; // These are ordered based on speed and reliability for ease of debugging From 64a722650ad1437205b0a78de7b5281feefbad2a Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 16:06:25 +0100 Subject: [PATCH 24/32] remove checks failing because of commit message current limit --- packages/create-cloudflare/e2e-tests/pages.test.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 9503e8e20492..97f84c6f9336 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -252,9 +252,11 @@ const testDeploymentCommitMessage = async ( expect(projectLatestCommitMessage).toMatch( /^Initialize web application via create-cloudflare CLI/ ); - expect(projectLatestCommitMessage).toContain( - `C3 = create-cloudflare@${version}` - ); - expect(projectLatestCommitMessage).toContain(`project name = ${projectName}`); - expect(projectLatestCommitMessage).toContain(`framework = ${framework}`); + // TODO: add back checks the following when the commit message doesn't + // get truncated at 128 characters + // expect(projectLatestCommitMessage).toContain( + // `C3 = create-cloudflare@${version}` + // ); + // expect(projectLatestCommitMessage).toContain(`project name = ${projectName}`); + // expect(projectLatestCommitMessage).toContain(`framework = ${framework}`); }; From 62d0588069c444f857473af61575a81d5ab81535 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 18:24:17 +0100 Subject: [PATCH 25/32] update qwik's pages:deploy script --- packages/create-cloudflare/src/frameworks/qwik/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/frameworks/qwik/index.ts b/packages/create-cloudflare/src/frameworks/qwik/index.ts index cea477c140f3..c66bc9f7bad7 100644 --- a/packages/create-cloudflare/src/frameworks/qwik/index.ts +++ b/packages/create-cloudflare/src/frameworks/qwik/index.ts @@ -32,7 +32,7 @@ const config: FrameworkConfig = { displayName: "Qwik", packageScripts: { "pages:dev": `wrangler pages dev ${compatDateFlag()} -- ${npm} run dev`, - "pages:deploy": `${npm} run build && ${npm} run deploy`, + "pages:deploy": `${npm} run build && wrangler pages deploy ./dist`, }, }; export default config; From 1d785743594f9e2f7de47e2598917a43a8a254a6 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 18:31:04 +0100 Subject: [PATCH 26/32] don't test commit message for hono --- .../create-cloudflare/e2e-tests/pages.test.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 97f84c6f9336..223b692dfa83 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -15,6 +15,7 @@ Areas for future improvement: type FrameworkTestConfig = RunnerConfig & { expectResponseToContain: string; + testCommitMessage: boolean; }; describe(`E2E: Web frameworks`, () => { @@ -90,7 +91,10 @@ describe(`E2E: Web frameworks`, () => { return { output }; }; - const runCliWithDeploy = async (framework: string) => { + const runCliWithDeploy = async ( + framework: string, + testCommitMessage: boolean + ) => { const { argv, overrides, promptHandlers, expectResponseToContain } = frameworkTests[framework]; @@ -121,16 +125,20 @@ describe(`E2E: Web frameworks`, () => { `(${framework}) Deployed page (${projectUrl}) didn't contain expected string: "${expectResponseToContain}"` ).toContain(expectResponseToContain); - await testDeploymentCommitMessage(getName(framework), framework); + if (testCommitMessage) { + await testDeploymentCommitMessage(getName(framework), framework); + } }; // These are ordered based on speed and reliability for ease of debugging const frameworkTests: Record = { astro: { expectResponseToContain: "Hello, Astronaut!", + testCommitMessage: true, }, hono: { expectResponseToContain: "Hello Hono!", + testCommitMessage: false, }, qwik: { expectResponseToContain: "Welcome to Qwik", @@ -140,9 +148,11 @@ describe(`E2E: Web frameworks`, () => { input: [keys.enter], }, ], + testCommitMessage: true, }, remix: { expectResponseToContain: "Welcome to Remix", + testCommitMessage: true, }, next: { expectResponseToContain: "Create Next App", @@ -152,6 +162,7 @@ describe(`E2E: Web frameworks`, () => { input: ["y"], }, ], + testCommitMessage: true, }, nuxt: { expectResponseToContain: "Welcome to Nuxt!", @@ -160,9 +171,11 @@ describe(`E2E: Web frameworks`, () => { build: "NITRO_PRESET=cloudflare-pages nuxt build", }, }, + testCommitMessage: true, }, react: { expectResponseToContain: "React App", + testCommitMessage: true, }, solid: { expectResponseToContain: "Hello world", @@ -180,6 +193,7 @@ describe(`E2E: Web frameworks`, () => { input: [keys.enter], }, ], + testCommitMessage: true, }, svelte: { expectResponseToContain: "SvelteKit app", @@ -197,16 +211,18 @@ describe(`E2E: Web frameworks`, () => { input: [keys.enter], }, ], + testCommitMessage: true, }, vue: { expectResponseToContain: "Vite App", + testCommitMessage: true, }, }; test.concurrent.each(Object.keys(frameworkTests))( "%s", async (name) => { - await runCliWithDeploy(name); + await runCliWithDeploy(name, frameworkTests[name].testCommitMessage); }, { retry: 3 } ); From 23241a99c49a68af124147b5bb16352454fbe28b Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 21:57:27 +0100 Subject: [PATCH 27/32] make sure hono doesn't try to use --commit-message --- packages/create-cloudflare/src/common.ts | 4 +++- packages/create-cloudflare/src/pages.ts | 1 + packages/create-cloudflare/src/types.ts | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 897d16d6db9c..86f7d5ddf29c 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -324,7 +324,9 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { .map(({ key, value }) => ` ${key} = ${value}`) .join("\n")}\n`; - ctx.framework.commitMessage = `${header}\n\n${body}\n`; + if(ctx.type !== 'workers') { + ctx.framework.commitMessage = `${header}\n\n${body}\n`; + } return ctx.framework.commitMessage; }; diff --git a/packages/create-cloudflare/src/pages.ts b/packages/create-cloudflare/src/pages.ts index de88c48db3c3..7b379df10151 100644 --- a/packages/create-cloudflare/src/pages.ts +++ b/packages/create-cloudflare/src/pages.ts @@ -48,6 +48,7 @@ export const runPagesGenerator = async (args: C3Args) => { }, }, args, + type: frameworkConfig.type }; // Generate diff --git a/packages/create-cloudflare/src/types.ts b/packages/create-cloudflare/src/types.ts index 2d5dc30ce434..3be5cc9d3d60 100644 --- a/packages/create-cloudflare/src/types.ts +++ b/packages/create-cloudflare/src/types.ts @@ -35,6 +35,7 @@ export type PagesGeneratorContext = { name: string; path: string; }; + type?: 'pages'|'workers', }; type UpdaterPackageScript = (cmd: string) => string; From 78d6b62aad772f003196165e62a331c4cb52fb10 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 22:06:27 +0100 Subject: [PATCH 28/32] run prettify --- packages/create-cloudflare/src/common.ts | 2 +- packages/create-cloudflare/src/pages.ts | 2 +- packages/create-cloudflare/src/types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 86f7d5ddf29c..8aa0adf68a78 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -324,7 +324,7 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { .map(({ key, value }) => ` ${key} = ${value}`) .join("\n")}\n`; - if(ctx.type !== 'workers') { + if (ctx.type !== "workers") { ctx.framework.commitMessage = `${header}\n\n${body}\n`; } diff --git a/packages/create-cloudflare/src/pages.ts b/packages/create-cloudflare/src/pages.ts index 7b379df10151..3d546573299d 100644 --- a/packages/create-cloudflare/src/pages.ts +++ b/packages/create-cloudflare/src/pages.ts @@ -48,7 +48,7 @@ export const runPagesGenerator = async (args: C3Args) => { }, }, args, - type: frameworkConfig.type + type: frameworkConfig.type, }; // Generate diff --git a/packages/create-cloudflare/src/types.ts b/packages/create-cloudflare/src/types.ts index 3be5cc9d3d60..ef1974912e71 100644 --- a/packages/create-cloudflare/src/types.ts +++ b/packages/create-cloudflare/src/types.ts @@ -35,7 +35,7 @@ export type PagesGeneratorContext = { name: string; path: string; }; - type?: 'pages'|'workers', + type?: "pages" | "workers"; }; type UpdaterPackageScript = (cmd: string) => string; From d596029f50be11ed41aa54f5fc32e077fc13c6a8 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 21 Aug 2023 22:16:53 +0100 Subject: [PATCH 29/32] fix commitMessage generation on non-pages projects --- packages/create-cloudflare/src/common.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 8aa0adf68a78..a5d64a5a3db2 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -324,11 +324,13 @@ const createCommitMessage = async (ctx: PagesGeneratorContext) => { .map(({ key, value }) => ` ${key} = ${value}`) .join("\n")}\n`; + const commitMessage = `${header}\n\n${body}\n`; + if (ctx.type !== "workers") { - ctx.framework.commitMessage = `${header}\n\n${body}\n`; + ctx.framework.commitMessage = commitMessage; } - return ctx.framework.commitMessage; + return commitMessage; }; /** From 91c08b7811bb54a6933b1e24e039bba4e55c001d Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 22 Aug 2023 16:49:49 +0100 Subject: [PATCH 30/32] remove unused import --- packages/create-cloudflare/e2e-tests/pages.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/create-cloudflare/e2e-tests/pages.test.ts b/packages/create-cloudflare/e2e-tests/pages.test.ts index 223b692dfa83..db60c4a5de5d 100644 --- a/packages/create-cloudflare/e2e-tests/pages.test.ts +++ b/packages/create-cloudflare/e2e-tests/pages.test.ts @@ -3,7 +3,6 @@ import { FrameworkMap } from "frameworks/index"; import { readJSON } from "helpers/files"; import { fetch } from "undici"; import { describe, expect, test, afterEach, beforeEach } from "vitest"; -import { version } from '../package.json'; import { deleteProject } from "../scripts/e2eCleanup"; import { keys, runC3, testProjectDir } from "./helpers"; import type { RunnerConfig } from "./helpers"; From d1373e8c88318baf8c6f092d2060fb80e606284f Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 22 Aug 2023 17:24:39 +0100 Subject: [PATCH 31/32] include -- only for npm --- packages/create-cloudflare/src/common.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index a5d64a5a3db2..9f9a117d4a68 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -29,7 +29,7 @@ import { version } from "../package.json"; import { C3_DEFAULTS } from "./cli"; import type { C3Args, PagesGeneratorContext } from "types"; -const { npm } = detectPackageManager(); +const { name, npm } = detectPackageManager(); export const validateProjectDirectory = (relativePath: string) => { const path = resolve(relativePath); @@ -103,7 +103,7 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` ...(ctx.framework?.commitMessage && !insideGitRepo ? [ - "--", + ...(name === 'npm' ? ["--"] : []), `--commit-message="${ctx.framework.commitMessage.replaceAll( '"', '\\"' From 3f02a17b12bc6a125535ccae76b0ded791bfc8f8 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 22 Aug 2023 17:42:47 +0100 Subject: [PATCH 32/32] fix linting and formatting --- packages/create-cloudflare/src/common.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/create-cloudflare/src/common.ts b/packages/create-cloudflare/src/common.ts index 9f9a117d4a68..4f7ff425cd64 100644 --- a/packages/create-cloudflare/src/common.ts +++ b/packages/create-cloudflare/src/common.ts @@ -50,7 +50,7 @@ export const setupProjectDirectory = (args: C3Args) => { } const directory = dirname(path); - const name = basename(path); + const pathBasename = basename(path); // If the target is a nested directory, create the parent mkdirSync(directory, { recursive: true }); @@ -58,7 +58,7 @@ export const setupProjectDirectory = (args: C3Args) => { // Change to the parent directory chdir(directory); - return { name, path }; + return { name: pathBasename, path }; }; export const offerToDeploy = async (ctx: PagesGeneratorContext) => { @@ -103,7 +103,7 @@ export const runDeploy = async (ctx: PagesGeneratorContext) => { // Important: the following assumes that all framework deploy commands terminate with `wrangler pages deploy` ...(ctx.framework?.commitMessage && !insideGitRepo ? [ - ...(name === 'npm' ? ["--"] : []), + ...(name === "npm" ? ["--"] : []), `--commit-message="${ctx.framework.commitMessage.replaceAll( '"', '\\"' @@ -154,10 +154,12 @@ export const chooseAccount = async (ctx: PagesGeneratorContext) => { s.stop( `${brandColor("account")} ${dim("more than one account available")}` ); - const accountOptions = Object.entries(accounts).map(([name, id]) => ({ - label: name, - value: id, - })); + const accountOptions = Object.entries(accounts).map( + ([accountName, id]) => ({ + label: accountName, + value: id, + }) + ); accountId = await inputPrompt({ type: "select", @@ -168,7 +170,7 @@ export const chooseAccount = async (ctx: PagesGeneratorContext) => { }); } const accountName = Object.keys(accounts).find( - (name) => accounts[name] == accountId + (account) => accounts[account] == accountId ) as string; ctx.account = { id: accountId, name: accountName };