create-cloudflare
Version:
A CLI for creating and deploying new applications to Cloudflare.
112 lines (96 loc) • 2.98 kB
text/typescript
import { logRaw } from "@cloudflare/cli";
import { brandColor, dim } from "@cloudflare/cli/colors";
import { spinner } from "@cloudflare/cli/interactive";
import { runFrameworkGenerator } from "frameworks/index";
import { loadTemplateSnippets, transformFile } from "helpers/codemod";
import { detectPackageManager } from "helpers/packageManagers";
import { installPackages } from "helpers/packages";
import * as recast from "recast";
import type { TemplateConfig } from "../../src/templates";
import type { C3Context } from "types";
const { npm, name: pm } = detectPackageManager();
const generate = async (ctx: C3Context) => {
await runFrameworkGenerator(ctx, [
ctx.project.name,
"--template",
"angular-v17",
]);
logRaw(""); // newline
};
const configure = async (ctx: C3Context) => {
// Fix hoisting issues with pnpm, yarn and bun
if (pm === "pnpm" || pm === "yarn" || pm === "bun") {
const packages = [];
packages.push("nitropack");
packages.push("h3");
packages.push("@ngtools/webpack");
packages.push("@angular-devkit/build-angular");
await installPackages(packages, {
dev: true,
startText: `Installing ${packages.join(", ")}`,
doneText: `${brandColor("installed")} ${dim(`via \`${npm} install\``)}`,
});
}
updateViteConfig(ctx);
};
const updateViteConfig = (ctx: C3Context) => {
const b = recast.types.builders;
const s = spinner();
const configFile = "vite.config.ts";
s.start(`Updating \`${configFile}\``);
const snippets = loadTemplateSnippets(ctx);
transformFile(configFile, {
visitProgram(n) {
const lastImportIndex = n.node.body.findLastIndex(
(t) => t.type === "ImportDeclaration",
);
const lastImport = n.get("body", lastImportIndex);
lastImport.insertAfter(...snippets.devBindingsModuleTs);
return this.traverse(n);
},
visitCallExpression(n) {
const callee = n.node.callee as recast.types.namedTypes.Identifier;
if (callee.name === "analog") {
const pluginArguments = b.objectProperty(
b.identifier("nitro"),
b.objectExpression([
b.objectProperty(
b.identifier("preset"),
b.stringLiteral("cloudflare-pages"),
),
b.objectProperty(
b.identifier("modules"),
b.arrayExpression([b.identifier("devBindingsModule")]),
),
]),
);
n.node.arguments = [b.objectExpression([pluginArguments])];
}
return this.traverse(n);
},
});
s.stop(`${brandColor(`updated`)} ${dim(`\`${configFile}\``)}`);
};
const config: TemplateConfig = {
configVersion: 1,
id: "analog",
frameworkCli: "create-analog",
platform: "pages",
displayName: "Analog",
copyFiles: {
path: "./templates",
},
generate,
configure,
transformPackageJson: async () => ({
scripts: {
preview: `${npm} run build && wrangler pages dev`,
deploy: `${npm} run build && wrangler pages deploy`,
"cf-typegen": `wrangler types`,
},
}),
devScript: "dev",
deployScript: "deploy",
previewScript: "preview",
};
export default config;