@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.
@@ -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-CrCKvadB.js"></script>
16
- <link rel="stylesheet" crossorigin href="/admin/assets/index-BTElP7oS.css">
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 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.3";
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 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-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 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
  });
@@ -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);