@plank-cms/plank 0.27.3 → 0.27.4
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/dist/admin/index.html
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
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-
|
|
15
|
+
<script type="module" crossorigin src="/admin/assets/index-PC7ZVO5D.js"></script>
|
|
16
16
|
<link rel="stylesheet" crossorigin href="/admin/assets/index-BTElP7oS.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
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.27.4";
|
|
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-BVXQ6LEC.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
|
});
|
|
@@ -650,7 +650,7 @@ function validate(contentType, payload) {
|
|
|
650
650
|
import express from "express";
|
|
651
651
|
import cors from "cors";
|
|
652
652
|
import helmet from "helmet";
|
|
653
|
-
import { join as
|
|
653
|
+
import { join as join5, dirname as dirname2 } from "path";
|
|
654
654
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
655
655
|
|
|
656
656
|
// ../core/dist/routes/auth.js
|
|
@@ -4929,10 +4929,10 @@ async function updateNamespaceSettings(req, res) {
|
|
|
4929
4929
|
|
|
4930
4930
|
// ../core/dist/lib/version.js
|
|
4931
4931
|
import { readFile as readFile2 } from "fs/promises";
|
|
4932
|
+
import { join as join4 } from "path";
|
|
4932
4933
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
4933
4934
|
var PACKAGE_NAME = "@plank-cms/plank";
|
|
4934
4935
|
var CHANGELOG_BASE_URL = "https://github.com/plank-cms/plank/releases";
|
|
4935
|
-
var UPDATE_COMMAND = "npm run update";
|
|
4936
4936
|
var REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;
|
|
4937
4937
|
var CACHE_TTL_MS = 1e3 * 60 * 30;
|
|
4938
4938
|
var packageJsonUrl = new URL("../../package.json", import.meta.url);
|
|
@@ -4957,6 +4957,41 @@ function compareVersions(a2, b3) {
|
|
|
4957
4957
|
function getChangelogUrl(version) {
|
|
4958
4958
|
return version ? `${CHANGELOG_BASE_URL}/tag/${version}` : CHANGELOG_BASE_URL;
|
|
4959
4959
|
}
|
|
4960
|
+
function getUpdateCommandForPackageManager(packageManager) {
|
|
4961
|
+
return packageManager === "pnpm" ? "pnpm run update" : "npm run update";
|
|
4962
|
+
}
|
|
4963
|
+
async function detectProjectPackageManager() {
|
|
4964
|
+
try {
|
|
4965
|
+
const raw = await readFile2(join4(process.cwd(), "package.json"), "utf8");
|
|
4966
|
+
const parsed = JSON.parse(raw);
|
|
4967
|
+
if (parsed.packageManager?.startsWith("pnpm@") || parsed.packageManager === "pnpm") {
|
|
4968
|
+
return "pnpm";
|
|
4969
|
+
}
|
|
4970
|
+
if (parsed.packageManager?.startsWith("npm@") || parsed.packageManager === "npm") {
|
|
4971
|
+
return "npm";
|
|
4972
|
+
}
|
|
4973
|
+
} catch {
|
|
4974
|
+
return await detectPackageManagerFromLockfiles();
|
|
4975
|
+
}
|
|
4976
|
+
return await detectPackageManagerFromLockfiles();
|
|
4977
|
+
}
|
|
4978
|
+
async function hasLockfile(filename) {
|
|
4979
|
+
try {
|
|
4980
|
+
await readFile2(join4(process.cwd(), filename), "utf8");
|
|
4981
|
+
return true;
|
|
4982
|
+
} catch {
|
|
4983
|
+
return false;
|
|
4984
|
+
}
|
|
4985
|
+
}
|
|
4986
|
+
async function detectPackageManagerFromLockfiles() {
|
|
4987
|
+
if (await hasLockfile("pnpm-lock.yaml")) {
|
|
4988
|
+
return "pnpm";
|
|
4989
|
+
}
|
|
4990
|
+
if (await hasLockfile("package-lock.json")) {
|
|
4991
|
+
return "npm";
|
|
4992
|
+
}
|
|
4993
|
+
return null;
|
|
4994
|
+
}
|
|
4960
4995
|
async function readCurrentVersion() {
|
|
4961
4996
|
const packageJsonPath = fileURLToPath2(packageJsonUrl);
|
|
4962
4997
|
const raw = await readFile2(packageJsonPath, "utf8");
|
|
@@ -4968,6 +5003,7 @@ async function getVersionCheck() {
|
|
|
4968
5003
|
return cachedVersionCheck.value;
|
|
4969
5004
|
}
|
|
4970
5005
|
const currentVersion = await readCurrentVersion();
|
|
5006
|
+
const packageManager = await detectProjectPackageManager();
|
|
4971
5007
|
let latestVersion = null;
|
|
4972
5008
|
try {
|
|
4973
5009
|
const response = await fetch(REGISTRY_URL, {
|
|
@@ -4981,13 +5017,14 @@ async function getVersionCheck() {
|
|
|
4981
5017
|
latestVersion = payload.version ?? null;
|
|
4982
5018
|
}
|
|
4983
5019
|
} catch {
|
|
5020
|
+
latestVersion = null;
|
|
4984
5021
|
}
|
|
4985
5022
|
const value = {
|
|
4986
5023
|
currentVersion,
|
|
4987
5024
|
latestVersion,
|
|
4988
5025
|
updateAvailable: latestVersion ? compareVersions(latestVersion, currentVersion) > 0 : false,
|
|
4989
5026
|
changelogUrl: getChangelogUrl(latestVersion),
|
|
4990
|
-
updateCommand:
|
|
5027
|
+
updateCommand: getUpdateCommandForPackageManager(packageManager),
|
|
4991
5028
|
checkedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
4992
5029
|
};
|
|
4993
5030
|
cachedVersionCheck = {
|
|
@@ -5772,9 +5809,9 @@ if (isDev) {
|
|
|
5772
5809
|
app.get("/admin/*path", (_req, res) => res.redirect(adminDevUrl));
|
|
5773
5810
|
app.get("/admin", (_req, res) => res.redirect(adminDevUrl));
|
|
5774
5811
|
} else {
|
|
5775
|
-
const adminDist = process.env.PLANK_ADMIN_DIST ??
|
|
5812
|
+
const adminDist = process.env.PLANK_ADMIN_DIST ?? join5(dirname2(fileURLToPath3(import.meta.url)), "../public/admin");
|
|
5776
5813
|
app.use("/admin", express.static(adminDist));
|
|
5777
|
-
app.get("/admin/*path", (_req, res) => res.sendFile(
|
|
5814
|
+
app.get("/admin/*path", (_req, res) => res.sendFile(join5(adminDist, "index.html")));
|
|
5778
5815
|
}
|
|
5779
5816
|
app.use(errorHandler);
|
|
5780
5817
|
var app_default = app;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plank-cms/plank",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.4",
|
|
4
4
|
"description": "Self-hosted headless CMS. Deploy in minutes on your own infrastructure.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/fs-extra": "^11.0.4",
|
|
57
57
|
"tsup": "^8.5.0",
|
|
58
|
-
"@plank-cms/
|
|
59
|
-
"@plank-cms/
|
|
60
|
-
"@plank-cms/schema": "0.27.
|
|
58
|
+
"@plank-cms/db": "0.27.4",
|
|
59
|
+
"@plank-cms/core": "0.27.4",
|
|
60
|
+
"@plank-cms/schema": "0.27.4"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build": "tsup",
|