@prisma/cli 2.20.0 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +158 -0
- package/README.md +29 -28
- package/dist/adapters/config.js +74 -0
- package/dist/adapters/local-state.js +98 -0
- package/dist/adapters/mock-api.js +57 -0
- package/dist/adapters/token-storage.js +43 -0
- package/dist/cli.js +9 -0
- package/dist/cli2.js +59 -0
- package/dist/commands/app/index.js +223 -0
- package/dist/commands/auth/index.js +42 -0
- package/dist/commands/branch/index.js +51 -0
- package/dist/commands/project/index.js +45 -0
- package/dist/controllers/app.js +813 -0
- package/dist/controllers/auth.js +107 -0
- package/dist/controllers/branch.js +73 -0
- package/dist/controllers/project.js +214 -0
- package/dist/controllers/select-prompt-port.js +12 -0
- package/dist/lib/app/bun-project.js +39 -0
- package/dist/lib/app/env-vars.js +24 -0
- package/dist/lib/app/local-dev.js +149 -0
- package/dist/lib/app/preview-build.js +283 -0
- package/dist/lib/app/preview-interaction.js +38 -0
- package/dist/lib/app/preview-progress.js +139 -0
- package/dist/lib/app/preview-provider.js +232 -0
- package/dist/lib/auth/auth-ops.js +57 -0
- package/dist/lib/auth/client.js +22 -0
- package/dist/lib/auth/guard.js +34 -0
- package/dist/lib/auth/login.js +117 -0
- package/dist/output/patterns.js +93 -0
- package/dist/presenters/app.js +405 -0
- package/dist/presenters/auth.js +73 -0
- package/dist/presenters/branch.js +111 -0
- package/dist/presenters/project.js +84 -0
- package/dist/shell/command-meta.js +320 -0
- package/dist/shell/command-runner.js +33 -0
- package/dist/shell/errors.js +66 -0
- package/dist/shell/global-flags.js +25 -0
- package/dist/shell/help.js +78 -0
- package/dist/shell/output.js +54 -0
- package/dist/shell/prompt.js +31 -0
- package/dist/shell/runtime.js +51 -0
- package/dist/shell/ui.js +59 -0
- package/dist/use-cases/auth.js +70 -0
- package/dist/use-cases/branch.js +95 -0
- package/dist/use-cases/create-cli-gateways.js +93 -0
- package/dist/use-cases/project.js +75 -0
- package/package.json +49 -137
- package/build/child.js +0 -4110
- package/build/index.js +0 -104447
- package/build/public/demo.html +0 -17
- package/build/public/demoChunk.js +0 -2
- package/build/public/electron-darwin.html +0 -19
- package/build/public/electron-linux.html +0 -18
- package/build/public/electron-mac.html +0 -18
- package/build/public/electron-win.html +0 -17
- package/build/public/electron-win32.html +0 -18
- package/build/public/electron.html +0 -17
- package/build/public/electronBus.js +0 -2
- package/build/public/electronChunk.js +0 -2
- package/build/public/favicon/apple-touch-icon.png +0 -0
- package/build/public/favicon/favicon-16x16.png +0 -0
- package/build/public/favicon/favicon-32x32.png +0 -0
- package/build/public/favicon/prisma.png +0 -0
- package/build/public/fonts/Inter.ttf +0 -0
- package/build/public/fonts/RobotoMono.ttf +0 -0
- package/build/public/icons/.DS_Store +0 -0
- package/build/public/icons/alert.svg +0 -5
- package/build/public/icons/array.svg +0 -4
- package/build/public/icons/bin.svg +0 -37
- package/build/public/icons/boolean.svg +0 -4
- package/build/public/icons/check.svg +0 -3
- package/build/public/icons/chevron-down.svg +0 -3
- package/build/public/icons/code.svg +0 -4
- package/build/public/icons/cross.svg +0 -11
- package/build/public/icons/data-tool.svg +0 -5
- package/build/public/icons/database.svg +0 -4
- package/build/public/icons/datetime.svg +0 -4
- package/build/public/icons/double-arrow-right.svg +0 -4
- package/build/public/icons/download.svg +0 -4
- package/build/public/icons/ellipsis.svg +0 -10
- package/build/public/icons/enum.svg +0 -6
- package/build/public/icons/expand.svg +0 -4
- package/build/public/icons/eye.svg +0 -20
- package/build/public/icons/filters.svg +0 -5
- package/build/public/icons/folder.svg +0 -6
- package/build/public/icons/hamburger.svg +0 -4
- package/build/public/icons/icon.svg +0 -199
- package/build/public/icons/logo.svg +0 -199
- package/build/public/icons/logotype.svg +0 -4
- package/build/public/icons/number.svg +0 -7
- package/build/public/icons/object.svg +0 -5
- package/build/public/icons/play.svg +0 -6
- package/build/public/icons/plus.svg +0 -4
- package/build/public/icons/refresh.svg +0 -4
- package/build/public/icons/search.svg +0 -7
- package/build/public/icons/settings.svg +0 -8
- package/build/public/icons/string.svg +0 -4
- package/build/public/icons/tick-indeterminate.svg +0 -3
- package/build/public/icons/tick.svg +0 -4
- package/build/public/illustrations/.DS_Store +0 -0
- package/build/public/illustrations/empty.svg +0 -1
- package/build/public/illustrations/read.svg +0 -1
- package/build/public/illustrations/searching.svg +0 -1
- package/build/public/images/.DS_Store +0 -0
- package/build/public/images/icon-1024.png +0 -0
- package/build/public/index.html +0 -49
- package/build/public/main.31f688a6254e294d9128.css +0 -118
- package/build/public/main.31f688a6254e294d9128.css.map +0 -1
- package/build/public/main.364c712f32662ff0e43d.css +0 -116
- package/build/public/main.364c712f32662ff0e43d.css.map +0 -1
- package/build/public/main.42ef3fe7e97347765c91.css +0 -118
- package/build/public/main.42ef3fe7e97347765c91.css.map +0 -1
- package/build/public/main.503446defafe7aeca2f3.css +0 -116
- package/build/public/main.503446defafe7aeca2f3.css.map +0 -1
- package/build/public/main.c50a3b5980fe26f78b65.css +0 -118
- package/build/public/main.c50a3b5980fe26f78b65.css.map +0 -1
- package/build/public/main.cda25e5813776c2af295.css +0 -116
- package/build/public/main.cda25e5813776c2af295.css.map +0 -1
- package/build/public/main.dbac3b290f78404ff579.css +0 -116
- package/build/public/main.dbac3b290f78404ff579.css.map +0 -1
- package/build/public/main.f8ce44e122e5e2b8f778.css +0 -118
- package/build/public/main.f8ce44e122e5e2b8f778.css.map +0 -1
- package/build/public/main.fc9ea7521a4aecce1a77.css +0 -118
- package/build/public/main.fc9ea7521a4aecce1a77.css.map +0 -1
- package/build/public/main.js +0 -403
- package/build/public/main.js.map +0 -1
- package/build/public/mainChunk.0a84f3ba4d2ab481e877.css +0 -116
- package/build/public/mainChunk.1b327d58afbddc917bce.css +0 -118
- package/build/public/mainChunk.2cdf583b2bd51aa67587.css +0 -118
- package/build/public/mainChunk.544af00f7e9ffcbe782c.css +0 -118
- package/build/public/mainChunk.56f96a13868b2b4a53be.css +0 -118
- package/build/public/mainChunk.5cee429bfbf06e7ecb39.css +0 -118
- package/build/public/mainChunk.a862474ed4cdb421ffa2.css +0 -118
- package/build/public/mainChunk.ada34153c4911b5ac22b.css +0 -118
- package/build/public/mainChunk.c16a8d01b2c49b2f2751.css +0 -118
- package/build/public/mainChunk.ca4a878d5478b9320be8.css +0 -116
- package/build/public/mainChunk.e3adc8758b4395546cef.css +0 -116
- package/build/public/mainChunk.f2c59fcbfc455d8b9de5.css +0 -118
- package/build/public/mainChunk.js +0 -396
- package/build/public/preview.html +0 -16
- package/build/public/previewBus.js +0 -2
- package/build/public/previewChunk.js +0 -2
- package/build/public/projects.html +0 -86
- package/build/public/server.html +0 -16
- package/build/public/serverBus.js +0 -2
- package/build/public/serverChunk.js +0 -2
- package/build/public/splash.html +0 -17
- package/build/public/studioBundle.828f34b1781061528841.css +0 -118
- package/build/public/studioBundle.bfe9138b2e0293fcb7da.css +0 -118
- package/build/public/studioBundle.c5b256eede880e502aac.css +0 -118
- package/build/public/studioBundle.e43df511c8e2e368900a.css +0 -118
- package/build/public/studioBundle.e69382554c2a2942ae32.css +0 -118
- package/build/public/studioBundle.ee21aa56a3999a2b380b.css +0 -118
- package/build/public/studioBundle.js +0 -396
- package/build/public/vercel.html +0 -16
- package/build/public/vercelChunk.js +0 -2
- package/build/xdg-open +0 -1066
- package/install/index.js +0 -5
- package/preinstall/index.js +0 -71
- package/prisma-client/README.md +0 -27
- package/prisma-client/generator-build/.DS_Store +0 -0
- package/prisma-client/generator-build/index.js +0 -79697
- package/prisma-client/index-browser.js +0 -3
- package/prisma-client/index.d.ts +0 -1
- package/prisma-client/index.js +0 -11
- package/prisma-client/package.json +0 -138
- package/prisma-client/runtime/index-browser.d.ts +0 -267
- package/prisma-client/runtime/index-browser.js +0 -2273
- package/prisma-client/runtime/index.d.ts +0 -1018
- package/prisma-client/runtime/index.js +0 -35028
- package/prisma-client/scripts/backup-index-browser.js +0 -3
- package/prisma-client/scripts/backup-index.d.ts +0 -1
- package/prisma-client/scripts/backup-index.js +0 -11
- package/prisma-client/scripts/colors.js +0 -180
- package/prisma-client/scripts/default-index-browser.js +0 -12
- package/prisma-client/scripts/default-index.d.ts +0 -47
- package/prisma-client/scripts/default-index.js +0 -12
- package/prisma-client/scripts/get-packed-client.js +0 -12
- package/prisma-client/scripts/mock-fs.js +0 -14
- package/prisma-client/scripts/postinstall.d.ts +0 -5
- package/prisma-client/scripts/postinstall.js +0 -398
- package/scripts/install-entry.js +0 -8
- package/scripts/preinstall-entry.js +0 -9
package/dist/shell/ui.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import stringWidth from "string-width";
|
|
2
|
+
import stripAnsi from "strip-ansi";
|
|
3
|
+
import wrapAnsi from "wrap-ansi";
|
|
4
|
+
import { createColors } from "colorette";
|
|
5
|
+
//#region src/shell/ui.ts
|
|
6
|
+
const DEFAULT_WIDTH = 80;
|
|
7
|
+
function createShellUi(runtime, flags) {
|
|
8
|
+
const isTTY = Boolean(runtime.stderr.isTTY);
|
|
9
|
+
const colorEnabled = resolveColorEnabled(runtime, flags, isTTY);
|
|
10
|
+
const colors = createColors({ useColor: colorEnabled });
|
|
11
|
+
return {
|
|
12
|
+
isTTY,
|
|
13
|
+
colorEnabled,
|
|
14
|
+
width: runtime.stderr.columns && runtime.stderr.columns > 0 ? runtime.stderr.columns : DEFAULT_WIDTH,
|
|
15
|
+
quiet: flags.quiet,
|
|
16
|
+
verbose: flags.verbose,
|
|
17
|
+
trace: flags.trace,
|
|
18
|
+
accent: (text) => colors.cyan(text),
|
|
19
|
+
success: (text) => colors.greenBright(text),
|
|
20
|
+
error: (text) => colors.redBright(text),
|
|
21
|
+
warning: (text) => colors.yellow(text),
|
|
22
|
+
info: (text) => colors.blue(text),
|
|
23
|
+
link: (text) => colors.blue(text),
|
|
24
|
+
dim: (text) => colors.dim(text),
|
|
25
|
+
strong: (text) => colors.bold(text)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function renderSummaryLine(ui, status, text) {
|
|
29
|
+
return `${status === "success" ? ui.success("✔") : status === "error" ? ui.error("✘") : status === "warning" ? ui.warning("⚠") : ui.info("ℹ")} ${text}`;
|
|
30
|
+
}
|
|
31
|
+
function renderNextSteps(steps) {
|
|
32
|
+
if (steps.length === 0) return [];
|
|
33
|
+
return [
|
|
34
|
+
"",
|
|
35
|
+
steps.length === 1 ? "Next step:" : "Next steps:",
|
|
36
|
+
...steps.map((step) => `- ${step}`)
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
function wrapText(text, width, indent = "") {
|
|
40
|
+
return wrapAnsi(text, width, {
|
|
41
|
+
hard: false,
|
|
42
|
+
trim: false
|
|
43
|
+
}).split("\n").map((line, index) => index === 0 ? line : `${indent}${line}`);
|
|
44
|
+
}
|
|
45
|
+
function padDisplay(text, width) {
|
|
46
|
+
const padding = Math.max(width - stringWidth(stripAnsi(text)), 0);
|
|
47
|
+
return `${text}${" ".repeat(padding)}`;
|
|
48
|
+
}
|
|
49
|
+
function maskValue(value) {
|
|
50
|
+
return value.replace(/([A-Za-z0-9._%+-]{1,})(?=@)/g, "****").replace(/:\/\/[^:@/\s]+:[^@/\s]+@/g, "://****:****@");
|
|
51
|
+
}
|
|
52
|
+
function resolveColorEnabled(runtime, flags, isTTY) {
|
|
53
|
+
if (flags.color === true) return true;
|
|
54
|
+
if (flags.color === false) return false;
|
|
55
|
+
if (runtime.env.NO_COLOR !== void 0) return false;
|
|
56
|
+
return isTTY;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { createShellUi, maskValue, padDisplay, renderNextSteps, renderSummaryLine, wrapText };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { usageError } from "../shell/errors.js";
|
|
2
|
+
//#region src/use-cases/auth.ts
|
|
3
|
+
function createAuthUseCases(dependencies) {
|
|
4
|
+
return {
|
|
5
|
+
whoami: () => resolveCurrentAuthState(dependencies),
|
|
6
|
+
login: async (selection) => {
|
|
7
|
+
await dependencies.sessionGateway.writeAuthSession({
|
|
8
|
+
provider: selection.provider,
|
|
9
|
+
userId: selection.userId,
|
|
10
|
+
workspaceId: selection.workspaceId
|
|
11
|
+
});
|
|
12
|
+
return resolveCurrentAuthState(dependencies);
|
|
13
|
+
},
|
|
14
|
+
logout: async () => {
|
|
15
|
+
await dependencies.sessionGateway.clearAuthSession();
|
|
16
|
+
return resolveCurrentAuthState(dependencies);
|
|
17
|
+
},
|
|
18
|
+
listProviders: async () => dependencies.identityGateway.listProviders(),
|
|
19
|
+
resolveProvider: async (providerId) => {
|
|
20
|
+
const provider = dependencies.identityGateway.getProvider(providerId);
|
|
21
|
+
if (!provider) throw usageError("Login requires a valid mock provider", `The mock provider "${providerId}" does not exist.`, "Use --provider github or --provider google.", ["prisma auth login"], "auth");
|
|
22
|
+
return provider;
|
|
23
|
+
},
|
|
24
|
+
listUsersForProvider: async (providerId) => {
|
|
25
|
+
const users = dependencies.identityGateway.listUsersForProvider(providerId);
|
|
26
|
+
if (users.length === 0) throw usageError("Login requires a valid mock user", `No mock users support provider "${providerId}".`, "Update the fixture data or choose a different provider.", ["prisma auth login"], "auth");
|
|
27
|
+
return users;
|
|
28
|
+
},
|
|
29
|
+
resolveUserForProvider: async (providerId, userId) => {
|
|
30
|
+
const user = dependencies.identityGateway.getUserForProvider(providerId, userId);
|
|
31
|
+
if (!user) throw usageError("Login requires a valid mock user", `The mock user "${userId}" is not available for provider "${providerId}".`, "Choose a user that supports the selected provider.", ["prisma auth login"], "auth");
|
|
32
|
+
return user;
|
|
33
|
+
},
|
|
34
|
+
listWorkspacesForUser: async (userId) => dependencies.identityGateway.listUserWorkspaces(userId),
|
|
35
|
+
resolveWorkspaceForUser: async (userId, workspaceId) => {
|
|
36
|
+
const workspace = dependencies.identityGateway.getUserWorkspace(userId, workspaceId);
|
|
37
|
+
if (!workspace) throw usageError("Login requires a valid mock workspace", `The mock workspace "${workspaceId}" is not available for the selected user.`, "Choose a workspace that the selected user can access.", ["prisma auth login"], "auth");
|
|
38
|
+
return workspace;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function resolveCurrentAuthState(dependencies) {
|
|
43
|
+
const [session, linkedProjectId] = await Promise.all([dependencies.sessionGateway.readAuthSession(), dependencies.projectConfigGateway.readLinkedProjectId()]);
|
|
44
|
+
if (!session) return {
|
|
45
|
+
authenticated: false,
|
|
46
|
+
provider: null,
|
|
47
|
+
user: null,
|
|
48
|
+
workspace: null,
|
|
49
|
+
linkedProjectId
|
|
50
|
+
};
|
|
51
|
+
const provider = dependencies.identityGateway.getProvider(session.provider);
|
|
52
|
+
const user = dependencies.identityGateway.getUser(session.userId);
|
|
53
|
+
const workspace = dependencies.identityGateway.getWorkspace(session.workspaceId);
|
|
54
|
+
if (!provider || !user || !workspace) return {
|
|
55
|
+
authenticated: false,
|
|
56
|
+
provider: null,
|
|
57
|
+
user: null,
|
|
58
|
+
workspace: null,
|
|
59
|
+
linkedProjectId
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
authenticated: true,
|
|
63
|
+
provider: provider.id,
|
|
64
|
+
user,
|
|
65
|
+
workspace,
|
|
66
|
+
linkedProjectId
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { createAuthUseCases };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
//#region src/use-cases/branch.ts
|
|
2
|
+
function createBranchUseCases(dependencies) {
|
|
3
|
+
return {
|
|
4
|
+
list: async () => {
|
|
5
|
+
const [linkedProjectId, activeBranch] = await Promise.all([dependencies.projectConfigGateway.readLinkedProjectId(), dependencies.branchStateGateway.readActiveBranch()]);
|
|
6
|
+
const remoteBranches = await listRemoteBranches(dependencies.branchGateway, linkedProjectId);
|
|
7
|
+
return {
|
|
8
|
+
linkedProjectId,
|
|
9
|
+
projectName: resolveProjectName(dependencies.projectGateway, linkedProjectId),
|
|
10
|
+
activeBranch,
|
|
11
|
+
branches: buildBranchSummaries(activeBranch, remoteBranches)
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
show: async () => {
|
|
15
|
+
const [linkedProjectId, activeBranch] = await Promise.all([dependencies.projectConfigGateway.readLinkedProjectId(), dependencies.branchStateGateway.readActiveBranch()]);
|
|
16
|
+
return {
|
|
17
|
+
linkedProjectId,
|
|
18
|
+
projectName: resolveProjectName(dependencies.projectGateway, linkedProjectId),
|
|
19
|
+
branch: buildBranchDetail(dependencies.branchGateway, linkedProjectId, activeBranch)
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
use: async (branchName) => {
|
|
23
|
+
await dependencies.branchStateGateway.writeActiveBranch(branchName);
|
|
24
|
+
const linkedProjectId = await dependencies.projectConfigGateway.readLinkedProjectId();
|
|
25
|
+
return {
|
|
26
|
+
linkedProjectId,
|
|
27
|
+
projectName: resolveProjectName(dependencies.projectGateway, linkedProjectId),
|
|
28
|
+
branch: buildBranchDetail(dependencies.branchGateway, linkedProjectId, branchName)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function resolveProjectName(projectGateway, linkedProjectId) {
|
|
34
|
+
if (!linkedProjectId) return null;
|
|
35
|
+
return projectGateway.getProject(linkedProjectId)?.name ?? null;
|
|
36
|
+
}
|
|
37
|
+
async function listRemoteBranches(branchGateway, linkedProjectId) {
|
|
38
|
+
if (!linkedProjectId) return [];
|
|
39
|
+
return branchGateway.listBranchesForProject(linkedProjectId);
|
|
40
|
+
}
|
|
41
|
+
function buildBranchSummaries(activeBranch, remoteBranches) {
|
|
42
|
+
const byName = /* @__PURE__ */ new Map();
|
|
43
|
+
for (const branch of remoteBranches) byName.set(branch.name, {
|
|
44
|
+
id: branch.id,
|
|
45
|
+
name: branch.name,
|
|
46
|
+
kind: branch.kind,
|
|
47
|
+
active: activeBranch === branch.name,
|
|
48
|
+
remoteState: true
|
|
49
|
+
});
|
|
50
|
+
if (!byName.has(activeBranch)) byName.set(activeBranch, {
|
|
51
|
+
id: activeBranch,
|
|
52
|
+
name: activeBranch,
|
|
53
|
+
kind: toBranchKind(activeBranch),
|
|
54
|
+
active: true,
|
|
55
|
+
remoteState: false
|
|
56
|
+
});
|
|
57
|
+
return sortBranches([...byName.values()]);
|
|
58
|
+
}
|
|
59
|
+
function buildBranchDetail(branchGateway, linkedProjectId, branchName) {
|
|
60
|
+
const kind = toBranchKind(branchName);
|
|
61
|
+
const remoteBranch = linkedProjectId ? branchGateway.getBranchForProject(linkedProjectId, branchName) : void 0;
|
|
62
|
+
return {
|
|
63
|
+
name: branchName,
|
|
64
|
+
kind,
|
|
65
|
+
active: true,
|
|
66
|
+
remoteState: Boolean(remoteBranch),
|
|
67
|
+
liveDeployment: remoteBranch && remoteBranch.currentDeploymentId ? toLiveDeployment(branchGateway.getDeployment(remoteBranch.currentDeploymentId)) : null
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function toBranchKind(name) {
|
|
71
|
+
if (name === "production") return "production";
|
|
72
|
+
return "preview";
|
|
73
|
+
}
|
|
74
|
+
function sortBranches(branches) {
|
|
75
|
+
return branches.slice().sort((left, right) => {
|
|
76
|
+
const leftRank = branchOrder(left);
|
|
77
|
+
const rightRank = branchOrder(right);
|
|
78
|
+
if (leftRank !== rightRank) return leftRank - rightRank;
|
|
79
|
+
return left.name.localeCompare(right.name);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function branchOrder(branch) {
|
|
83
|
+
if (branch.name === "production") return 0;
|
|
84
|
+
return 1;
|
|
85
|
+
}
|
|
86
|
+
function toLiveDeployment(deployment) {
|
|
87
|
+
if (!deployment) return null;
|
|
88
|
+
return {
|
|
89
|
+
id: deployment.id,
|
|
90
|
+
status: deployment.status,
|
|
91
|
+
url: deployment.url
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { createBranchUseCases };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { UnsafeConfigWriteError, readLinkedProjectId, writeLinkedProjectId } from "../adapters/config.js";
|
|
2
|
+
import { usageError } from "../shell/errors.js";
|
|
3
|
+
//#region src/use-cases/create-cli-gateways.ts
|
|
4
|
+
function createCliUseCaseGateways(context) {
|
|
5
|
+
return {
|
|
6
|
+
identityGateway: {
|
|
7
|
+
listProviders: () => context.api.listProviders(),
|
|
8
|
+
getProvider: (providerId) => context.api.getProvider(providerId),
|
|
9
|
+
listUsersForProvider: (providerId) => context.api.listUsersForProvider(providerId).map(toAuthUser),
|
|
10
|
+
getUser: (userId) => {
|
|
11
|
+
const user = context.api.getUser(userId);
|
|
12
|
+
return user ? toAuthUser(user) : void 0;
|
|
13
|
+
},
|
|
14
|
+
getUserForProvider: (providerId, userId) => {
|
|
15
|
+
const user = context.api.getUserForProvider(providerId, userId);
|
|
16
|
+
return user ? toAuthUser(user) : void 0;
|
|
17
|
+
},
|
|
18
|
+
listUserWorkspaces: (userId) => context.api.listUserWorkspaces(userId).map(toAuthWorkspace),
|
|
19
|
+
getWorkspace: (workspaceId) => {
|
|
20
|
+
const workspace = context.api.getWorkspace(workspaceId);
|
|
21
|
+
return workspace ? toAuthWorkspace(workspace) : void 0;
|
|
22
|
+
},
|
|
23
|
+
getUserWorkspace: (userId, workspaceId) => {
|
|
24
|
+
const workspace = context.api.getUserWorkspace(userId, workspaceId);
|
|
25
|
+
return workspace ? toAuthWorkspace(workspace) : void 0;
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
projectGateway: {
|
|
29
|
+
listProjectsForWorkspace: (workspaceId) => context.api.listProjectsForWorkspace(workspaceId),
|
|
30
|
+
getProject: (projectId) => context.api.getProject(projectId),
|
|
31
|
+
getProjectForWorkspace: (workspaceId, projectId) => context.api.getProjectForWorkspace(workspaceId, projectId)
|
|
32
|
+
},
|
|
33
|
+
branchGateway: {
|
|
34
|
+
listBranchesForProject: (projectId) => context.api.listBranchesForProject(projectId).map((branch) => ({
|
|
35
|
+
...branch,
|
|
36
|
+
kind: branch.name === "production" ? "production" : "preview"
|
|
37
|
+
})),
|
|
38
|
+
getBranchForProject: (projectId, name) => {
|
|
39
|
+
const branch = context.api.getBranchForProject(projectId, name);
|
|
40
|
+
return branch ? {
|
|
41
|
+
...branch,
|
|
42
|
+
kind: branch.name === "production" ? "production" : "preview"
|
|
43
|
+
} : void 0;
|
|
44
|
+
},
|
|
45
|
+
getDeployment: (deploymentId) => context.api.getDeployment(deploymentId)
|
|
46
|
+
},
|
|
47
|
+
projectConfigGateway: {
|
|
48
|
+
readLinkedProjectId: () => readLinkedProjectId(context.runtime.cwd),
|
|
49
|
+
writeLinkedProjectId: async (projectId) => {
|
|
50
|
+
try {
|
|
51
|
+
await writeLinkedProjectId(context.runtime.cwd, projectId);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error instanceof UnsafeConfigWriteError) throw usageError("Project link requires a writable Prisma config", error.message, "Update prisma.config.ts to use a recognizable project field, or remove it and rerun prisma project link.", ["prisma project link proj_123"], "project");
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
sessionGateway: {
|
|
59
|
+
readAuthSession: async () => {
|
|
60
|
+
return (await context.stateStore.read()).auth;
|
|
61
|
+
},
|
|
62
|
+
writeAuthSession: async (session) => {
|
|
63
|
+
await context.stateStore.setAuthSession(session);
|
|
64
|
+
},
|
|
65
|
+
clearAuthSession: async () => {
|
|
66
|
+
await context.stateStore.clearAuthSession();
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
branchStateGateway: {
|
|
70
|
+
readActiveBranch: async () => {
|
|
71
|
+
return (await context.stateStore.read()).branch.active;
|
|
72
|
+
},
|
|
73
|
+
writeActiveBranch: async (branchName) => {
|
|
74
|
+
await context.stateStore.setActiveBranch(branchName);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function toAuthUser(user) {
|
|
80
|
+
return {
|
|
81
|
+
id: user.id,
|
|
82
|
+
name: user.name,
|
|
83
|
+
email: user.email
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function toAuthWorkspace(workspace) {
|
|
87
|
+
return {
|
|
88
|
+
id: workspace.id,
|
|
89
|
+
name: workspace.name
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
export { createCliUseCaseGateways };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { CliError, authRequiredError } from "../shell/errors.js";
|
|
2
|
+
//#region src/use-cases/project.ts
|
|
3
|
+
function createProjectUseCases(dependencies) {
|
|
4
|
+
return {
|
|
5
|
+
list: async (authState) => {
|
|
6
|
+
const workspace = requireWorkspace(authState);
|
|
7
|
+
return {
|
|
8
|
+
workspace,
|
|
9
|
+
linkedProjectId: authState.linkedProjectId,
|
|
10
|
+
projects: listSortedWorkspaceProjects(dependencies.projectGateway, workspace.id).map(toProjectSummary)
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
show: async (authState) => {
|
|
14
|
+
if (!authState.linkedProjectId) return {
|
|
15
|
+
linkedProjectId: null,
|
|
16
|
+
workspace: null,
|
|
17
|
+
project: null
|
|
18
|
+
};
|
|
19
|
+
if (!authState.authenticated || !authState.workspace) return {
|
|
20
|
+
linkedProjectId: authState.linkedProjectId,
|
|
21
|
+
workspace: null,
|
|
22
|
+
project: null
|
|
23
|
+
};
|
|
24
|
+
const project = dependencies.projectGateway.getProjectForWorkspace(authState.workspace.id, authState.linkedProjectId);
|
|
25
|
+
if (!project) return {
|
|
26
|
+
linkedProjectId: authState.linkedProjectId,
|
|
27
|
+
workspace: null,
|
|
28
|
+
project: null
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
linkedProjectId: authState.linkedProjectId,
|
|
32
|
+
workspace: authState.workspace,
|
|
33
|
+
project: toProjectSummary(project)
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
link: async (authState, projectId) => {
|
|
37
|
+
const workspace = requireWorkspace(authState);
|
|
38
|
+
const project = dependencies.projectGateway.getProjectForWorkspace(workspace.id, projectId);
|
|
39
|
+
if (!project) throw projectNotFoundError(`The project "${projectId}" does not exist in workspace "${workspace.name}".`, "Run prisma project list and choose a project id from the active workspace.");
|
|
40
|
+
await dependencies.projectConfigGateway.writeLinkedProjectId(project.id);
|
|
41
|
+
return {
|
|
42
|
+
linkedProjectId: project.id,
|
|
43
|
+
workspace,
|
|
44
|
+
project: toProjectSummary(project)
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
listProjectsForWorkspace: async (workspaceId) => listSortedWorkspaceProjects(dependencies.projectGateway, workspaceId).map(toProjectSummary)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function requireWorkspace(authState) {
|
|
51
|
+
if (!authState.authenticated || !authState.workspace) throw authRequiredError();
|
|
52
|
+
return authState.workspace;
|
|
53
|
+
}
|
|
54
|
+
function listSortedWorkspaceProjects(projectGateway, workspaceId) {
|
|
55
|
+
return projectGateway.listProjectsForWorkspace(workspaceId).slice().sort((left, right) => left.name.localeCompare(right.name) || left.id.localeCompare(right.id));
|
|
56
|
+
}
|
|
57
|
+
function toProjectSummary(project) {
|
|
58
|
+
return {
|
|
59
|
+
id: project.id,
|
|
60
|
+
name: project.name
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function projectNotFoundError(why, fix, nextSteps = ["prisma project list"]) {
|
|
64
|
+
return new CliError({
|
|
65
|
+
code: "PROJECT_NOT_FOUND",
|
|
66
|
+
domain: "project",
|
|
67
|
+
summary: "Project not found",
|
|
68
|
+
why,
|
|
69
|
+
fix,
|
|
70
|
+
exitCode: 1,
|
|
71
|
+
nextSteps
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { createProjectUseCases, projectNotFoundError };
|
package/package.json
CHANGED
|
@@ -1,139 +1,51 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"assets": [
|
|
52
|
-
"build/**/*",
|
|
53
|
-
"runtime/**/*",
|
|
54
|
-
"prisma-client/**/*",
|
|
55
|
-
"node_modules/@prisma/engines/**/*",
|
|
56
|
-
"node_modules/@prisma/engines/*"
|
|
57
|
-
]
|
|
58
|
-
},
|
|
59
|
-
"bin": {
|
|
60
|
-
"prisma": "build/index.js",
|
|
61
|
-
"prisma2": "build/index.js"
|
|
62
|
-
},
|
|
63
|
-
"devDependencies": {
|
|
64
|
-
"@prisma/client": "0.0.0",
|
|
65
|
-
"@prisma/debug": "0.0.0",
|
|
66
|
-
"@prisma/fetch-engine": "0.0.0",
|
|
67
|
-
"@prisma/generator-helper": "0.0.0",
|
|
68
|
-
"@prisma/get-platform": "0.0.0",
|
|
69
|
-
"@prisma/migrate": "0.0.0",
|
|
70
|
-
"@prisma/sdk": "0.0.0",
|
|
71
|
-
"@prisma/studio": "0.365.0",
|
|
72
|
-
"@prisma/studio-server": "0.365.0",
|
|
73
|
-
"@timsuchanek/copy": "1.4.5",
|
|
74
|
-
"@types/jest": "26.0.22",
|
|
75
|
-
"@types/ws": "7.4.0",
|
|
76
|
-
"@typescript-eslint/eslint-plugin": "4.19.0",
|
|
77
|
-
"@typescript-eslint/parser": "4.19.0",
|
|
78
|
-
"chalk": "4.1.0",
|
|
79
|
-
"checkpoint-client": "1.1.19",
|
|
80
|
-
"dotenv": "8.2.0",
|
|
81
|
-
"esbuild": "0.8.53",
|
|
82
|
-
"escape-string-regexp": "4.0.0",
|
|
83
|
-
"eslint": "7.23.0",
|
|
84
|
-
"eslint-config-prettier": "8.1.0",
|
|
85
|
-
"eslint-plugin-eslint-comments": "3.2.0",
|
|
86
|
-
"eslint-plugin-jest": "24.3.2",
|
|
87
|
-
"eslint-plugin-prettier": "3.3.1",
|
|
88
|
-
"execa": "5.0.0",
|
|
89
|
-
"fast-deep-equal": "3.1.3",
|
|
90
|
-
"fs-jetpack": "4.1.0",
|
|
91
|
-
"get-port": "5.1.1",
|
|
92
|
-
"global-dirs": "3.0.0",
|
|
93
|
-
"indent-string": "4.0.0",
|
|
94
|
-
"is-installed-globally": "0.4.0",
|
|
95
|
-
"jest": "26.6.3",
|
|
96
|
-
"line-replace": "2.0.1",
|
|
97
|
-
"lint-staged": "10.5.4",
|
|
98
|
-
"log-update": "4.0.0",
|
|
99
|
-
"make-dir": "3.1.0",
|
|
100
|
-
"node-fetch": "2.6.1",
|
|
101
|
-
"open": "7.4.2",
|
|
102
|
-
"pg": "8.5.1",
|
|
103
|
-
"pkg": "4.5.1",
|
|
104
|
-
"pkg-up": "3.1.0",
|
|
105
|
-
"prettier": "2.2.1",
|
|
106
|
-
"replace-string": "3.1.0",
|
|
107
|
-
"resolve-pkg": "2.0.0",
|
|
108
|
-
"rimraf": "3.0.2",
|
|
109
|
-
"strip-ansi": "6.0.0",
|
|
110
|
-
"tempy": "1.0.1",
|
|
111
|
-
"ts-jest": "26.5.4",
|
|
112
|
-
"typescript": "4.2.3"
|
|
113
|
-
},
|
|
114
|
-
"scripts": {
|
|
115
|
-
"test:commands": "./fixtures/test.sh && jest --maxConcurrency=1",
|
|
116
|
-
"test-update": "pnpm run test:commands -- -u",
|
|
117
|
-
"test": "pnpm run test:commands",
|
|
118
|
-
"jest": "jest",
|
|
119
|
-
"install": "node scripts/install-entry.js",
|
|
120
|
-
"format": "prettier --write .",
|
|
121
|
-
"lint": "eslint --cache --fix --ext .ts .",
|
|
122
|
-
"lint-ci": "eslint --ext .ts .",
|
|
123
|
-
"tsc": "tsc -d -p tsconfig.build.json && bash scripts/copy-runtime-dist.sh",
|
|
124
|
-
"build": "node helpers/build.js",
|
|
125
|
-
"pkg": "pkg . -o pkg-build",
|
|
126
|
-
"prepublishOnly": "pnpm run build",
|
|
127
|
-
"preinstall": "node scripts/preinstall-entry.js",
|
|
128
|
-
"precommit": "lint-staged"
|
|
129
|
-
},
|
|
130
|
-
"dependencies": {
|
|
131
|
-
"@prisma/engines": "2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e"
|
|
132
|
-
},
|
|
133
|
-
"lint-staged": {
|
|
134
|
-
"*.ts": [
|
|
135
|
-
"eslint",
|
|
136
|
-
"prettier --write"
|
|
137
|
-
]
|
|
138
|
-
}
|
|
2
|
+
"name": "@prisma/cli",
|
|
3
|
+
"version": "3.0.0-alpha.0",
|
|
4
|
+
"description": "Preview of the unified Prisma CLI.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"prisma-cli": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=20"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"prisma",
|
|
22
|
+
"cli",
|
|
23
|
+
"database",
|
|
24
|
+
"app",
|
|
25
|
+
"deployment"
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/prisma/prisma-cli.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/prisma/prisma-cli#readme",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/prisma/prisma-cli/issues"
|
|
35
|
+
},
|
|
36
|
+
"license": "Apache-2.0",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@clack/prompts": "^1.2.0",
|
|
39
|
+
"@prisma/compute-sdk": "^0.14.0",
|
|
40
|
+
"c12": "4.0.0-beta.4",
|
|
41
|
+
"@prisma/credentials-store": "^7.7.0",
|
|
42
|
+
"@prisma/management-api-sdk": "^1.24.0",
|
|
43
|
+
"colorette": "^2.0.20",
|
|
44
|
+
"commander": "^12.1.0",
|
|
45
|
+
"magicast": "^0.3.5",
|
|
46
|
+
"open": "^11.0.0",
|
|
47
|
+
"string-width": "^8.2.0",
|
|
48
|
+
"strip-ansi": "^7.2.0",
|
|
49
|
+
"wrap-ansi": "^10.0.0"
|
|
50
|
+
}
|
|
139
51
|
}
|