convex
Version:
Client for the Convex Cloud
174 lines (173 loc) • 5.35 kB
JavaScript
;
import chalk from "chalk";
import boxen from "boxen";
import {
pullConfig,
writeProjectConfig,
configFilepath,
readProjectConfig
} from "./config.js";
import {
fatalServerErr,
functionsDir,
validateOrSelectTeam,
bigBrainAPI,
loadPackageJson
} from "./utils.js";
import inquirer from "inquirer";
import ora from "ora";
import path from "path";
import { doCodegen, doInitCodegen } from "./codegen";
const cwd = path.basename(process.cwd());
export async function init(ctx, project, team) {
{
const configPath = await configFilepath(ctx);
if (ctx.fs.exists(configPath)) {
console.error(
chalk.green(`Found existing project config "${configPath}"`)
);
return;
}
const shouldContinue = await optins(ctx);
if (!shouldContinue) {
return await ctx.fatalError(1, void 0);
}
const selectedTeam = await validateOrSelectTeam(
ctx,
team,
"Choose which team to create this project in:"
);
let projectName = project || cwd;
if (process.stdin.isTTY && !project) {
projectName = (await inquirer.prompt([
{
type: "input",
name: "project",
message: "Enter a name for your project:",
default: cwd
}
])).project;
}
const spinner = ctx.spinner = ora({
text: "Creating new Convex project...\n",
stream: process.stdout
}).start();
let projectSlug, teamSlug, prodUrl, adminKey, projectsRemaining, projectConfig, modules;
try {
({ projectSlug, teamSlug, prodUrl, adminKey, projectsRemaining } = await create_project(ctx, selectedTeam, projectName));
({ projectConfig, modules } = await pullConfig(
ctx,
projectSlug,
teamSlug,
prodUrl,
adminKey
));
} catch (err) {
spinner.fail("Unable to create project.");
return await fatalServerErr(ctx, err);
}
spinner.succeed(`Successfully created project!`);
console.log(
chalk.green(
`Your account now has ${projectsRemaining} projects remaining.`
)
);
if (modules.length > 0) {
console.error(chalk.red("Error: Unexpected modules in new project"));
return await ctx.fatalError(1, void 0);
}
const packages = await loadPackageJson(ctx);
const isCreateReactApp = !!packages.filter(
({ name }) => name === "react-scripts"
).length;
if (isCreateReactApp) {
projectConfig.functions = `src/${projectConfig.functions}`;
}
await writeProjectConfig(ctx, projectConfig);
await doInitCodegen(
ctx,
functionsDir(configPath, projectConfig),
true
);
{
const { projectConfig: projectConfig2, configPath: configPath2 } = await readProjectConfig(ctx);
await doCodegen({
ctx,
projectConfig: projectConfig2,
configPath: configPath2,
deploymentType: "dev",
typeCheckMode: "disable",
quiet: true
});
}
const boxedText = chalk.white("Project ready:\n") + chalk.whiteBright.bold(projectName) + "\n" + chalk.whiteBright(projectConfig.project);
const boxenOptions = {
padding: 1,
margin: 1,
borderColor: "green",
backgroundColor: "#555555"
};
console.log(boxen(boxedText, boxenOptions));
console.log(
chalk.green("Write your Convex functions in"),
chalk.green.bold(functionsDir(configPath, projectConfig))
);
console.log("Configuration settings written to", chalk.bold(configPath));
console.log(chalk.bold("\nWe would love feedback at either:"));
console.log("- https://convex.dev/community");
console.log("- support@convex.dev");
console.log(
"\nSee documentation at",
chalk.bold("https://docs.convex.dev"),
"for next steps."
);
}
}
async function create_project(ctx, team, projectName) {
const provisioningArgs = {
team,
backendVersionOverride: process.env.CONVEX_BACKEND_VERSION_OVERRIDE,
projectName
};
const data = await bigBrainAPI(
ctx,
"POST",
"create_project",
provisioningArgs
);
const projectSlug = data.projectSlug;
const teamSlug = data.teamSlug;
const prodUrl = data.prodUrl;
const adminKey = data.adminKey;
const projectsRemaining = data.projectsRemaining;
if (projectSlug === void 0 || teamSlug == void 0 || prodUrl === void 0 || adminKey === void 0 || projectsRemaining === void 0) {
throw new Error(
"Unknown error during provisioning: " + JSON.stringify(data)
);
}
return { projectSlug, teamSlug, prodUrl, adminKey, projectsRemaining };
}
export async function optins(ctx) {
const data = await bigBrainAPI(ctx, "POST", "check_opt_ins", {});
if (data.optInsToAccept.length == 0) {
return true;
}
for (const optInToAccept of data.optInsToAccept) {
const confirmed = (await inquirer.prompt([
{
type: "confirm",
name: "confirmed",
message: optInToAccept.message
}
])).confirmed;
if (!confirmed) {
console.log("Please accept the Terms of Service to use Convex.");
return Promise.resolve(false);
}
}
const optInsAccepted = data.optInsToAccept.map((o) => o.optIn);
const args = { optInsAccepted };
await bigBrainAPI(ctx, "POST", "accept_opt_ins", args);
return true;
}
//# sourceMappingURL=init.js.map