convex
Version:
Client for the Convex Cloud
232 lines (231 loc) • 10.4 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var deploymentSelect_exports = {};
__export(deploymentSelect_exports, {
deploymentSelect: () => deploymentSelect,
saveSelectedDeployment: () => saveSelectedDeployment
});
module.exports = __toCommonJS(deploymentSelect_exports);
var import_extra_typings = require("@commander-js/extra-typings");
var import_context = require("../bundler/context.js");
var import_api = require("./lib/api.js");
var import_log = require("../bundler/log.js");
var import_announceDeploymentTarget = require("./lib/announceDeploymentTarget.js");
var import_deploymentSelection = require("./lib/deploymentSelection.js");
var import_deploymentSelector = require("./lib/deploymentSelector.js");
var import_configure = require("./configure.js");
var import_deploy2 = require("./lib/deploy2.js");
var import_filePaths = require("./lib/localDeployment/filePaths.js");
var import_projectMismatch = require("./lib/localDeployment/projectMismatch.js");
var import_bigBrain = require("./lib/localDeployment/bigBrain.js");
var import_prompts = require("./lib/utils/prompts.js");
var import_deploymentCreate = require("./deploymentCreate.js");
var import_chalk = require("chalk");
var import_log2 = require("../bundler/log.js");
const deploymentSelect = new import_extra_typings.Command("select").summary("Select the deployment to use when running commands").description(
[
"Select the deployment to use when running commands.",
"",
"The deployment will be used by all `npx convex` commands, except `npx convex deploy`. You can also run individual commands on another deployment by using the --deployment flag on that command.",
"",
"\u2022 Select your personal cloud dev deployment in the current project: `npx convex deployment select dev`",
"\u2022 Select your local deployment: `npx convex deployment select local`",
"\u2022 Select a deployment in the same project by its reference: `npx convex deployment select dev/james`",
"\u2022 Select a deployment in another project in the same team: `npx convex deployment select some-project:dev/james`",
"\u2022 Select a deployment in a particular team/project: `npx convex deployment select some-team:some-project:dev/james`"
].join("\n")
).argument("<deployment>", "The deployment to use").allowExcessArguments(false).action(async (selector) => {
const ctx = await (0, import_context.oneoffContext)({
url: void 0,
adminKey: void 0,
envFile: void 0
});
const currentSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, {});
const parsed = (0, import_deploymentSelector.parseDeploymentSelector)(selector);
const isLocalSelector = isLocalDeploymentSelector(parsed);
if (currentSelection.kind === "chooseProject" && parsed.kind !== "inTeamProject" && parsed.kind !== "deploymentName" && !isLocalSelector) {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `No project configured. Run \`npx convex dev\` to set up a project first, or use a full selector like 'my-team:my-project:dev/james' or 'happy-capybara-123'.`
});
}
if (isLocalSelector) {
await handleLocalSelect(ctx, selector, parsed, currentSelection);
return;
}
const newSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, {
url: void 0,
adminKey: void 0,
envFile: void 0,
deployment: selector
});
const deployment = await saveSelectedDeployment(
ctx,
selector,
newSelection,
(0, import_deploymentSelection.deploymentNameFromSelection)(currentSelection)
);
(0, import_log.logFinishedStep)("Selected deployment:");
(0, import_announceDeploymentTarget.announceDeploymentTarget)(null, deployment);
});
function isLocalDeploymentSelector(parsed) {
return (parsed.kind === "inCurrentProject" || parsed.kind === "inProject" || parsed.kind === "inTeamProject") && parsed.selector.kind === "local";
}
async function handleLocalSelect(ctx, selector, parsed, currentSelection) {
const existing = (0, import_filePaths.loadProjectLocalConfig)(ctx);
if (existing === null) {
if (!process.stdin.isTTY) {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `No local deployment found. Run ${import_chalk.chalkStderr.bold("npx convex deployment create local")} to create one.`
});
}
if (currentSelection.kind === "chooseProject" && parsed.kind !== "inTeamProject") {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `No project configured. Run \`npx convex dev\` to set up a project first.`
});
}
if (parsed.kind === "inProject") {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `No local deployment found. To create one in ${import_chalk.chalkStderr.bold(parsed.projectSlug)}, run ${import_chalk.chalkStderr.bold(`npx convex deployment create local --project ${parsed.projectSlug}`)}, or use a fully qualified selector like ${import_chalk.chalkStderr.bold(`my-team:${parsed.projectSlug}:local`)}.`
});
}
const wantsToCreate = await (0, import_prompts.promptYesNo)(ctx, {
message: "No local deployment found. Create one now?",
default: true
});
if (!wantsToCreate) {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `No local deployment found. Run ${import_chalk.chalkStderr.bold("npx convex deployment create local")} to create one.`
});
}
const teamAndProject = teamAndProjectFromParsed(parsed);
await (0, import_deploymentCreate.createLocalDeployment)(ctx, currentSelection, true, teamAndProject);
return;
}
const target = await (0, import_projectMismatch.targetProjectForLocalSelector)(
ctx,
parsed,
currentSelection
);
let resolvedDeploymentName = existing.deploymentName;
if (target !== null) {
const match = (0, import_projectMismatch.checkLocalConfigMatchesProject)(ctx, existing.config, target);
if (match === "mismatch") {
const oldProjectId = existing.config.cloudProjectId;
const oldProject = await (0, import_projectMismatch.getCloudProjectSlugsBestEffort)(
ctx,
oldProjectId
);
const oldProjectLabel = oldProject !== null ? `project ${import_chalk.chalkStderr.bold(`${oldProject.teamSlug}:${oldProject.slug}`)}` : `an unknown cloud project (ID ${oldProjectId})`;
(0, import_log2.logWarning)(
import_chalk.chalkStderr.yellow(
`\u26A0\uFE0F This local deployment was previously in ${oldProjectLabel}. Moving it to project ${import_chalk.chalkStderr.bold(`${target.teamSlug}:${target.slug}`)}.`
)
);
await (0, import_projectMismatch.pauseLocalDeploymentBestEffort)(ctx, oldProject);
const { deploymentName: newDeploymentName } = await (0, import_bigBrain.bigBrainStart)(ctx, {
port: existing.config.ports.cloud,
teamSlug: target.teamSlug,
projectSlug: target.slug,
instanceName: null
});
(0, import_filePaths.saveDeploymentConfig)(ctx, "local", newDeploymentName, {
...existing.config,
cloudProjectId: target.id
});
resolvedDeploymentName = newDeploymentName;
} else if (match === "skip") {
(0, import_filePaths.saveDeploymentConfig)(ctx, "local", existing.deploymentName, {
...existing.config,
cloudProjectId: target.id
});
}
}
const newSelection = {
kind: "deploymentWithinProject",
targetProject: {
kind: "deploymentName",
deploymentName: resolvedDeploymentName,
deploymentType: "local"
},
selectionWithinProject: {
kind: "deploymentSelector",
selector
}
};
await saveSelectedDeployment(
ctx,
selector,
newSelection,
(0, import_deploymentSelection.deploymentNameFromSelection)(currentSelection)
);
}
function teamAndProjectFromParsed(parsed) {
if (parsed.kind === "inTeamProject") {
return { teamSlug: parsed.teamSlug, projectSlug: parsed.projectSlug };
}
return null;
}
async function saveSelectedDeployment(ctx, selector, selection, previousDeploymentName) {
const deployment = await (0, import_api.loadSelectedDeploymentCredentials)(ctx, selection, {
ensureLocalRunning: false
});
if (deployment.deploymentFields === null) {
return ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: null,
errForSentry: `Unexpected selection in select: ${JSON.stringify(deployment)}`
});
}
if (deployment.deploymentFields.deploymentType === "prod") {
return await ctx.crash({
exitCode: 1,
errorType: "fatal",
printedMessage: `Selecting a production deployment is unsupported. To run commands on a production deployment, pass the ${import_chalk.chalkStderr.bold(`--deployment ${selector}`)} flag to each command.`
});
}
const { convexSiteUrl: siteUrl } = deployment.deploymentFields.deploymentType === "local" ? { convexSiteUrl: null } : await (0, import_deploy2.fetchDeploymentCanonicalUrls)(ctx, {
adminKey: deployment.adminKey,
deploymentUrl: deployment.url
});
await (0, import_configure.updateEnvAndConfigForDeploymentSelection)(
ctx,
{
url: deployment.url,
siteUrl,
deploymentName: deployment.deploymentFields.deploymentName,
teamSlug: deployment.deploymentFields.teamSlug,
projectSlug: deployment.deploymentFields.projectSlug,
deploymentType: deployment.deploymentFields.deploymentType
},
previousDeploymentName
);
return deployment;
}
//# sourceMappingURL=deploymentSelect.js.map