@vexblocks/cli 2.0.5 → 2.0.7

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.
Files changed (2) hide show
  1. package/dist/index.js +81 -9
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -138,6 +138,23 @@ async function mergePackageJson(targetPath, sourcePackageJson) {
138
138
  // src/utils/github.ts
139
139
  import path2 from "path";
140
140
  import fs2 from "fs-extra";
141
+ var BINARY_EXTENSIONS = /* @__PURE__ */ new Set([
142
+ ".png",
143
+ ".jpg",
144
+ ".jpeg",
145
+ ".gif",
146
+ ".webp",
147
+ ".ico",
148
+ ".woff",
149
+ ".woff2",
150
+ ".ttf",
151
+ ".otf",
152
+ ".eot",
153
+ ".pdf",
154
+ ".zip",
155
+ ".tar",
156
+ ".gz"
157
+ ]);
141
158
  async function fetchRemoteManifest() {
142
159
  const url = `${GITHUB_RAW_URL}/templates/manifest.json`;
143
160
  const response = await fetch(url);
@@ -164,10 +181,42 @@ async function downloadFile(remotePath, localPath, options) {
164
181
  throw new Error(`Failed to download ${remotePath}: ${response.statusText}`);
165
182
  }
166
183
  await fs2.ensureDir(path2.dirname(localPath));
167
- const content = await response.text();
168
- await fs2.writeFile(localPath, content, "utf-8");
184
+ const ext = path2.extname(localPath).toLowerCase();
185
+ if (BINARY_EXTENSIONS.has(ext)) {
186
+ const buffer = await response.arrayBuffer();
187
+ await fs2.writeFile(localPath, Buffer.from(buffer));
188
+ } else {
189
+ const content = await response.text();
190
+ await fs2.writeFile(localPath, content, "utf-8");
191
+ }
192
+ }
193
+ async function collectLocalFiles(dir) {
194
+ const entries = await fs2.readdir(dir, { withFileTypes: true });
195
+ const files = [];
196
+ for (const entry of entries) {
197
+ const full = path2.join(dir, entry.name);
198
+ if (entry.isDirectory()) {
199
+ files.push(...await collectLocalFiles(full));
200
+ } else {
201
+ files.push(full);
202
+ }
203
+ }
204
+ return files;
169
205
  }
170
- async function downloadAndExtractPackage(packagePath, targetDir, onProgress) {
206
+ async function removeEmptyDirs(dir) {
207
+ const entries = await fs2.readdir(dir, { withFileTypes: true });
208
+ for (const entry of entries) {
209
+ if (entry.isDirectory()) {
210
+ const full = path2.join(dir, entry.name);
211
+ await removeEmptyDirs(full);
212
+ const remaining = await fs2.readdir(full);
213
+ if (remaining.length === 0) {
214
+ await fs2.remove(full);
215
+ }
216
+ }
217
+ }
218
+ }
219
+ async function downloadAndExtractPackage(packagePath, targetDir, onProgress, options) {
171
220
  const treeUrl = `https://api.github.com/repos/${GITHUB_REPO}/git/trees/${GITHUB_BRANCH}?recursive=1`;
172
221
  const response = await fetch(treeUrl, {
173
222
  headers: {
@@ -182,6 +231,9 @@ async function downloadAndExtractPackage(packagePath, targetDir, onProgress) {
182
231
  const files = data.tree.filter(
183
232
  (item) => item.type === "blob" && item.path.startsWith(`${packagePath}/`)
184
233
  );
234
+ const remoteRelativePaths = new Set(
235
+ files.map((f) => f.path.slice(packagePath.length + 1))
236
+ );
185
237
  for (const file of files) {
186
238
  const relativePath = file.path.slice(packagePath.length + 1);
187
239
  const localPath = path2.join(targetDir, relativePath);
@@ -193,6 +245,16 @@ async function downloadAndExtractPackage(packagePath, targetDir, onProgress) {
193
245
  skipIfExists: isProtectedFile
194
246
  });
195
247
  }
248
+ if (options?.sync && await fs2.pathExists(targetDir)) {
249
+ const localFiles = await collectLocalFiles(targetDir);
250
+ for (const localFile of localFiles) {
251
+ const relPath = path2.relative(targetDir, localFile);
252
+ if (!remoteRelativePaths.has(relPath)) {
253
+ await fs2.remove(localFile);
254
+ }
255
+ }
256
+ await removeEmptyDirs(targetDir);
257
+ }
196
258
  }
197
259
  async function getPackageFiles(packagePath) {
198
260
  const treeUrl = `https://api.github.com/repos/${GITHUB_REPO}/git/trees/${GITHUB_BRANCH}?recursive=1`;
@@ -498,9 +560,14 @@ async function installPackage(cwd, pkg, version, manifest) {
498
560
  await installBackendPackage(targetPath, sourcePath, spinner);
499
561
  } else {
500
562
  await fs4.ensureDir(targetPath);
501
- await downloadAndExtractPackage(sourcePath, targetPath, (file) => {
502
- spinner.text = `Installing ${PACKAGE_NAMES[pkg]}... ${pc2.dim(file)}`;
503
- });
563
+ await downloadAndExtractPackage(
564
+ sourcePath,
565
+ targetPath,
566
+ (file) => {
567
+ spinner.text = `Installing ${PACKAGE_NAMES[pkg]}... ${pc2.dim(file)}`;
568
+ },
569
+ { sync: true }
570
+ );
504
571
  }
505
572
  const config = {
506
573
  version,
@@ -551,9 +618,14 @@ async function installBackendPackage(targetPath, sourcePath, spinner) {
551
618
  await mergeSchemaFile(existingSchemaPath, spinner);
552
619
  } else {
553
620
  await fs4.ensureDir(targetPath);
554
- await downloadAndExtractPackage(sourcePath, targetPath, (file) => {
555
- spinner.text = `Installing backend... ${pc2.dim(file)}`;
556
- });
621
+ await downloadAndExtractPackage(
622
+ sourcePath,
623
+ targetPath,
624
+ (file) => {
625
+ spinner.text = `Installing backend... ${pc2.dim(file)}`;
626
+ },
627
+ { sync: true }
628
+ );
557
629
  }
558
630
  spinner.text = "Merging package.json...";
559
631
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vexblocks/cli",
3
- "version": "2.0.5",
3
+ "version": "2.0.7",
4
4
  "description": "CLI for adding VexBlocks Headless CMS to your Turborepo project",
5
5
  "keywords": [
6
6
  "cms",
@@ -46,15 +46,15 @@
46
46
  "@inquirer/prompts": "^8.3.0",
47
47
  "commander": "^14.0.3",
48
48
  "diff": "^8.0.3",
49
- "fs-extra": "^11.3.3",
49
+ "fs-extra": "^11.3.4",
50
50
  "ora": "^9.3.0",
51
51
  "picocolors": "^1.1.1",
52
- "tar": "^7.5.9"
52
+ "tar": "^7.5.10"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/diff": "^8.0.0",
56
56
  "@types/fs-extra": "^11.0.4",
57
- "@types/node": "^25.3.3",
57
+ "@types/node": "^25.3.5",
58
58
  "tsup": "^8.5.1",
59
59
  "typescript": "^5.9.3"
60
60
  },