litmus-cli 0.2.4 → 0.2.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"AA+BA;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB7E"}
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"AAgCA;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B7E"}
package/dist/lib/zip.js CHANGED
@@ -1,7 +1,8 @@
1
- import archiver from "archiver";
2
- import { createWriteStream, readFileSync, existsSync } from "fs";
1
+ import { readFileSync, existsSync } from "fs";
3
2
  import path from "path";
4
3
  import os from "os";
4
+ import fg from "fast-glob";
5
+ import { Zip } from "zip-lib";
5
6
  // Directories always excluded from submissions.
6
7
  // NOTE: .git is intentionally NOT excluded — git history is included so the
7
8
  // analysis backend can run parse_git_history() on the submission.
@@ -37,22 +38,27 @@ const ALWAYS_EXCLUDE = [
37
38
  */
38
39
  export async function createSubmissionZip(projectDir) {
39
40
  const tmpFile = path.join(os.tmpdir(), `litmus-submission-${Date.now()}.zip`);
40
- const output = createWriteStream(tmpFile);
41
- const archive = archiver("zip", { zlib: { level: 6 } });
42
- return new Promise((resolve, reject) => {
43
- output.on("close", () => resolve(tmpFile));
44
- archive.on("error", reject);
45
- archive.pipe(output);
46
- // Compute glob patterns to ignore
47
- const ignoredGlobs = buildIgnoreGlobs(projectDir);
48
- // Add the project directory contents (not the directory itself)
49
- archive.glob("**/*", {
50
- cwd: projectDir,
51
- dot: true, // Include dotfiles like .litmus/
52
- ignore: ignoredGlobs,
53
- });
54
- archive.finalize();
41
+ // Compute glob patterns to ignore
42
+ const ignoredGlobs = buildIgnoreGlobs(projectDir);
43
+ // Find all files, including dotfiles
44
+ const files = await fg(["**/*"], {
45
+ cwd: projectDir,
46
+ dot: true,
47
+ onlyFiles: true,
48
+ followSymbolicLinks: false,
49
+ ignore: ignoredGlobs,
55
50
  });
51
+ // Always include activity log if it exists
52
+ const activityPath = ".litmus/activity.jsonl";
53
+ if (existsSync(path.join(projectDir, activityPath)) && !files.includes(activityPath)) {
54
+ files.push(activityPath);
55
+ }
56
+ const zip = new Zip({ compressionLevel: 6 });
57
+ for (const file of files) {
58
+ zip.addFile(path.join(projectDir, file), file);
59
+ }
60
+ await zip.archive(tmpFile);
61
+ return tmpFile;
56
62
  }
57
63
  function buildIgnoreGlobs(projectDir) {
58
64
  const patterns = [];
@@ -1 +1 @@
1
- {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litmus-cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "CLI tool for Litmus engineering assessments",
5
5
  "license": "MIT",
6
6
  "author": "elenazhao",
@@ -16,16 +16,15 @@
16
16
  "prepublishOnly": "npm run build"
17
17
  },
18
18
  "dependencies": {
19
- "archiver": "^7.0.1",
20
19
  "chalk": "^5.3.0",
21
20
  "chokidar": "^3.6.0",
22
21
  "commander": "^12.1.0",
23
- "node-fetch": "^3.3.2",
22
+ "fast-glob": "^3.3.3",
24
23
  "ora": "^8.1.1",
25
- "unzipper": "^0.12.3"
24
+ "unzipper": "^0.12.3",
25
+ "zip-lib": "^1.2.1"
26
26
  },
27
27
  "devDependencies": {
28
- "@types/archiver": "^6.0.3",
29
28
  "@types/node": "^20.0.0",
30
29
  "@types/unzipper": "^0.10.10",
31
30
  "typescript": "^5.4.5"
package/src/lib/zip.ts CHANGED
@@ -1,7 +1,8 @@
1
- import archiver from "archiver"
2
- import { createWriteStream, readFileSync, existsSync } from "fs"
1
+ import { readFileSync, existsSync } from "fs"
3
2
  import path from "path"
4
3
  import os from "os"
4
+ import fg from "fast-glob"
5
+ import { Zip } from "zip-lib"
5
6
 
6
7
  // Directories always excluded from submissions.
7
8
  // NOTE: .git is intentionally NOT excluded — git history is included so the
@@ -39,27 +40,32 @@ const ALWAYS_EXCLUDE = [
39
40
  */
40
41
  export async function createSubmissionZip(projectDir: string): Promise<string> {
41
42
  const tmpFile = path.join(os.tmpdir(), `litmus-submission-${Date.now()}.zip`)
42
- const output = createWriteStream(tmpFile)
43
43
 
44
- const archive = archiver("zip", { zlib: { level: 6 } })
44
+ // Compute glob patterns to ignore
45
+ const ignoredGlobs = buildIgnoreGlobs(projectDir)
45
46
 
46
- return new Promise((resolve, reject) => {
47
- output.on("close", () => resolve(tmpFile))
48
- archive.on("error", reject)
49
- archive.pipe(output)
47
+ // Find all files, including dotfiles
48
+ const files = await fg(["**/*"], {
49
+ cwd: projectDir,
50
+ dot: true,
51
+ onlyFiles: true,
52
+ followSymbolicLinks: false,
53
+ ignore: ignoredGlobs,
54
+ })
50
55
 
51
- // Compute glob patterns to ignore
52
- const ignoredGlobs = buildIgnoreGlobs(projectDir)
56
+ // Always include activity log if it exists
57
+ const activityPath = ".litmus/activity.jsonl"
58
+ if (existsSync(path.join(projectDir, activityPath)) && !files.includes(activityPath)) {
59
+ files.push(activityPath)
60
+ }
53
61
 
54
- // Add the project directory contents (not the directory itself)
55
- archive.glob("**/*", {
56
- cwd: projectDir,
57
- dot: true, // Include dotfiles like .litmus/
58
- ignore: ignoredGlobs,
59
- })
62
+ const zip = new Zip({ compressionLevel: 6 })
63
+ for (const file of files) {
64
+ zip.addFile(path.join(projectDir, file), file)
65
+ }
66
+ await zip.archive(tmpFile)
60
67
 
61
- archive.finalize()
62
- })
68
+ return tmpFile
63
69
  }
64
70
 
65
71
  function buildIgnoreGlobs(projectDir: string): string[] {