@prisma/cli-init
Version:
Init CLI for Prisma
1,487 lines (1,418 loc) • 43.7 kB
JavaScript
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
import {
__export
} from "./chunk-YX4UTTNJ.js";
// src/platform/_lib/utils.ts
import internals2 from "@prisma/internals";
import { bold, green } from "kleur/colors";
// src/platform/_lib/cli/parameters.ts
import internals from "@prisma/internals";
var getRequiredParameter = (args, names, environmentVariable) => {
const value = getOptionalParameter(args, names, environmentVariable);
if (value === void 0)
return new Error(`Missing ${names.join(" or ")} parameter`);
return value;
};
function argOrThrow(argv, spec) {
const args = internals.arg(argv, spec);
if (internals.isError(args))
throw args;
return args;
}
var getRequiredParameterOrThrow = (args, names, environmentVariable) => {
const value = getRequiredParameter(args, names, environmentVariable);
if (value instanceof Error)
throw new Error(`Missing ${names.join(" or ")} parameter`);
return value;
};
var getOptionalParameter = (args, names, environmentVariable) => {
const entry = Object.entries(args).find(([key]) => names.includes(key));
if (!entry) {
if (environmentVariable) {
const value = process.env[environmentVariable];
if (value) {
return value;
}
}
}
return entry?.[1] ?? void 0;
};
// src/platform/_lib/credentials.ts
import fs2 from "fs-extra";
import path from "path";
import XdgAppPaths from "xdg-app-paths";
// src/platform/_lib/jsonFile.ts
import fs from "fs-extra";
var parse = (buffer, { beforeParse, reviver } = {}) => {
let data = new TextDecoder().decode(buffer);
if (typeof beforeParse === "function") {
data = beforeParse(data);
}
return JSON.parse(data, reviver);
};
var loadJsonFile = async (filePath, options) => {
const buffer = await fs.readFile(filePath);
return parse(buffer, options);
};
// src/platform/_lib/prelude.ts
var unknownToError = (unknown) => {
if (unknown instanceof Error)
return unknown;
return new Error(`Unknown error: ${unknown}`);
};
var id = (value) => value;
var isObject = (obj) => {
return obj !== null && typeof obj === "object" && !Array.isArray(obj);
};
var tryCatch = (fn, catcher) => {
try {
return fn();
} catch (e) {
return catcher ? catcher(unknownToError(e)) : unknownToError(e);
}
};
// src/platform/_lib/credentials.ts
var credentialsFileDirectoryPath = new XdgAppPaths("prisma-platform-cli").config();
var credentialsFilePath = path.join(credentialsFileDirectoryPath, "auth.json");
var parseCredentials = (data) => {
if (typeof data !== "object" || data === null)
throw new Error("Invalid credentials");
if (!("token" in data) || typeof data["token"] !== "string")
throw new Error("Invalid credentials");
return data;
};
var credentialsFile = {
path: credentialsFilePath,
save: async (data) => fs2.mkdirp(credentialsFileDirectoryPath).then(() => fs2.writeJSON(credentialsFilePath, data)).catch(unknownToError),
load: async () => fs2.pathExists(credentialsFilePath).then((exists) => exists ? loadJsonFile(credentialsFilePath).then(parseCredentials) : null).catch(unknownToError),
delete: async () => fs2.pathExists(credentialsFilePath).then((exists) => exists ? fs2.remove(credentialsFilePath) : void 0).then(() => null).catch(unknownToError)
};
// src/platform/_lib/utils.ts
var platformParameters = {
global: {
// TODO Remove this from global once we have a way for parents to strip out flags upon parsing.
"--token": String,
"--json": Boolean
},
workspace: {
"--token": String,
"--workspace": String,
"--json": Boolean,
"-w": "--workspace"
},
project: {
"--token": String,
"--project": String,
"-p": "--project"
},
environment: {
"--token": String,
"--environment": String,
"-e": "--environment"
},
serviceToken: {
"--token": String,
"--serviceToken": String,
"-s": "--serviceToken"
},
apikey: {
"--token": String,
"--apikey": String
}
};
var ErrorPlatformUnauthorized = new Error(
`No platform credentials found. Run ${green(internals2.getCommandWithExecutor("prisma platform auth login --early-access"))} first. Alternatively you can provide a token via the \`--token\` or \`-t\` parameters, or set the 'PRISMA_TOKEN' environment variable with a token.`
// prettier-ignore
);
var getTokenOrThrow = async (args) => {
const token = getOptionalParameter(args, ["--token", "-t"], "PRISMA_TOKEN");
if (token)
return token;
const credentials = await credentialsFile.load();
if (internals2.isError(credentials))
throw credentials;
if (!credentials)
throw ErrorPlatformUnauthorized;
return credentials.token;
};
var accelerateConnectionStringUrl = "prisma://accelerate.prisma-data.net";
var generateConnectionString = (apiKey) => {
const url = new URL(accelerateConnectionStringUrl);
url.searchParams.set("api_key", apiKey);
return bold(url.href);
};
var poll = async (fn, until, waitMs, timeoutMs, message) => {
const endTime = (/* @__PURE__ */ new Date()).getMilliseconds() + timeoutMs;
const wait = () => new Promise((resolve) => {
setTimeout(resolve, waitMs);
});
let result = await fn();
while (!until(result)) {
const waitTime = (/* @__PURE__ */ new Date()).getMilliseconds() + waitMs;
if (waitTime > endTime) {
throw new Error(`polling timed out after ${timeoutMs}ms`);
}
if (message)
console.log(message);
result = await wait().then(fn);
}
if (internals2.isError(result))
throw result;
return result;
};
var printPpgInitOutput = ({
databaseUrl,
workspaceId,
projectId,
environmentId,
isExistingPrismaProject = false
}) => {
const newPrismaProjectOutput = `
We created an initial ${green("schema.prisma")} file and a ${green(".env")} file with your ${green(
"DATABASE_URL"
)} environment variable already set.
${bold("--- Next steps ---")}
Go to ${internals2.link("https://pris.ly/ppg-init")} for detailed instructions.
${bold("1. Define your database schema")}
Open the ${green("schema.prisma")} file and define your first models. Check the docs if you need inspiration: ${internals2.link(
"https://pris.ly/ppg-init"
)}.
${bold("2. Apply migrations")}
Run the following command to create and apply a migration:
${green("npx prisma migrate dev --name init")}
${bold(`3. Manage your data`)}
View and edit your data locally by running this command:
${green("npx prisma studio")}
...or online in Console:
${internals2.link(`https://console.prisma.io/${workspaceId}/${projectId}/${environmentId}/studio`)}
${bold(`4. Send queries from your app`)}
To access your database from a JavaScript/TypeScript app, you need to use Prisma ORM. Go here for step-by-step instructions: ${internals2.link(
"https://pris.ly/ppg-init"
)}
`;
const existingPrismaProjectOutput = `
We found an existing ${green("schema.prisma")} file in your current project directory.
${bold("--- Database URL ---")}
Connect Prisma ORM to your Prisma Postgres database with this URL:
${green(databaseUrl)}
${bold("--- Next steps ---")}
Go to ${internals2.link("https://pris.ly/ppg-init")} for detailed instructions.
${bold("1. Install and use the Prisma Accelerate extension")}
Prisma Postgres requires the Prisma Accelerate extension for querying. If you haven't already installed it, install it in your project:
${green("npm install @prisma/extension-accelerate")}
...and add it to your Prisma Client instance:
${green('import { withAccelerate } from "@prisma/extension-accelerate"')}
${green("const prisma = new PrismaClient().$extends(withAccelerate())")}
${bold("2. Apply migrations")}
Run the following command to create and apply a migration:
${green("npx prisma migrate dev")}
${bold(`3. Manage your data`)}
View and edit your data locally by running this command:
${green("npx prisma studio")}
...or online in Console:
${internals2.link(`https://console.prisma.io/${workspaceId}/${projectId}/${environmentId}/studio`)}
${bold(`4. Send queries from your app`)}
If you already have an existing app with Prisma ORM, you can now run it and it will send queries against your newly created Prisma Postgres instance.
${bold(`5. Learn more`)}
For more info, visit the Prisma Postgres docs: ${internals2.link("https://pris.ly/ppg-docs")}
`;
return isExistingPrismaProject ? existingPrismaProjectOutput : newPrismaProjectOutput;
};
// src/platform/accelerate/_.ts
var __exports = {};
__export(__exports, {
$: () => $,
Disable: () => Disable,
Enable: () => Enable
});
// src/platform/_lib/cli/dispatchToSubCommand.ts
import internals3 from "@prisma/internals";
var { HelpError, link } = internals3;
var dispatchToSubCommand = async (commands, argv, config) => {
const commandName = argv[0];
if (!commandName)
return new HelpError(`Unknown command.`);
const command = commands[commandName];
if (!command)
return new HelpError(`Unknown command or parameter "${commandName}"`);
const hasHelpFlag = Boolean(argv.find((it) => ["-h", "--help"].includes(it)));
if (hasHelpFlag)
return `Help output for this command will be available soon. In the meantime, visit ${link("https://pris.ly/cli/platform-docs")} for more information.`;
const result = await command.parse(argv.slice(1), config);
return result;
};
// src/platform/_lib/cli/namespace.ts
var createNamespace = () => {
return class $7 {
constructor(commands) {
this.commands = commands;
}
static new(commands) {
return new $7(commands);
}
async parse(argv, config) {
return await dispatchToSubCommand(this.commands, argv, config);
}
};
};
// src/platform/accelerate/$.ts
var $ = createNamespace();
// src/platform/_lib/messages.ts
import internals4 from "@prisma/internals";
import { bold as bold2, dim, green as green2, white } from "kleur/colors";
var table = (object, renderersInput) => {
const renderers = {
key: renderersInput.key ?? dim,
// eslint-disable-next-line
values: internals4.mapObjectValues(
renderersInput.values ?? {},
(_) => _ === true ? id : _
)
};
return internals4.formatTable(
Object.entries(renderers.values).map(([propertyName, renderer]) => {
const valueRendered = renderer(object[propertyName]);
if (valueRendered === null)
return null;
return [renderers.key(String(propertyName)), valueRendered];
}).filter(Boolean)
);
};
var successMessage = (message) => `${green2("Success!")} ${message}`;
var messages = {
resourceCreated: (resource) => successMessage(`${resource.__typename} ${resource.displayName} - ${resource.id} created.`),
resourceDeleted: (resource) => successMessage(`${resource.__typename} ${resource.displayName} - ${resource.id} deleted.`),
resource: (resource, renderers) => {
return messages.table(resource, {
values: {
displayName: (_) => white(bold2(_)),
id: true,
createdAt: (_) => _ ? Intl.DateTimeFormat().format(new Date(_)) : null,
...renderers
}
});
},
resourceList: (records) => {
if (records.length === 0)
return messages.info("No records found.");
return records.map((record) => messages.resource(record)).join("\n\n\n");
},
info: (message) => message,
sections: (sections) => sections.join("\n\n"),
table,
success: successMessage
};
// src/platform/_lib/pdp.ts
import fetch, { Headers } from "node-fetch";
// src/platform/_lib/userAgent.ts
import Debug from "@prisma/debug";
import internals5 from "@prisma/internals";
import * as Checkpoint from "checkpoint-client";
// package.json
var version = "0.4.1";
// src/platform/_lib/userAgent.ts
var debug = Debug("prisma:cli:platform:_lib:userAgent");
var getUserAgent = async () => {
const signature = await Checkpoint.getSignature().catch(unknownToError);
if (internals5.isError(signature))
debug(`await checkpoint.getSignature() failed silently with ${signature.message}`);
const signatureString = internals5.isError(signature) ? "unknown" : signature;
return `prisma-cli-init/${version} (Signature: ${signatureString})`;
};
// src/platform/_lib/pdp.ts
var platformAPIEndpoint = new URL("https://console.prisma.io/api");
var consoleUrl = new URL("https://console.prisma.io");
var requestOrThrow = async (params) => {
const userAgent = await getUserAgent();
const method = "POST";
const headers = new Headers({
"Content-Type": "application/json",
Authorization: `Bearer ${params.token}`,
// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
"User-Agent": userAgent
});
const body = JSON.stringify(params.body);
const response = await fetch(platformAPIEndpoint.href, { method, headers, body });
const text = await response.text();
if (response.status >= 400)
throw new Error(text);
const json = JSON.parse(text);
if (json.error)
throw new Error(`Error from PDP Platform API: ${text}`);
const error = Object.values(json.data).filter(
(rootFieldValue) => typeof rootFieldValue === "object" && rootFieldValue !== null && rootFieldValue["__typename"]?.startsWith("Error")
)[0];
if (error)
throw errorFromPlatformError({ message: "<message not selected from server>", ...error });
return json.data;
};
var errorFromPlatformError = (error) => {
return new Error(error.message);
};
// src/platform/accelerate/disable.ts
var Disable = class _Disable {
static new() {
return new _Disable();
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.environment
});
const token = await getTokenOrThrow(args);
const environmentId = getRequiredParameterOrThrow(args, ["--environment", "-e"]);
await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
mutation ($input: MutationAccelerateDisableInput!) {
accelerateDisable(input: $input) {
__typename
... on Error {
message
}
}
}
`
),
variables: {
input: { environmentId }
}
}
});
return messages.success(
`Accelerate disabled. Prisma clients connected to ${environmentId} will not be able to send queries through Accelerate.`
);
}
};
// src/platform/accelerate/enable.ts
import internals6 from "@prisma/internals";
var Enable = class _Enable {
static new() {
return new _Enable();
}
async parse(argv, _config) {
const args = internals6.arg(argv, {
...platformParameters.environment,
"--url": String,
// TODO rename to "serviceToken" in a future release.
"--apikey": Boolean,
"--region": String
});
if (internals6.isError(args))
return args;
const token = await getTokenOrThrow(args);
const environmentId = getRequiredParameterOrThrow(args, ["--environment", "-e"]);
const connectionString = getRequiredParameterOrThrow(args, ["--url"]);
const withServiceToken = getOptionalParameter(args, ["--apikey"]) ?? false;
const regionId = getOptionalParameter(args, ["--region"]);
const { databaseLinkCreate } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
mutation ($input: MutationDatabaseLinkCreateInput!) {
databaseLinkCreate(input: $input) {
__typename
... on Error {
message
}
... on DatabaseLink {
id
}
}
}
`
),
variables: {
input: {
environmentId,
connectionString,
...regionId && { regionId }
}
}
}
});
const { serviceTokenCreate } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
mutation (
$accelerateEnableInput: MutationAccelerateEnableInput!
$serviceTokenCreateInput: MutationServiceTokenCreateInput!
$withServiceToken: Boolean!
) {
accelerateEnable(input: $accelerateEnableInput) {
__typename
... on Error {
message
}
}
serviceTokenCreate(input: $serviceTokenCreateInput) @include(if: $withServiceToken) {
__typename
... on Error {
message
}
... on ServiceTokenWithValue {
value
}
}
}
`
),
variables: {
withServiceToken,
accelerateEnableInput: { databaseLinkId: databaseLinkCreate.id },
serviceTokenCreateInput: { environmentId }
}
}
});
const gettingStartedUrl = internals6.link("https://pris.ly/d/accelerate-getting-started");
if (serviceTokenCreate) {
return messages.success(
`Accelerate enabled. Use this Accelerate connection string to authenticate requests:
${generateConnectionString(serviceTokenCreate.value)}
For more information, check out the Getting started guide here: ${gettingStartedUrl}`
);
} else {
return messages.success(
`Accelerate enabled. Use your secure API key in your Accelerate connection string to authenticate requests.
For more information, check out the Getting started guide here: ${gettingStartedUrl}`
);
}
}
};
// src/platform/auth/_.ts
var __exports2 = {};
__export(__exports2, {
$: () => $2,
Login: () => Login,
Logout: () => Logout,
Show: () => Show,
loginOrSignup: () => loginOrSignup
});
// src/platform/auth/$.ts
var $2 = createNamespace();
// src/platform/auth/login.ts
import { select } from "@inquirer/prompts";
import Debug2 from "@prisma/debug";
import internals7 from "@prisma/internals";
import { listen } from "async-listen";
import http from "http";
import { green as green3 } from "kleur/colors";
import open from "open";
var debug2 = Debug2("prisma:cli:platform:login");
var Login = class _Login {
static new() {
return new _Login();
}
async parse(argv, _config) {
const args = internals7.arg(argv, {
// internal optimize flag to track signup attribution
"--optimize": Boolean
});
if (internals7.isError(args))
return args;
if (args["--optimize"]) {
console.warn("The '--optimize' flag is deprecated. Use API keys instead.");
}
const credentials = await credentialsFile.load();
if (internals7.isError(credentials))
throw credentials;
if (credentials)
return `Already authenticated. Run ${green3(internals7.getCommandWithExecutor("prisma platform auth show --early-access"))} to see the current user.`;
console.info("Authenticating to Prisma Platform CLI via browser.\n");
const server = http.createServer();
const randomPort = 0;
const redirectUrl = await listen(server, randomPort, "127.0.0.1");
const loginUrl = await createLoginUrl({ connection: "github", redirectTo: redirectUrl.href });
console.info("Visit the following URL in your browser to authenticate:");
console.info(internals7.link(loginUrl.href));
const callbackResult = await Promise.all([
new Promise((resolve, reject) => {
server.once("request", (req, res) => {
server.close();
res.setHeader("connection", "close");
const searchParams = new URL(req.url || "/", "http://localhost").searchParams;
const token = searchParams.get("token") ?? "";
const error = searchParams.get("error");
const location = getBaseAuthUrl();
if (error) {
location.pathname += "/error";
location.searchParams.set("error", error);
reject(new Error(error));
} else {
const user = decodeUser(searchParams.get("user") ?? "");
if (user) {
searchParams.delete("token");
searchParams.delete("user");
location.pathname += "/success";
const nextSearchParams = new URLSearchParams({
...Object.fromEntries(searchParams.entries()),
email: user.email
});
location.search = nextSearchParams.toString();
resolve({ token, user });
} else {
location.pathname += "/error";
location.searchParams.set("error", "Invalid user");
reject(new Error("Invalid user"));
}
}
res.statusCode = 302;
res.setHeader("location", location.href);
res.end();
});
server.once("error", reject);
}),
open(loginUrl.href)
]).then((results) => results[0]).catch(unknownToError);
if (internals7.isError(callbackResult))
throw new Error(`Authentication failed: ${callbackResult.message}`);
{
const writeResult = await credentialsFile.save({ token: callbackResult.token });
if (internals7.isError(writeResult))
throw new Error("Writing credentials to disk failed", { cause: writeResult });
}
return successMessage(`Authentication successful for ${callbackResult.user.email}`);
}
};
var getBaseAuthUrl = () => new URL("/auth/cli", consoleUrl);
var createLoginUrl = async (params) => {
const userAgent = await getUserAgent();
const state = {
client: userAgent,
...params
};
const stateEncoded = encodeState(state);
const url = getBaseAuthUrl();
url.searchParams.set("state", stateEncoded);
return url;
};
var encodeState = (state) => Buffer.from(JSON.stringify(state), "utf-8").toString("base64");
var decodeUser = (stringifiedUser) => {
try {
const maybeUser = JSON.parse(Buffer.from(stringifiedUser, `base64`).toString(`utf-8`));
if (typeof maybeUser !== "object" || maybeUser === null)
return false;
const isUser = typeof maybeUser.id === "string" && typeof maybeUser.displayName === "string" && typeof maybeUser.email === "string";
return isUser ? maybeUser : null;
} catch (e) {
debug2(`parseUser() failed silently with ${e}`);
return null;
}
};
var loginOrSignup = async () => {
const providerAnswer = await select({
message: "Select an authentication method",
default: "google",
choices: [
{ name: "Google", value: "google" },
{ name: "GitHub", value: "github" }
]
});
console.info("Authenticating to Prisma Platform via browser.\n");
const server = http.createServer();
const randomPort = 0;
const redirectUrl = await listen(server, randomPort, "127.0.0.1");
const loginUrl = await createLoginUrl({ connection: providerAnswer, redirectTo: redirectUrl.href });
console.info("Visit the following URL in your browser to authenticate:");
console.info(internals7.link(loginUrl.href));
const callbackResult = await Promise.all([
new Promise((resolve, reject) => {
server.once("request", (req, res) => {
server.close();
res.setHeader("connection", "close");
const searchParams = new URL(req.url || "/", "http://localhost").searchParams;
const token = searchParams.get("token") ?? "";
const error = searchParams.get("error");
const location = getBaseAuthUrl();
if (error) {
location.pathname += "/error";
location.searchParams.set("error", error);
reject(new Error(error));
} else {
const user = decodeUser(searchParams.get("user") ?? "");
if (user) {
searchParams.delete("token");
searchParams.delete("user");
location.pathname += "/success";
const nextSearchParams = new URLSearchParams({
...Object.fromEntries(searchParams.entries()),
email: user.email
});
location.search = nextSearchParams.toString();
resolve({ token, user });
} else {
location.pathname += "/error";
location.searchParams.set("error", "Invalid user");
reject(new Error("Invalid user"));
}
}
res.statusCode = 302;
res.setHeader("location", location.href);
res.end();
});
server.once("error", reject);
}),
open(loginUrl.href)
]).then((results) => results[0]).catch(unknownToError);
if (internals7.isError(callbackResult))
throw new Error(`Authentication failed: ${callbackResult.message}`);
{
const writeResult = await credentialsFile.save({ token: callbackResult.token });
if (internals7.isError(writeResult))
throw new Error("Writing credentials to disk failed", { cause: writeResult });
}
return {
message: successMessage(`Authentication successful for ${callbackResult.user.email}`),
email: callbackResult.user.email,
token: callbackResult.token
};
};
// src/platform/auth/logout.ts
import internals9 from "@prisma/internals";
import { green as green4 } from "kleur/colors";
// src/platform/_lib/jwt.ts
import internals8 from "@prisma/internals";
var decodeJwt = (jwt) => {
if (typeof jwt !== "string")
throw new Error("JWTs must use Compact JWS serialization, JWT must be a string");
const { 1: payload, length } = jwt.split(".");
if (length === 5)
throw new Error("Only JWTs using Compact JWS serialization can be decoded");
if (length !== 3)
throw new Error("Invalid JWT");
if (!payload)
throw new Error("JWTs must contain a payload");
const decoded = tryCatch(
() => atob(payload),
() => new Error("Failed to base64 decode the payload.")
);
if (internals8.isError(decoded))
return decoded;
const result = tryCatch(
() => JSON.parse(decoded),
() => new Error("Failed to parse the decoded payload as JSON.")
);
if (internals8.isError(result))
return result;
if (!isObject(result))
throw new Error("Invalid JWT Claims Set.");
return result;
};
// src/platform/auth/logout.ts
var Logout = class _Logout {
static new() {
return new _Logout();
}
async parse() {
const credentials = await credentialsFile.load();
if (internals9.isError(credentials))
throw credentials;
if (!credentials)
return `You are not currently logged in. Run ${green4(internals9.getCommandWithExecutor("prisma platform auth login --early-access"))} to log in.`;
if (credentials.token) {
const jwt = decodeJwt(credentials.token);
if (!internals9.isError(jwt) && jwt.jti) {
await requestOrThrow({
token: credentials.token,
body: {
query: (
/* GraphQL */
`
mutation ($input: MutationManagementTokenDeleteInput!) {
managementTokenDelete(input: $input) {
__typename
... on Error {
message
}
}
}
`
),
variables: {
input: {
id: jwt.jti
}
}
}
});
}
}
await credentialsFile.delete();
return successMessage("You have logged out.");
}
};
// src/platform/auth/show.ts
import { green as green5 } from "kleur/colors";
var Show = class _Show {
static new() {
return new _Show();
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.global,
"--sensitive": Boolean
});
const token = await getTokenOrThrow(args);
const { me } = await requestOrThrow({
token,
body: {
query: (
/* graphql */
`
query {
me {
__typename
user {
__typename
id
email
displayName
}
}
}
`
)
}
});
const data = {
...me.user,
token: getOptionalParameter(args, ["--sensitive"]) ? token : null
};
return messages.sections([
messages.info(`Currently authenticated as ${green5(me.user.email)}`),
messages.resource(data, {
email: true,
token: true
})
]);
}
};
// src/platform/environment/_.ts
var __exports3 = {};
__export(__exports3, {
$: () => $3,
Create: () => Create,
Delete: () => Delete,
Show: () => Show2,
getEnvironmentOrThrow: () => getEnvironmentOrThrow
});
// src/platform/environment/$.ts
var $3 = createNamespace();
// src/platform/environment/create.ts
var Create = class _Create {
static new() {
return new _Create();
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.project,
"--name": String,
"-n": "--name"
});
const token = await getTokenOrThrow(args);
const projectId = getRequiredParameterOrThrow(args, ["--project", "-p"]);
const displayName = getOptionalParameter(args, ["--name", "-n"]);
const { environmentCreate } = await requestOrThrow({
token,
body: {
query: (
/* graphql */
`
mutation ($input: MutationEnvironmentCreateInput!) {
environmentCreate(input: $input) {
__typename
...on Error {
message
}
...on Environment {
id
createdAt
displayName
}
}
}
`
),
variables: {
input: {
projectId,
displayName
}
}
}
});
return messages.resourceCreated(environmentCreate);
}
};
// src/platform/environment/delete.ts
import internals10 from "@prisma/internals";
var Delete = class _Delete {
static new() {
return new _Delete();
}
async parse(argv, _config) {
const args = internals10.arg(argv, {
...platformParameters.environment
});
if (internals10.isError(args))
return args;
const token = await getTokenOrThrow(args);
const environmentId = getRequiredParameterOrThrow(args, ["--environment", "-e"]);
const { environmentDelete } = await requestOrThrow({
token,
body: {
query: (
/* graphql */
`
mutation ($input: MutationEnvironmentDeleteInput!) {
environmentDelete(input: $input) {
__typename
...on Error {
message
}
...on Environment {
id
createdAt
displayName
}
}
}
`
),
variables: {
input: {
id: environmentId
}
}
}
});
return messages.resourceDeleted(environmentDelete);
}
};
// src/platform/environment/show.ts
import internals11 from "@prisma/internals";
var Show2 = class _Show {
static new() {
return new _Show();
}
async parse(argv, _config) {
const args = internals11.arg(argv, {
...platformParameters.project
});
if (internals11.isError(args))
return args;
const token = await getTokenOrThrow(args);
const projectId = getRequiredParameterOrThrow(args, ["--project", "-p"]);
const { project } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query ($input: QueryProjectInput!) {
project(input: $input) {
__typename
... on Error {
message
}
... on Project {
environments {
__typename
id
createdAt
displayName
}
}
}
}
`
),
variables: {
input: {
id: projectId
}
}
}
});
return messages.resourceList(project.environments);
}
};
var getEnvironmentOrThrow = async (input) => {
const { token, environmentId } = input;
const { environment } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query ($input: QueryEnvironmentInput!) {
environment(input: $input) {
__typename
... on Error {
message
}
... on Environment {
__typename
id
displayName
ppg {
status
}
accelerate {
status {
... on AccelerateStatusEnabled {
__typename
enabled
}
... on AccelerateStatusDisabled {
__typename
enabled
}
}
}
}
}
}
`
),
variables: {
input: {
id: environmentId
}
}
}
});
return environment;
};
// src/platform/project/_.ts
var __exports4 = {};
__export(__exports4, {
$: () => $4,
Create: () => Create2,
Delete: () => Delete2,
Show: () => Show3,
createProjectOrThrow: () => createProjectOrThrow
});
// src/platform/project/$.ts
var $4 = createNamespace();
// src/platform/project/create.ts
var Create2 = class _Create {
static new() {
return new _Create();
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.workspace,
"--name": String,
"-n": "--name"
});
const workspaceId = getRequiredParameterOrThrow(args, ["--workspace", "-w"]);
const displayName = getOptionalParameter(args, ["--name", "-n"]);
const project = await createProjectOrThrow({
token: await getTokenOrThrow(args),
workspaceId,
displayName
});
return messages.resourceCreated(project);
}
};
var createProjectOrThrow = async (input) => {
const { token, ...mutationInput } = input;
const { projectCreate } = await requestOrThrow({
token,
body: {
query: (
/* graphql */
`
mutation ($input: MutationProjectCreateInput!) {
projectCreate(input: $input) {
__typename
...on Error {
message
}
...on Project {
id
createdAt
displayName
defaultEnvironment {
id
displayName
}
}
}
}
`
),
variables: {
input: mutationInput
}
}
});
return projectCreate;
};
// src/platform/project/delete.ts
import internals12 from "@prisma/internals";
var Delete2 = class _Delete {
static new() {
return new _Delete();
}
async parse(argv, _config) {
const args = internals12.arg(argv, {
...platformParameters.project
});
if (internals12.isError(args))
return args;
const token = await getTokenOrThrow(args);
const projectId = getRequiredParameterOrThrow(args, ["--project", "-p"]);
const { projectDelete } = await requestOrThrow({
token,
body: {
query: (
/* graphql */
`
mutation ($input: MutationProjectDeleteInput!) {
projectDelete(input: $input) {
__typename
...on Error {
message
}
...on ProjectNode {
id
createdAt
displayName
}
}
}
`
),
variables: {
input: {
id: projectId
}
}
}
});
return messages.resourceDeleted(projectDelete);
}
};
// src/platform/project/show.ts
import internals13 from "@prisma/internals";
var Show3 = class _Show {
static new() {
return new _Show();
}
async parse(argv, _config) {
const args = internals13.arg(argv, {
...platformParameters.workspace
});
if (internals13.isError(args))
return args;
const token = await getTokenOrThrow(args);
const workspaceId = getRequiredParameterOrThrow(args, ["--workspace", "-w"]);
const { workspace } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query ($input: QueryWorkspaceInput!) {
workspace(input: $input) {
__typename
... on Error {
message
}
... on Workspace {
projects {
__typename
id
createdAt
displayName
}
}
}
}
`
),
variables: {
input: {
id: workspaceId
}
}
}
});
return messages.resourceList(workspace.projects);
}
};
// src/platform/serviceToken/_.ts
var __exports5 = {};
__export(__exports5, {
$: () => $5,
Create: () => Create3,
Delete: () => Delete3,
Show: () => Show4,
createOrThrow: () => createOrThrow
});
// src/platform/serviceToken/$.ts
var $5 = createNamespace();
// src/platform/serviceToken/create.ts
var Create3 = class _Create {
constructor(legacy = false) {
this.legacy = legacy;
}
static new(legacy = false) {
return new _Create(legacy);
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.environment,
"--name": String,
"-n": "--name"
});
const token = await getTokenOrThrow(args);
const environmentId = getRequiredParameterOrThrow(args, ["--environment", "-e"]);
const displayName = getOptionalParameter(args, ["--name", "-n"]);
const serviceTokenCreate = await createOrThrow({ environmentId, displayName, token });
const resource = this.legacy ? {
...serviceTokenCreate.serviceToken,
__typename: "APIKey"
} : serviceTokenCreate.serviceToken;
return messages.sections([messages.resourceCreated(resource), messages.info(serviceTokenCreate.value)]);
}
};
var createOrThrow = async (input) => {
const { environmentId, displayName, token } = input;
const { serviceTokenCreate } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
mutation ($input: MutationServiceTokenCreateInput!) {
serviceTokenCreate(input: $input) {
__typename
... on Error {
message
}
... on ServiceTokenWithValue {
value
serviceToken {
__typename
id
createdAt
displayName
}
}
}
}
`
),
variables: {
input: {
displayName,
environmentId
}
}
}
});
return serviceTokenCreate;
};
// src/platform/serviceToken/delete.ts
var Delete3 = class _Delete {
constructor(legacy = false) {
this.legacy = legacy;
}
static new(legacy = false) {
return new _Delete(legacy);
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters[this.legacy ? "apikey" : "serviceToken"]
});
const token = await getTokenOrThrow(args);
const serviceTokenId = this.legacy ? getRequiredParameterOrThrow(args, ["--apikey"]) : getRequiredParameterOrThrow(args, ["--serviceToken", "-s"]);
const { serviceTokenDelete } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
mutation ($input: MutationServiceTokenDeleteInput!) {
serviceTokenDelete(input: $input) {
__typename
... on Error {
message
}
... on ServiceTokenNode {
id
displayName
}
}
}
`
),
variables: {
input: {
id: serviceTokenId
}
}
}
});
return messages.resourceDeleted(this.legacy ? { ...serviceTokenDelete, __typename: "APIKey" } : serviceTokenDelete);
}
};
// src/platform/serviceToken/show.ts
import internals14 from "@prisma/internals";
var Show4 = class _Show {
constructor(legacy = false) {
this.legacy = legacy;
}
static new(legacy = false) {
return new _Show(legacy);
}
async parse(argv, _config) {
const args = internals14.arg(argv, {
...platformParameters.environment
});
if (internals14.isError(args))
return args;
const token = await getTokenOrThrow(args);
const environmentId = getRequiredParameterOrThrow(args, ["--environment", "-e"]);
const { environment } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query ($input: QueryEnvironmentInput!) {
environment(input: $input) {
__typename
... on Error {
message
}
... on Environment {
serviceTokens {
id
createdAt
displayName
}
}
}
}
`
),
variables: {
input: {
id: environmentId
}
}
}
});
const resources = this.legacy ? environment.serviceTokens.map((serviceToken) => ({ ...serviceToken, __typename: "APIKey" })) : environment.serviceTokens;
return messages.resourceList(resources);
}
};
// src/platform/workspace/_.ts
var __exports6 = {};
__export(__exports6, {
$: () => $6,
Show: () => Show5,
getDefaultWorkspaceOrThrow: () => getDefaultWorkspaceOrThrow,
getUserWorkspacesOrThrow: () => getUserWorkspacesOrThrow
});
// src/platform/workspace/$.ts
var $6 = createNamespace();
// src/platform/workspace/show.ts
var Show5 = class _Show {
static new() {
return new _Show();
}
async parse(argv, _config) {
const args = argOrThrow(argv, {
...platformParameters.global
});
const token = await getTokenOrThrow(args);
const userWorkspaces = await getUserWorkspacesOrThrow({ token });
return messages.resourceList(userWorkspaces);
}
};
var getUserWorkspacesOrThrow = async (input) => {
const { token } = input;
const { me } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query {
me {
__typename
workspaces {
id
displayName
createdAt
isDefault
}
}
}
`
)
}
});
return me.workspaces;
};
var getDefaultWorkspaceOrThrow = async (input) => {
const { token } = input;
const { me } = await requestOrThrow({
token,
body: {
query: (
/* GraphQL */
`
query {
me {
__typename
workspaces {
id
displayName
createdAt
isDefault
}
}
}
`
)
}
});
const defaultWorkspace = me.workspaces.find((_) => _.isDefault);
if (!defaultWorkspace) {
throw new Error("No default workspace found");
}
return defaultWorkspace;
};
export {
credentialsFile,
platformParameters,
ErrorPlatformUnauthorized,
getTokenOrThrow,
generateConnectionString,
poll,
printPpgInitOutput,
successMessage,
requestOrThrow,
__exports,
Login,
loginOrSignup,
Logout,
__exports2,
__exports3,
__exports4,
__exports5,
__exports6
};