@paneljs/paneljs 0.2.0 → 0.2.1
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/CHANGELOG.md +28 -0
- package/README.md +3 -3
- package/dist/adminService.d.ts +49 -0
- package/dist/adminService.js +307 -0
- package/dist/adminService.js.map +1 -0
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +16 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/auth.d.ts +7 -0
- package/dist/cli/auth.js +95 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/init.d.ts +37 -0
- package/dist/cli/init.js +137 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/project.d.ts +31 -0
- package/dist/cli/project.js +150 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +129 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/stack.d.ts +18 -0
- package/dist/cli/stack.js +129 -0
- package/dist/cli/stack.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/deleteRelations.d.ts +17 -0
- package/dist/deleteRelations.js +100 -0
- package/dist/deleteRelations.js.map +1 -0
- package/dist/index.d.ts +16 -9
- package/dist/index.js +22 -7
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/ui/dist/assets/index-BFz2MB0D.js +11 -0
- package/ui/dist/assets/index-B_bCMkti.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-ChtweaBk.js +0 -11
- package/ui/dist/assets/index-eXfQCDXx.css +0 -1
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { argument, hasFlag } from "./args.js";
|
|
3
|
+
import { detectPackageManager, installArgs, peersFor, planInstall, readManifest, } from "./project.js";
|
|
4
|
+
import { docsUrl, FRAMEWORKS, ORMS, paneljsPackages, parseFramework, parseOrm, resolveFramework, resolveOrm, setupSnippet, } from "./stack.js";
|
|
5
|
+
export function parseInitArgs(argv) {
|
|
6
|
+
const unknown = argv.filter((item) => item.startsWith("-") &&
|
|
7
|
+
item !== "--framework" &&
|
|
8
|
+
item !== "--orm" &&
|
|
9
|
+
item !== "--pm" &&
|
|
10
|
+
item !== "--yes" &&
|
|
11
|
+
item !== "-y" &&
|
|
12
|
+
item !== "--dry-run" &&
|
|
13
|
+
item !== "--help" &&
|
|
14
|
+
item !== "-h" &&
|
|
15
|
+
!item.startsWith("--framework=") &&
|
|
16
|
+
!item.startsWith("--orm=") &&
|
|
17
|
+
!item.startsWith("--pm="));
|
|
18
|
+
if (unknown.length > 0) {
|
|
19
|
+
throw new Error(`Unknown init flag: ${unknown[0]}`);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
framework: argument(argv, "--framework"),
|
|
23
|
+
orm: argument(argv, "--orm"),
|
|
24
|
+
pm: argument(argv, "--pm"),
|
|
25
|
+
yes: hasFlag(argv, "--yes") || hasFlag(argv, "-y"),
|
|
26
|
+
dryRun: hasFlag(argv, "--dry-run"),
|
|
27
|
+
help: hasFlag(argv, "--help") || hasFlag(argv, "-h"),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export const INIT_USAGE = `Usage:
|
|
31
|
+
paneljs init [--framework express] [--orm prisma|typeorm] [--pm npm|pnpm|yarn|bun] [--yes] [--dry-run]
|
|
32
|
+
|
|
33
|
+
Adds PanelJS packages to the app in this directory. Does not rewrite source files.
|
|
34
|
+
Fastify, Nest.js, and Drizzle are listed in the prompt but are not selectable yet.`;
|
|
35
|
+
export function resolveInitPlan(cwd, flags, manifest, env, framework, orm) {
|
|
36
|
+
const frameworkChoice = resolveFramework(framework);
|
|
37
|
+
const ormChoice = resolveOrm(orm);
|
|
38
|
+
const packages = paneljsPackages(frameworkChoice.id, ormChoice.id);
|
|
39
|
+
const plan = planInstall(manifest, packages, peersFor(ormChoice.id));
|
|
40
|
+
if (plan.incompatible.length > 0) {
|
|
41
|
+
throw new Error(plan.incompatible.join("\n"));
|
|
42
|
+
}
|
|
43
|
+
const pm = detectPackageManager(cwd, manifest, env, flags.pm);
|
|
44
|
+
return { framework: frameworkChoice.id, orm: ormChoice.id, pm, plan, packages };
|
|
45
|
+
}
|
|
46
|
+
export async function runInit(input) {
|
|
47
|
+
const flags = parseInitArgs(input.argv);
|
|
48
|
+
if (flags.help === true) {
|
|
49
|
+
input.io.stdout.write(`${INIT_USAGE}\n`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const manifest = readManifest(input.cwd);
|
|
53
|
+
const framework = await pick("Which Node framework are you using?", flags.framework, FRAMEWORKS.map((item) => ({
|
|
54
|
+
value: item.id,
|
|
55
|
+
label: item.label,
|
|
56
|
+
disabled: !item.available,
|
|
57
|
+
})), flags, input.io, (value) => parseFramework(value));
|
|
58
|
+
const orm = await pick("Which ORM are you using?", flags.orm, ORMS.map((item) => ({
|
|
59
|
+
value: item.id,
|
|
60
|
+
label: item.label,
|
|
61
|
+
disabled: !item.available,
|
|
62
|
+
})), flags, input.io, (value) => parseOrm(value));
|
|
63
|
+
const resolved = resolveInitPlan(input.cwd, flags, manifest, input.io.env, framework, orm);
|
|
64
|
+
const { plan } = resolved;
|
|
65
|
+
const adding = [...plan.dependencies, ...plan.devDependencies];
|
|
66
|
+
input.io.stdout.write("\n");
|
|
67
|
+
if (adding.length === 0) {
|
|
68
|
+
input.io.stdout.write("PanelJS packages for this stack are already listed.\n");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
input.io.stdout.write(`Using ${resolved.pm}. Will add:\n`);
|
|
72
|
+
for (const name of plan.dependencies)
|
|
73
|
+
input.io.stdout.write(` ${name}\n`);
|
|
74
|
+
for (const name of plan.devDependencies)
|
|
75
|
+
input.io.stdout.write(` ${name} (dev)\n`);
|
|
76
|
+
}
|
|
77
|
+
if (plan.alreadyPresent.length > 0) {
|
|
78
|
+
input.io.stdout.write(`Already present: ${plan.alreadyPresent.join(", ")}\n`);
|
|
79
|
+
}
|
|
80
|
+
input.io.stdout.write("No source files will be changed.\n");
|
|
81
|
+
if (flags.dryRun === true) {
|
|
82
|
+
input.io.stdout.write("\nDry run. Nothing was installed.\n");
|
|
83
|
+
writeSnippet(input.io, resolved.framework, resolved.orm);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (adding.length > 0 && flags.yes !== true) {
|
|
87
|
+
if (!input.io.isTTY) {
|
|
88
|
+
throw new Error("Non-interactive install requires --yes.");
|
|
89
|
+
}
|
|
90
|
+
const ok = await input.io.confirm("Install these packages?");
|
|
91
|
+
if (!ok)
|
|
92
|
+
throw new Error("Init cancelled.");
|
|
93
|
+
}
|
|
94
|
+
if (adding.length > 0) {
|
|
95
|
+
await input.io.install(resolved.pm, input.cwd, plan.dependencies, plan.devDependencies);
|
|
96
|
+
}
|
|
97
|
+
input.io.stdout.write("\nInstalled. Wire this into your existing server:\n\n");
|
|
98
|
+
writeSnippet(input.io, resolved.framework, resolved.orm);
|
|
99
|
+
}
|
|
100
|
+
function writeSnippet(io, framework, orm) {
|
|
101
|
+
io.stdout.write(`${setupSnippet(framework, orm)}\n\n`);
|
|
102
|
+
io.stdout.write(`Docs: ${docsUrl(framework, orm)}\n`);
|
|
103
|
+
io.stdout.write("Auth: https://www.paneljs.com/docs/guide/auth\n");
|
|
104
|
+
}
|
|
105
|
+
async function pick(label, flagged, items, flags, io, parse) {
|
|
106
|
+
if (flagged)
|
|
107
|
+
return parse(flagged);
|
|
108
|
+
if (flags.yes === true || !io.isTTY) {
|
|
109
|
+
throw new Error(`${label} Pass the matching flag with --yes, or run in a terminal.`);
|
|
110
|
+
}
|
|
111
|
+
return parse(await io.select(label, items));
|
|
112
|
+
}
|
|
113
|
+
export function createDefaultInstall() {
|
|
114
|
+
return async (pm, cwd, dependencies, devDependencies) => {
|
|
115
|
+
if (dependencies.length > 0)
|
|
116
|
+
await runCommand(pm, installArgs(pm, dependencies, false), cwd);
|
|
117
|
+
if (devDependencies.length > 0)
|
|
118
|
+
await runCommand(pm, installArgs(pm, devDependencies, true), cwd);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function runCommand(command, args, cwd) {
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
const child = spawn(command, args, {
|
|
124
|
+
cwd,
|
|
125
|
+
stdio: "inherit",
|
|
126
|
+
shell: process.platform === "win32",
|
|
127
|
+
});
|
|
128
|
+
child.on("error", reject);
|
|
129
|
+
child.on("exit", (code) => {
|
|
130
|
+
if (code === 0)
|
|
131
|
+
resolve();
|
|
132
|
+
else
|
|
133
|
+
reject(new Error(`${command} ${args.join(" ")} exited with code ${code}.`));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { OrmId, PackageManager } from "./stack.js";
|
|
2
|
+
export interface PackageManifest {
|
|
3
|
+
dependencies?: Record<string, string>;
|
|
4
|
+
devDependencies?: Record<string, string>;
|
|
5
|
+
optionalDependencies?: Record<string, string>;
|
|
6
|
+
packageManager?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PeerNeed {
|
|
9
|
+
name: string;
|
|
10
|
+
installAs: "dep" | "dev";
|
|
11
|
+
spec?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function readManifest(cwd: string): PackageManifest;
|
|
14
|
+
export declare function declaredSpec(manifest: PackageManifest, name: string): string | undefined;
|
|
15
|
+
export declare function detectPackageManager(cwd: string, manifest: PackageManifest, env: NodeJS.ProcessEnv, override?: string): PackageManager;
|
|
16
|
+
export declare function packageManagerFromUserAgent(userAgent: string | undefined): PackageManager | undefined;
|
|
17
|
+
export declare function peersFor(orm: OrmId): PeerNeed[];
|
|
18
|
+
export declare function incompatiblePeer(name: string, spec: string): string | undefined;
|
|
19
|
+
export declare function parseLeadingVersion(spec: string): {
|
|
20
|
+
major: number;
|
|
21
|
+
minor: number;
|
|
22
|
+
patch: number;
|
|
23
|
+
} | undefined;
|
|
24
|
+
export interface InstallPlan {
|
|
25
|
+
dependencies: string[];
|
|
26
|
+
devDependencies: string[];
|
|
27
|
+
alreadyPresent: string[];
|
|
28
|
+
incompatible: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare function planInstall(manifest: PackageManifest, panelPackages: string[], peers: PeerNeed[]): InstallPlan;
|
|
31
|
+
export declare function installArgs(pm: PackageManager, packages: string[], dev: boolean): string[];
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const PRISMA_PEERS = [
|
|
4
|
+
{ name: "express", installAs: "dep" },
|
|
5
|
+
{ name: "@prisma/client", installAs: "dep", spec: "~7.5.0" },
|
|
6
|
+
{ name: "prisma", installAs: "dev", spec: "~7.5.0" },
|
|
7
|
+
];
|
|
8
|
+
const TYPEORM_PEERS = [
|
|
9
|
+
{ name: "express", installAs: "dep" },
|
|
10
|
+
{ name: "typeorm", installAs: "dep", spec: "^0.3.20" },
|
|
11
|
+
];
|
|
12
|
+
export function readManifest(cwd) {
|
|
13
|
+
const path = join(cwd, "package.json");
|
|
14
|
+
if (!existsSync(path)) {
|
|
15
|
+
throw new Error("No package.json in this directory. Run paneljs init inside your app.");
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new Error(`Could not parse ${path}.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function declaredSpec(manifest, name) {
|
|
25
|
+
return (manifest.dependencies?.[name] ??
|
|
26
|
+
manifest.devDependencies?.[name] ??
|
|
27
|
+
manifest.optionalDependencies?.[name]);
|
|
28
|
+
}
|
|
29
|
+
export function detectPackageManager(cwd, manifest, env, override) {
|
|
30
|
+
if (override) {
|
|
31
|
+
const allowed = ["npm", "pnpm", "yarn", "bun"];
|
|
32
|
+
if (!allowed.includes(override)) {
|
|
33
|
+
throw new Error(`Unknown package manager "${override}". Use npm, pnpm, yarn, or bun.`);
|
|
34
|
+
}
|
|
35
|
+
return override;
|
|
36
|
+
}
|
|
37
|
+
const fromAgent = packageManagerFromUserAgent(env.npm_config_user_agent);
|
|
38
|
+
if (fromAgent)
|
|
39
|
+
return fromAgent;
|
|
40
|
+
const field = manifest.packageManager?.split("@")[0];
|
|
41
|
+
if (field === "npm" || field === "pnpm" || field === "yarn" || field === "bun") {
|
|
42
|
+
return field;
|
|
43
|
+
}
|
|
44
|
+
if (existsSync(join(cwd, "pnpm-lock.yaml")))
|
|
45
|
+
return "pnpm";
|
|
46
|
+
if (existsSync(join(cwd, "yarn.lock")))
|
|
47
|
+
return "yarn";
|
|
48
|
+
if (existsSync(join(cwd, "bun.lock")) || existsSync(join(cwd, "bun.lockb")))
|
|
49
|
+
return "bun";
|
|
50
|
+
if (existsSync(join(cwd, "package-lock.json")))
|
|
51
|
+
return "npm";
|
|
52
|
+
return "npm";
|
|
53
|
+
}
|
|
54
|
+
export function packageManagerFromUserAgent(userAgent) {
|
|
55
|
+
if (!userAgent)
|
|
56
|
+
return undefined;
|
|
57
|
+
const name = userAgent.split("/")[0];
|
|
58
|
+
if (name === "npm" || name === "pnpm" || name === "yarn" || name === "bun") {
|
|
59
|
+
return name;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
export function peersFor(orm) {
|
|
64
|
+
if (orm === "prisma")
|
|
65
|
+
return PRISMA_PEERS;
|
|
66
|
+
if (orm === "typeorm")
|
|
67
|
+
return TYPEORM_PEERS;
|
|
68
|
+
return [{ name: "express", installAs: "dep" }];
|
|
69
|
+
}
|
|
70
|
+
export function incompatiblePeer(name, spec) {
|
|
71
|
+
if (spec.startsWith("workspace:") ||
|
|
72
|
+
spec.startsWith("catalog:") ||
|
|
73
|
+
spec === "*" ||
|
|
74
|
+
spec === "latest") {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const version = parseLeadingVersion(spec);
|
|
78
|
+
if (!version)
|
|
79
|
+
return undefined;
|
|
80
|
+
if (name === "prisma" || name === "@prisma/client") {
|
|
81
|
+
if (version.major !== 7 || version.minor !== 5) {
|
|
82
|
+
return `${name}@${spec} is not Prisma 7.5.x. @paneljs/prisma requires ~7.5.0.`;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
if (name === "typeorm") {
|
|
87
|
+
if (version.major !== 0 ||
|
|
88
|
+
version.minor < 3 ||
|
|
89
|
+
(version.minor === 3 && version.patch < 20)) {
|
|
90
|
+
return `${name}@${spec} is below ^0.3.20.`;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
if (name === "express") {
|
|
95
|
+
if (version.major < 4 || (version.major === 4 && version.minor < 18)) {
|
|
96
|
+
return `${name}@${spec} is below ^4.18 or ^5.`;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
export function parseLeadingVersion(spec) {
|
|
103
|
+
const match = spec
|
|
104
|
+
.replace(/^[~^>=<\s]+/, "")
|
|
105
|
+
.match(/^(\d+)\.(\d+)(?:\.(\d+))?/);
|
|
106
|
+
if (!match)
|
|
107
|
+
return undefined;
|
|
108
|
+
return {
|
|
109
|
+
major: Number(match[1]),
|
|
110
|
+
minor: Number(match[2]),
|
|
111
|
+
patch: Number(match[3] ?? 0),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function planInstall(manifest, panelPackages, peers) {
|
|
115
|
+
const incompatible = [];
|
|
116
|
+
const alreadyPresent = [];
|
|
117
|
+
const dependencies = [];
|
|
118
|
+
const devDependencies = [];
|
|
119
|
+
const consider = (name, installAs, spec) => {
|
|
120
|
+
const declared = declaredSpec(manifest, name);
|
|
121
|
+
if (declared) {
|
|
122
|
+
const problem = incompatiblePeer(name, declared);
|
|
123
|
+
if (problem)
|
|
124
|
+
incompatible.push(problem);
|
|
125
|
+
else
|
|
126
|
+
alreadyPresent.push(name);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const token = spec ? `${name}@${spec}` : name;
|
|
130
|
+
if (installAs === "dev")
|
|
131
|
+
devDependencies.push(token);
|
|
132
|
+
else
|
|
133
|
+
dependencies.push(token);
|
|
134
|
+
};
|
|
135
|
+
for (const name of panelPackages)
|
|
136
|
+
consider(name, "dep");
|
|
137
|
+
for (const peer of peers)
|
|
138
|
+
consider(peer.name, peer.installAs, peer.spec);
|
|
139
|
+
return { dependencies, devDependencies, alreadyPresent, incompatible };
|
|
140
|
+
}
|
|
141
|
+
export function installArgs(pm, packages, dev) {
|
|
142
|
+
if (packages.length === 0)
|
|
143
|
+
return [];
|
|
144
|
+
if (pm === "npm")
|
|
145
|
+
return ["install", ...(dev ? ["-D"] : []), ...packages];
|
|
146
|
+
if (pm === "bun")
|
|
147
|
+
return ["add", ...(dev ? ["-d"] : []), ...packages];
|
|
148
|
+
return ["add", ...(dev ? ["-D"] : []), ...packages];
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SelectItem {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
hint?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function question(label: string): Promise<string>;
|
|
8
|
+
export declare function confirm(label: string, defaultYes?: boolean): Promise<boolean>;
|
|
9
|
+
export declare function hiddenQuestion(label: string): Promise<string>;
|
|
10
|
+
export declare function select(label: string, items: SelectItem[]): Promise<string>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
export async function question(label) {
|
|
4
|
+
const terminal = createInterface({ input: stdin, output: stdout });
|
|
5
|
+
try {
|
|
6
|
+
return (await terminal.question(label)).trim();
|
|
7
|
+
}
|
|
8
|
+
finally {
|
|
9
|
+
terminal.close();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function confirm(label, defaultYes = true) {
|
|
13
|
+
const suffix = defaultYes ? " [Y/n]: " : " [y/N]: ";
|
|
14
|
+
const answer = (await question(`${label}${suffix}`)).toLowerCase();
|
|
15
|
+
if (!answer)
|
|
16
|
+
return defaultYes;
|
|
17
|
+
return answer === "y" || answer === "yes";
|
|
18
|
+
}
|
|
19
|
+
export async function hiddenQuestion(label) {
|
|
20
|
+
if (!stdin.isTTY)
|
|
21
|
+
throw new Error("Password input requires a terminal. Pass --password or set EXPRESS_ADMIN_PASSWORD for non-interactive use.");
|
|
22
|
+
stdout.write(label);
|
|
23
|
+
return new Promise((resolveQuestion, rejectQuestion) => {
|
|
24
|
+
let value = "";
|
|
25
|
+
const restore = () => {
|
|
26
|
+
stdin.setRawMode(false);
|
|
27
|
+
stdin.pause();
|
|
28
|
+
stdin.off("data", onData);
|
|
29
|
+
};
|
|
30
|
+
const onData = (chunk) => {
|
|
31
|
+
for (const character of chunk.toString("utf8")) {
|
|
32
|
+
if (character === "\r" || character === "\n") {
|
|
33
|
+
restore();
|
|
34
|
+
stdout.write("\n");
|
|
35
|
+
resolveQuestion(value);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (character === "\u0003") {
|
|
39
|
+
restore();
|
|
40
|
+
rejectQuestion(new Error("Cancelled."));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (character === "\b" || character === "\u007f") {
|
|
44
|
+
if (value) {
|
|
45
|
+
value = value.slice(0, -1);
|
|
46
|
+
stdout.write("\b \b");
|
|
47
|
+
}
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
value += character;
|
|
51
|
+
stdout.write("•");
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
stdin.setRawMode(true);
|
|
55
|
+
stdin.resume();
|
|
56
|
+
stdin.on("data", onData);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const dim = (text) => `\x1b[2m${text}\x1b[0m`;
|
|
60
|
+
export async function select(label, items) {
|
|
61
|
+
const enabled = items
|
|
62
|
+
.map((item, index) => ({ item, index }))
|
|
63
|
+
.filter(({ item }) => !item.disabled);
|
|
64
|
+
if (enabled.length === 0)
|
|
65
|
+
throw new Error(`No available options for ${label}`);
|
|
66
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== "function") {
|
|
67
|
+
throw new Error(`${label} requires a terminal, or pass the matching flag (--framework / --orm).`);
|
|
68
|
+
}
|
|
69
|
+
let current = enabled[0].index;
|
|
70
|
+
const render = (first) => {
|
|
71
|
+
if (!first)
|
|
72
|
+
stdout.write(`\x1b[${items.length}A`);
|
|
73
|
+
for (const [index, item] of items.entries()) {
|
|
74
|
+
const cursor = index === current ? "❯ " : " ";
|
|
75
|
+
const hint = item.disabled
|
|
76
|
+
? dim(" (coming soon)")
|
|
77
|
+
: item.hint
|
|
78
|
+
? dim(` ${item.hint}`)
|
|
79
|
+
: "";
|
|
80
|
+
const line = `${cursor}${item.label}${hint}`;
|
|
81
|
+
const painted = item.disabled ? dim(line) : line;
|
|
82
|
+
stdout.write(`\x1b[2K${painted}\n`);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
stdout.write(`${label}\n`);
|
|
86
|
+
stdout.write("\x1b[?25l");
|
|
87
|
+
render(true);
|
|
88
|
+
return new Promise((resolveSelect, rejectSelect) => {
|
|
89
|
+
const restore = () => {
|
|
90
|
+
stdin.setRawMode(false);
|
|
91
|
+
stdin.pause();
|
|
92
|
+
stdin.off("data", onData);
|
|
93
|
+
stdout.write("\x1b[?25h");
|
|
94
|
+
};
|
|
95
|
+
const move = (direction) => {
|
|
96
|
+
const position = enabled.findIndex(({ index }) => index === current);
|
|
97
|
+
const next = enabled[(position + direction + enabled.length) % enabled.length];
|
|
98
|
+
current = next.index;
|
|
99
|
+
render(false);
|
|
100
|
+
};
|
|
101
|
+
const onData = (chunk) => {
|
|
102
|
+
const text = chunk.toString("utf8");
|
|
103
|
+
if (text === "\u0003") {
|
|
104
|
+
restore();
|
|
105
|
+
stdout.write("\n");
|
|
106
|
+
rejectSelect(new Error("Cancelled."));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (text === "\r" || text === "\n") {
|
|
110
|
+
restore();
|
|
111
|
+
stdout.write(`\x1b[${items.length}A`);
|
|
112
|
+
for (const [index, item] of items.entries()) {
|
|
113
|
+
const mark = index === current ? "❯ " : " ";
|
|
114
|
+
stdout.write(`\x1b[2K${mark}${item.label}\n`);
|
|
115
|
+
}
|
|
116
|
+
resolveSelect(items[current].value);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (text === "\u001b[A" || text === "k")
|
|
120
|
+
move(-1);
|
|
121
|
+
if (text === "\u001b[B" || text === "j")
|
|
122
|
+
move(1);
|
|
123
|
+
};
|
|
124
|
+
stdin.setRawMode(true);
|
|
125
|
+
stdin.resume();
|
|
126
|
+
stdin.on("data", onData);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type FrameworkId = "express" | "fastify" | "nestjs";
|
|
2
|
+
export type OrmId = "prisma" | "typeorm" | "drizzle";
|
|
3
|
+
export type PackageManager = "npm" | "pnpm" | "yarn" | "bun";
|
|
4
|
+
export interface StackChoice<Id extends string> {
|
|
5
|
+
id: Id;
|
|
6
|
+
label: string;
|
|
7
|
+
available: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const FRAMEWORKS: StackChoice<FrameworkId>[];
|
|
10
|
+
export declare const ORMS: StackChoice<OrmId>[];
|
|
11
|
+
export declare function parseFramework(value: string): FrameworkId;
|
|
12
|
+
export declare function parseOrm(value: string): OrmId;
|
|
13
|
+
export declare function assertAvailable(kind: "framework" | "ORM", choice: StackChoice<string>): void;
|
|
14
|
+
export declare function resolveFramework(id: FrameworkId): StackChoice<FrameworkId>;
|
|
15
|
+
export declare function resolveOrm(id: OrmId): StackChoice<OrmId>;
|
|
16
|
+
export declare function paneljsPackages(framework: FrameworkId, orm: OrmId): string[];
|
|
17
|
+
export declare function docsUrl(framework: FrameworkId, orm: OrmId): string;
|
|
18
|
+
export declare function setupSnippet(framework: FrameworkId, orm: OrmId): string;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export const FRAMEWORKS = [
|
|
2
|
+
{ id: "express", label: "Express", available: true },
|
|
3
|
+
{ id: "fastify", label: "Fastify", available: false },
|
|
4
|
+
{ id: "nestjs", label: "Nest.js", available: false },
|
|
5
|
+
];
|
|
6
|
+
export const ORMS = [
|
|
7
|
+
{ id: "prisma", label: "Prisma", available: true },
|
|
8
|
+
{ id: "typeorm", label: "TypeORM", available: true },
|
|
9
|
+
{ id: "drizzle", label: "Drizzle", available: false },
|
|
10
|
+
];
|
|
11
|
+
const FRAMEWORK_ALIASES = {
|
|
12
|
+
express: "express",
|
|
13
|
+
fastify: "fastify",
|
|
14
|
+
nest: "nestjs",
|
|
15
|
+
nestjs: "nestjs",
|
|
16
|
+
"nest.js": "nestjs",
|
|
17
|
+
};
|
|
18
|
+
const ORM_ALIASES = {
|
|
19
|
+
prisma: "prisma",
|
|
20
|
+
typeorm: "typeorm",
|
|
21
|
+
drizzle: "drizzle",
|
|
22
|
+
};
|
|
23
|
+
export function parseFramework(value) {
|
|
24
|
+
const id = FRAMEWORK_ALIASES[value.trim().toLowerCase()];
|
|
25
|
+
if (!id) {
|
|
26
|
+
throw new Error(`Unknown framework "${value}". Use express (fastify and nest.js are coming soon).`);
|
|
27
|
+
}
|
|
28
|
+
return id;
|
|
29
|
+
}
|
|
30
|
+
export function parseOrm(value) {
|
|
31
|
+
const id = ORM_ALIASES[value.trim().toLowerCase()];
|
|
32
|
+
if (!id) {
|
|
33
|
+
throw new Error(`Unknown ORM "${value}". Use prisma or typeorm (drizzle is coming soon).`);
|
|
34
|
+
}
|
|
35
|
+
return id;
|
|
36
|
+
}
|
|
37
|
+
export function assertAvailable(kind, choice) {
|
|
38
|
+
if (choice.available)
|
|
39
|
+
return;
|
|
40
|
+
const instead = kind === "framework"
|
|
41
|
+
? "Express is the HTTP adapter that ships today."
|
|
42
|
+
: "Prisma and TypeORM are the data adapters that ship today.";
|
|
43
|
+
throw new Error(`${choice.label} is coming soon. ${instead}`);
|
|
44
|
+
}
|
|
45
|
+
export function resolveFramework(id) {
|
|
46
|
+
const choice = FRAMEWORKS.find((item) => item.id === id);
|
|
47
|
+
if (!choice)
|
|
48
|
+
throw new Error(`Unknown framework "${id}".`);
|
|
49
|
+
assertAvailable("framework", choice);
|
|
50
|
+
return choice;
|
|
51
|
+
}
|
|
52
|
+
export function resolveOrm(id) {
|
|
53
|
+
const choice = ORMS.find((item) => item.id === id);
|
|
54
|
+
if (!choice)
|
|
55
|
+
throw new Error(`Unknown ORM "${id}".`);
|
|
56
|
+
assertAvailable("ORM", choice);
|
|
57
|
+
return choice;
|
|
58
|
+
}
|
|
59
|
+
export function paneljsPackages(framework, orm) {
|
|
60
|
+
resolveFramework(framework);
|
|
61
|
+
resolveOrm(orm);
|
|
62
|
+
const http = framework === "express" ? "@paneljs/express" : `@paneljs/${framework}`;
|
|
63
|
+
const data = orm === "prisma" ? "@paneljs/prisma" : `@paneljs/${orm}`;
|
|
64
|
+
return ["paneljs", http, data];
|
|
65
|
+
}
|
|
66
|
+
export function docsUrl(framework, orm) {
|
|
67
|
+
return `https://www.paneljs.com/docs/guide/installation/${framework}/${orm}`;
|
|
68
|
+
}
|
|
69
|
+
export function setupSnippet(framework, orm) {
|
|
70
|
+
resolveFramework(framework);
|
|
71
|
+
resolveOrm(orm);
|
|
72
|
+
if (orm === "prisma") {
|
|
73
|
+
return `import express from "express";
|
|
74
|
+
import { createAdmin } from "paneljs";
|
|
75
|
+
import { prismaAdapter } from "@paneljs/prisma";
|
|
76
|
+
import { mount } from "@paneljs/express";
|
|
77
|
+
import { prisma } from "./prisma.js";
|
|
78
|
+
|
|
79
|
+
const app = express();
|
|
80
|
+
|
|
81
|
+
const admin = createAdmin({
|
|
82
|
+
adapter: prismaAdapter({ prisma }),
|
|
83
|
+
auth: {
|
|
84
|
+
getCurrentUser: async (req) => {
|
|
85
|
+
const user = await getOperatorFromYourAuth(req);
|
|
86
|
+
if (!user) return null;
|
|
87
|
+
return {
|
|
88
|
+
id: user.id,
|
|
89
|
+
email: user.email,
|
|
90
|
+
role: user.role,
|
|
91
|
+
isSuperAdmin: user.role === "SUPER_ADMIN",
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
admin.register("User");
|
|
98
|
+
await mount(app, admin);`;
|
|
99
|
+
}
|
|
100
|
+
return `import express from "express";
|
|
101
|
+
import { createAdmin } from "paneljs";
|
|
102
|
+
import { typeormAdapter } from "@paneljs/typeorm";
|
|
103
|
+
import { mount } from "@paneljs/express";
|
|
104
|
+
import { dataSource } from "./data-source.js";
|
|
105
|
+
|
|
106
|
+
await dataSource.initialize();
|
|
107
|
+
|
|
108
|
+
const app = express();
|
|
109
|
+
|
|
110
|
+
const admin = createAdmin({
|
|
111
|
+
adapter: typeormAdapter({ dataSource }),
|
|
112
|
+
auth: {
|
|
113
|
+
getCurrentUser: async (req) => {
|
|
114
|
+
const user = await getOperatorFromYourAuth(req);
|
|
115
|
+
if (!user) return null;
|
|
116
|
+
return {
|
|
117
|
+
id: user.id,
|
|
118
|
+
email: user.email,
|
|
119
|
+
role: user.role,
|
|
120
|
+
isSuperAdmin: user.role === "SUPER_ADMIN",
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
admin.register("User");
|
|
127
|
+
await mount(app, admin);`;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/cli/stack.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED