@plank-cms/plank 0.27.3 → 0.28.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/README.md +7 -0
- package/dist/admin/assets/index-BhxOFNX5.css +2 -0
- package/dist/admin/assets/{index-CrCKvadB.js → index-CdtvxQpy.js} +52 -52
- package/dist/admin/index.html +2 -2
- package/dist/index.js +120 -22
- package/dist/migrations/033_plank_addons.sql +22 -0
- package/dist/{server-5JMBMGIN.js → server-DONLO5CM.js} +733 -13
- package/package.json +4 -4
- package/dist/admin/assets/index-BTElP7oS.css +0 -2
package/dist/admin/index.html
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
href="https://fonts.googleapis.com/css2?family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&display=swap"
|
|
13
13
|
rel="stylesheet"
|
|
14
14
|
/>
|
|
15
|
-
<script type="module" crossorigin src="/admin/assets/index-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/admin/assets/index-
|
|
15
|
+
<script type="module" crossorigin src="/admin/assets/index-CdtvxQpy.js"></script>
|
|
16
|
+
<link rel="stylesheet" crossorigin href="/admin/assets/index-BhxOFNX5.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<div id="root"></div>
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,96 @@
|
|
|
4
4
|
import { intro, outro, text, spinner, note, isCancel, cancel } from "@clack/prompts";
|
|
5
5
|
import chalk from "chalk";
|
|
6
6
|
import { randomBytes } from "crypto";
|
|
7
|
-
import { resolve, join } from "path";
|
|
8
|
-
import
|
|
7
|
+
import { resolve, join as join2 } from "path";
|
|
8
|
+
import fs2 from "fs-extra";
|
|
9
9
|
import { execa } from "execa";
|
|
10
|
-
|
|
10
|
+
|
|
11
|
+
// src/packageManager.ts
|
|
12
|
+
import { readFile } from "fs/promises";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import fs from "fs-extra";
|
|
15
|
+
function parsePackageManagerName(value) {
|
|
16
|
+
if (!value) return null;
|
|
17
|
+
if (value.startsWith("pnpm@") || value === "pnpm") return "pnpm";
|
|
18
|
+
if (value.startsWith("npm@") || value === "npm") return "npm";
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function parseUserAgentPackageManager(userAgent = process.env.npm_config_user_agent) {
|
|
22
|
+
if (!userAgent) return null;
|
|
23
|
+
const [descriptor] = userAgent.split(" ");
|
|
24
|
+
const [name, version] = descriptor.split("/");
|
|
25
|
+
const parsedName = parsePackageManagerName(name);
|
|
26
|
+
if (!parsedName) return null;
|
|
27
|
+
return {
|
|
28
|
+
name: parsedName,
|
|
29
|
+
version: version || null
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function readProjectPackageManager(projectDir) {
|
|
33
|
+
const packageJsonPath = join(projectDir, "package.json");
|
|
34
|
+
if (!await fs.pathExists(packageJsonPath)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const raw = await readFile(packageJsonPath, "utf8");
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
return parsePackageManagerName(parsed.packageManager);
|
|
40
|
+
}
|
|
41
|
+
async function readLockfilePackageManager(projectDir) {
|
|
42
|
+
if (await fs.pathExists(join(projectDir, "pnpm-lock.yaml"))) {
|
|
43
|
+
return "pnpm";
|
|
44
|
+
}
|
|
45
|
+
if (await fs.pathExists(join(projectDir, "package-lock.json"))) {
|
|
46
|
+
return "npm";
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
async function detectPackageManager(projectDir) {
|
|
51
|
+
const projectPackageManager = await readProjectPackageManager(projectDir);
|
|
52
|
+
if (projectPackageManager) return projectPackageManager;
|
|
53
|
+
const lockfilePackageManager = await readLockfilePackageManager(projectDir);
|
|
54
|
+
if (lockfilePackageManager) return lockfilePackageManager;
|
|
55
|
+
return parseUserAgentPackageManager()?.name ?? "npm";
|
|
56
|
+
}
|
|
57
|
+
function getPackageManagerVersion(name) {
|
|
58
|
+
const userAgentPackageManager = parseUserAgentPackageManager();
|
|
59
|
+
if (userAgentPackageManager?.name === name) {
|
|
60
|
+
return userAgentPackageManager.version;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function getInstallCommand(name) {
|
|
65
|
+
if (name === "pnpm") {
|
|
66
|
+
return {
|
|
67
|
+
command: "pnpm",
|
|
68
|
+
args: ["install"]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
command: "npm",
|
|
73
|
+
args: ["install"]
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function getUpdateDependencyCommand(name, target) {
|
|
77
|
+
if (name === "pnpm") {
|
|
78
|
+
return {
|
|
79
|
+
command: "pnpm",
|
|
80
|
+
args: ["add", "--save-exact", target]
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
command: "npm",
|
|
85
|
+
args: ["install", "--save-exact", target]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function getStartScriptCommand(name) {
|
|
89
|
+
return name === "pnpm" ? "pnpm start" : "npm start";
|
|
90
|
+
}
|
|
91
|
+
function getUpdateScriptCommand(name) {
|
|
92
|
+
return name === "pnpm" ? "pnpm run update" : "npm run update";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// src/commands/init.ts
|
|
96
|
+
var PACKAGE_VERSION = "0.28.0";
|
|
11
97
|
function generateSecret() {
|
|
12
98
|
return randomBytes(32).toString("hex");
|
|
13
99
|
}
|
|
@@ -19,11 +105,15 @@ function buildEnv(jwtSecret, encryptionKey) {
|
|
|
19
105
|
`PLANK_PORT=5500`
|
|
20
106
|
].join("\n") + "\n";
|
|
21
107
|
}
|
|
22
|
-
function buildPackageJson(name) {
|
|
108
|
+
function buildPackageJson(name, packageManager) {
|
|
109
|
+
const packageManagerVersion = getPackageManagerVersion(packageManager);
|
|
23
110
|
return {
|
|
24
111
|
name,
|
|
25
112
|
version: "0.1.0",
|
|
26
113
|
private: true,
|
|
114
|
+
...packageManager === "pnpm" && packageManagerVersion ? {
|
|
115
|
+
packageManager: `pnpm@${packageManagerVersion}`
|
|
116
|
+
} : {},
|
|
27
117
|
scripts: {
|
|
28
118
|
start: "plank start",
|
|
29
119
|
update: "plank update"
|
|
@@ -58,22 +148,28 @@ async function init(projectName) {
|
|
|
58
148
|
}
|
|
59
149
|
}
|
|
60
150
|
const projectDir = useCurrentDir ? process.cwd() : resolve(process.cwd(), name);
|
|
61
|
-
if (!useCurrentDir && await
|
|
62
|
-
const entries = await
|
|
151
|
+
if (!useCurrentDir && await fs2.pathExists(projectDir)) {
|
|
152
|
+
const entries = await fs2.readdir(projectDir);
|
|
63
153
|
if (entries.length > 0) {
|
|
64
154
|
cancel(`Directory "${name}" already exists and is not empty.`);
|
|
65
155
|
process.exit(1);
|
|
66
156
|
}
|
|
67
157
|
}
|
|
68
158
|
const s = spinner();
|
|
159
|
+
const packageManager = await detectPackageManager(projectDir);
|
|
160
|
+
const installCommand = getInstallCommand(packageManager);
|
|
161
|
+
const startCommand = getStartScriptCommand(packageManager);
|
|
162
|
+
const updateCommand = getUpdateScriptCommand(packageManager);
|
|
69
163
|
s.start("Creating project...");
|
|
70
|
-
await
|
|
71
|
-
await
|
|
72
|
-
await
|
|
73
|
-
|
|
164
|
+
await fs2.ensureDir(projectDir);
|
|
165
|
+
await fs2.writeFile(join2(projectDir, ".env"), buildEnv(generateSecret(), generateSecret()));
|
|
166
|
+
await fs2.writeJSON(join2(projectDir, "package.json"), buildPackageJson(name, packageManager), {
|
|
167
|
+
spaces: 2
|
|
168
|
+
});
|
|
169
|
+
await fs2.writeFile(join2(projectDir, ".gitignore"), ".env\nnode_modules\n");
|
|
74
170
|
s.stop("Project created");
|
|
75
171
|
s.start("Installing dependencies...");
|
|
76
|
-
await execa(
|
|
172
|
+
await execa(installCommand.command, installCommand.args, { cwd: projectDir });
|
|
77
173
|
s.stop("Dependencies installed");
|
|
78
174
|
note(
|
|
79
175
|
[
|
|
@@ -88,11 +184,11 @@ async function init(projectName) {
|
|
|
88
184
|
`${chalk.yellow("Important:")} keep ${chalk.cyan("PLANK_JWT_SECRET")} and ${chalk.cyan("PLANK_ENCRYPTION_KEY")} set in production.`,
|
|
89
185
|
"",
|
|
90
186
|
...!useCurrentDir ? [` ${chalk.cyan(`cd ${name}`)}`, ""] : [],
|
|
91
|
-
` ${chalk.cyan(
|
|
187
|
+
` ${chalk.cyan(startCommand)}`,
|
|
92
188
|
"",
|
|
93
189
|
`To update Plank later:`,
|
|
94
190
|
"",
|
|
95
|
-
` ${chalk.cyan(
|
|
191
|
+
` ${chalk.cyan(updateCommand)}`
|
|
96
192
|
].join("\n"),
|
|
97
193
|
"Next steps"
|
|
98
194
|
);
|
|
@@ -102,11 +198,11 @@ async function init(projectName) {
|
|
|
102
198
|
// src/commands/start.ts
|
|
103
199
|
import { config } from "dotenv";
|
|
104
200
|
import { fileURLToPath } from "url";
|
|
105
|
-
import { dirname, join as
|
|
201
|
+
import { dirname, join as join3, resolve as resolve2 } from "path";
|
|
106
202
|
async function start() {
|
|
107
203
|
config({ path: resolve2(process.cwd(), ".env") });
|
|
108
|
-
process.env.PLANK_ADMIN_DIST =
|
|
109
|
-
const { start: startServer } = await import("./server-
|
|
204
|
+
process.env.PLANK_ADMIN_DIST = join3(dirname(fileURLToPath(import.meta.url)), "admin");
|
|
205
|
+
const { start: startServer } = await import("./server-DONLO5CM.js");
|
|
110
206
|
await startServer();
|
|
111
207
|
}
|
|
112
208
|
|
|
@@ -166,17 +262,17 @@ async function publishScheduled() {
|
|
|
166
262
|
import { intro as intro2, outro as outro2, spinner as spinner2 } from "@clack/prompts";
|
|
167
263
|
import chalk2 from "chalk";
|
|
168
264
|
import { execa as execa2 } from "execa";
|
|
169
|
-
import
|
|
170
|
-
import { join as
|
|
265
|
+
import fs3 from "fs-extra";
|
|
266
|
+
import { join as join4 } from "path";
|
|
171
267
|
var PACKAGE_NAME = "@plank-cms/plank";
|
|
172
268
|
async function update(version = "latest") {
|
|
173
269
|
intro2(chalk2.bold("\u25B2 Plank CMS"));
|
|
174
|
-
const packageJsonPath =
|
|
175
|
-
const hasPackageJson = await
|
|
270
|
+
const packageJsonPath = join4(process.cwd(), "package.json");
|
|
271
|
+
const hasPackageJson = await fs3.pathExists(packageJsonPath);
|
|
176
272
|
if (!hasPackageJson) {
|
|
177
273
|
throw new Error("No package.json found in the current directory.");
|
|
178
274
|
}
|
|
179
|
-
const packageJson = await
|
|
275
|
+
const packageJson = await fs3.readJSON(packageJsonPath);
|
|
180
276
|
const dependencies = {
|
|
181
277
|
...packageJson.dependencies,
|
|
182
278
|
...packageJson.devDependencies
|
|
@@ -186,9 +282,11 @@ async function update(version = "latest") {
|
|
|
186
282
|
}
|
|
187
283
|
const s = spinner2();
|
|
188
284
|
const target = `${PACKAGE_NAME}@${version}`;
|
|
285
|
+
const packageManager = await detectPackageManager(process.cwd());
|
|
286
|
+
const updateCommand = getUpdateDependencyCommand(packageManager, target);
|
|
189
287
|
s.start(`Updating ${PACKAGE_NAME} to ${chalk2.cyan(version)}...`);
|
|
190
288
|
try {
|
|
191
|
-
await execa2(
|
|
289
|
+
await execa2(updateCommand.command, updateCommand.args, {
|
|
192
290
|
cwd: process.cwd(),
|
|
193
291
|
stdio: "inherit"
|
|
194
292
|
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS plank_addons (
|
|
2
|
+
id VARCHAR(128) PRIMARY KEY,
|
|
3
|
+
package_name VARCHAR(255) NOT NULL UNIQUE,
|
|
4
|
+
name VARCHAR(255) NOT NULL,
|
|
5
|
+
version VARCHAR(64),
|
|
6
|
+
plank_range VARCHAR(128),
|
|
7
|
+
description TEXT,
|
|
8
|
+
installed BOOLEAN NOT NULL DEFAULT FALSE,
|
|
9
|
+
enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
10
|
+
compatible BOOLEAN NOT NULL DEFAULT FALSE,
|
|
11
|
+
has_admin_ui BOOLEAN NOT NULL DEFAULT FALSE,
|
|
12
|
+
settings_namespace VARCHAR(128),
|
|
13
|
+
slots_json JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
14
|
+
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
15
|
+
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE INDEX IF NOT EXISTS plank_addons_installed_idx
|
|
19
|
+
ON plank_addons (installed);
|
|
20
|
+
|
|
21
|
+
CREATE INDEX IF NOT EXISTS plank_addons_enabled_idx
|
|
22
|
+
ON plank_addons (enabled);
|