@plank-cms/plank 0.27.2 → 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.
@@ -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-Coy8NeXd.js"></script>
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 fs from "fs-extra";
7
+ import { resolve, join as join2 } from "path";
8
+ import fs2 from "fs-extra";
9
9
  import { execa } from "execa";
10
- var PACKAGE_VERSION = "0.27.2";
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 fs.pathExists(projectDir)) {
62
- const entries = await fs.readdir(projectDir);
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 fs.ensureDir(projectDir);
71
- await fs.writeFile(join(projectDir, ".env"), buildEnv(generateSecret(), generateSecret()));
72
- await fs.writeJSON(join(projectDir, "package.json"), buildPackageJson(name), { spaces: 2 });
73
- await fs.writeFile(join(projectDir, ".gitignore"), ".env\nnode_modules\n");
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("npm", ["install"], { cwd: projectDir });
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("npm start")}`,
187
+ ` ${chalk.cyan(startCommand)}`,
92
188
  "",
93
189
  `To update Plank later:`,
94
190
  "",
95
- ` ${chalk.cyan("npm run update")}`
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 join2, resolve as resolve2 } from "path";
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 = join2(dirname(fileURLToPath(import.meta.url)), "admin");
109
- const { start: startServer } = await import("./server-5JMBMGIN.js");
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 fs2 from "fs-extra";
170
- import { join as join3 } from "path";
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 = join3(process.cwd(), "package.json");
175
- const hasPackageJson = await fs2.pathExists(packageJsonPath);
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 fs2.readJSON(packageJsonPath);
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("npm", ["install", "--save-exact", target], {
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 join4, dirname as dirname2 } from "path";
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: UPDATE_COMMAND,
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 ?? join4(dirname2(fileURLToPath3(import.meta.url)), "../public/admin");
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(join4(adminDist, "index.html")));
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.2",
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/core": "0.27.2",
59
- "@plank-cms/db": "0.27.2",
60
- "@plank-cms/schema": "0.27.2"
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",