mobbdev 1.0.87 → 1.0.90

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.mjs +163 -132
  2. package/package.json +14 -12
package/dist/index.mjs CHANGED
@@ -11,14 +11,15 @@ import Debug21 from "debug";
11
11
  import { hideBin } from "yargs/helpers";
12
12
 
13
13
  // src/args/commands/convert_to_sarif.ts
14
- import fs4 from "node:fs";
14
+ import fs4 from "fs";
15
15
 
16
16
  // src/commands/convert_to_sarif.ts
17
- import fs3 from "node:fs";
18
- import path3 from "node:path";
17
+ import fs3 from "fs";
18
+ import path3 from "path";
19
19
 
20
20
  // src/commands/fpr_stream_parser.ts
21
- import fs from "node:fs";
21
+ import fs from "fs";
22
+ import readline from "readline";
22
23
  import sax from "sax";
23
24
  var BaseStreamParser = class {
24
25
  constructor(parser) {
@@ -134,14 +135,17 @@ var UnifiedNodePoolParser = class extends BaseStreamParser {
134
135
  }
135
136
  };
136
137
  var VulnerabilityParser = class extends BaseStreamParser {
137
- constructor() {
138
- super(...arguments);
139
- __publicField(this, "vulnerabilities", []);
138
+ constructor(parser, tmpStorageFilePath) {
139
+ super(parser);
140
140
  __publicField(this, "isInVulnerability", false);
141
141
  __publicField(this, "codePoints", []);
142
142
  __publicField(this, "metadata", {});
143
143
  __publicField(this, "metaInfo", {});
144
144
  __publicField(this, "groupName", "");
145
+ __publicField(this, "tmpStorageFileWriter");
146
+ __publicField(this, "tmpStorageFilePath");
147
+ this.tmpStorageFilePath = tmpStorageFilePath;
148
+ this.tmpStorageFileWriter = fs.createWriteStream(tmpStorageFilePath);
145
149
  }
146
150
  onOpenTag(tag) {
147
151
  super.onOpenTag(tag);
@@ -195,25 +199,43 @@ var VulnerabilityParser = class extends BaseStreamParser {
195
199
  onCloseTag() {
196
200
  if (this.getPathString() === "FVDL > Vulnerabilities > Vulnerability") {
197
201
  this.isInVulnerability = false;
198
- this.vulnerabilities.push({
199
- nodes: this.codePoints,
200
- instanceID: this.metadata["InstanceID"] ?? "",
201
- instanceSeverity: this.metadata["InstanceSeverity"] ?? "",
202
- confidence: this.metadata["Confidence"] ?? "",
203
- classID: this.metadata["ClassID"] ?? "",
204
- type: this.metadata["Type"] ?? "",
205
- subtype: this.metadata["Subtype"] ?? "",
206
- metaInfo: this.metaInfo
207
- });
202
+ this.tmpStorageFileWriter.write(
203
+ JSON.stringify({
204
+ nodes: this.codePoints,
205
+ instanceID: this.metadata["InstanceID"] ?? "",
206
+ instanceSeverity: this.metadata["InstanceSeverity"] ?? "",
207
+ confidence: this.metadata["Confidence"] ?? "",
208
+ classID: this.metadata["ClassID"] ?? "",
209
+ type: this.metadata["Type"] ?? "",
210
+ subtype: this.metadata["Subtype"] ?? "",
211
+ metaInfo: this.metaInfo
212
+ }) + "\n"
213
+ );
208
214
  }
209
215
  super.onCloseTag();
210
216
  }
211
- getVulnerabilities() {
212
- return this.vulnerabilities;
217
+ async *getVulnerabilities() {
218
+ await new Promise((r) => this.tmpStorageFileWriter.end(r));
219
+ const rl = readline.createInterface({
220
+ input: fs.createReadStream(this.tmpStorageFilePath),
221
+ crlfDelay: Infinity
222
+ });
223
+ for await (const line of rl) {
224
+ if (line) {
225
+ yield JSON.parse(line);
226
+ }
227
+ }
213
228
  }
214
229
  };
215
230
  function initSaxParser(filepath) {
216
- const parser = sax.createStream(true);
231
+ const parser = sax.createStream(true, {
232
+ // All these flags help to improve parsing speed a lot.
233
+ trim: false,
234
+ normalize: false,
235
+ lowercase: false,
236
+ xmlns: false,
237
+ position: false
238
+ });
217
239
  const awaiter = new Promise((resolve, reject) => {
218
240
  parser.on("end", () => resolve(true));
219
241
  parser.on("error", (e) => reject(e));
@@ -221,7 +243,10 @@ function initSaxParser(filepath) {
221
243
  return {
222
244
  parser,
223
245
  parse: async () => {
224
- fs.createReadStream(filepath).pipe(parser);
246
+ fs.createReadStream(filepath, {
247
+ // Set chunk size to 100 MB. The default is 16 KB, which makes the process too slow.
248
+ highWaterMark: 100 * 1024 * 1024
249
+ }).pipe(parser);
225
250
  await awaiter;
226
251
  }
227
252
  };
@@ -409,6 +434,7 @@ var IssueType_Enum = /* @__PURE__ */ ((IssueType_Enum2) => {
409
434
  IssueType_Enum2["SystemExitShouldReraise"] = "SYSTEM_EXIT_SHOULD_RERAISE";
410
435
  IssueType_Enum2["SystemInformationLeak"] = "SYSTEM_INFORMATION_LEAK";
411
436
  IssueType_Enum2["SystemInformationLeakExternal"] = "SYSTEM_INFORMATION_LEAK_EXTERNAL";
437
+ IssueType_Enum2["TarSlip"] = "TAR_SLIP";
412
438
  IssueType_Enum2["TrustBoundaryViolation"] = "TRUST_BOUNDARY_VIOLATION";
413
439
  IssueType_Enum2["TypeConfusion"] = "TYPE_CONFUSION";
414
440
  IssueType_Enum2["UncheckedLoopCondition"] = "UNCHECKED_LOOP_CONDITION";
@@ -947,71 +973,71 @@ var GetMcpFixesDocument = `
947
973
  var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
948
974
  function getSdk(client, withWrapper = defaultWrapper) {
949
975
  return {
950
- Me(variables, requestHeaders) {
951
- return withWrapper((wrappedRequestHeaders) => client.request(MeDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "Me", "query", variables);
976
+ Me(variables, requestHeaders, signal) {
977
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: MeDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "Me", "query", variables);
952
978
  },
953
- getOrgAndProjectId(variables, requestHeaders) {
954
- return withWrapper((wrappedRequestHeaders) => client.request(GetOrgAndProjectIdDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getOrgAndProjectId", "query", variables);
979
+ getOrgAndProjectId(variables, requestHeaders, signal) {
980
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetOrgAndProjectIdDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getOrgAndProjectId", "query", variables);
955
981
  },
956
- GetEncryptedApiToken(variables, requestHeaders) {
957
- return withWrapper((wrappedRequestHeaders) => client.request(GetEncryptedApiTokenDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "GetEncryptedApiToken", "query", variables);
982
+ GetEncryptedApiToken(variables, requestHeaders, signal) {
983
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetEncryptedApiTokenDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "GetEncryptedApiToken", "query", variables);
958
984
  },
959
- FixReportState(variables, requestHeaders) {
960
- return withWrapper((wrappedRequestHeaders) => client.request(FixReportStateDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "FixReportState", "query", variables);
985
+ FixReportState(variables, requestHeaders, signal) {
986
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: FixReportStateDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "FixReportState", "query", variables);
961
987
  },
962
- GetVulnerabilityReportPaths(variables, requestHeaders) {
963
- return withWrapper((wrappedRequestHeaders) => client.request(GetVulnerabilityReportPathsDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "GetVulnerabilityReportPaths", "query", variables);
988
+ GetVulnerabilityReportPaths(variables, requestHeaders, signal) {
989
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetVulnerabilityReportPathsDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "GetVulnerabilityReportPaths", "query", variables);
964
990
  },
965
- getAnalysisSubscription(variables, requestHeaders) {
966
- return withWrapper((wrappedRequestHeaders) => client.request(GetAnalysisSubscriptionDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getAnalysisSubscription", "subscription", variables);
991
+ getAnalysisSubscription(variables, requestHeaders, signal) {
992
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetAnalysisSubscriptionDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getAnalysisSubscription", "subscription", variables);
967
993
  },
968
- getAnalysis(variables, requestHeaders) {
969
- return withWrapper((wrappedRequestHeaders) => client.request(GetAnalysisDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getAnalysis", "query", variables);
994
+ getAnalysis(variables, requestHeaders, signal) {
995
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetAnalysisDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getAnalysis", "query", variables);
970
996
  },
971
- getFixes(variables, requestHeaders) {
972
- return withWrapper((wrappedRequestHeaders) => client.request(GetFixesDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getFixes", "query", variables);
997
+ getFixes(variables, requestHeaders, signal) {
998
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetFixesDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getFixes", "query", variables);
973
999
  },
974
- getVulByNodesMetadata(variables, requestHeaders) {
975
- return withWrapper((wrappedRequestHeaders) => client.request(GetVulByNodesMetadataDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getVulByNodesMetadata", "query", variables);
1000
+ getVulByNodesMetadata(variables, requestHeaders, signal) {
1001
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetVulByNodesMetadataDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getVulByNodesMetadata", "query", variables);
976
1002
  },
977
- getFalsePositive(variables, requestHeaders) {
978
- return withWrapper((wrappedRequestHeaders) => client.request(GetFalsePositiveDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "getFalsePositive", "query", variables);
1003
+ getFalsePositive(variables, requestHeaders, signal) {
1004
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetFalsePositiveDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getFalsePositive", "query", variables);
979
1005
  },
980
- updateScmToken(variables, requestHeaders) {
981
- return withWrapper((wrappedRequestHeaders) => client.request(UpdateScmTokenDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "updateScmToken", "mutation", variables);
1006
+ updateScmToken(variables, requestHeaders, signal) {
1007
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: UpdateScmTokenDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "updateScmToken", "mutation", variables);
982
1008
  },
983
- uploadS3BucketInfo(variables, requestHeaders) {
984
- return withWrapper((wrappedRequestHeaders) => client.request(UploadS3BucketInfoDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "uploadS3BucketInfo", "mutation", variables);
1009
+ uploadS3BucketInfo(variables, requestHeaders, signal) {
1010
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: UploadS3BucketInfoDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "uploadS3BucketInfo", "mutation", variables);
985
1011
  },
986
- DigestVulnerabilityReport(variables, requestHeaders) {
987
- return withWrapper((wrappedRequestHeaders) => client.request(DigestVulnerabilityReportDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "DigestVulnerabilityReport", "mutation", variables);
1012
+ DigestVulnerabilityReport(variables, requestHeaders, signal) {
1013
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: DigestVulnerabilityReportDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "DigestVulnerabilityReport", "mutation", variables);
988
1014
  },
989
- SubmitVulnerabilityReport(variables, requestHeaders) {
990
- return withWrapper((wrappedRequestHeaders) => client.request(SubmitVulnerabilityReportDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "SubmitVulnerabilityReport", "mutation", variables);
1015
+ SubmitVulnerabilityReport(variables, requestHeaders, signal) {
1016
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: SubmitVulnerabilityReportDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "SubmitVulnerabilityReport", "mutation", variables);
991
1017
  },
992
- CreateCommunityUser(variables, requestHeaders) {
993
- return withWrapper((wrappedRequestHeaders) => client.request(CreateCommunityUserDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "CreateCommunityUser", "mutation", variables);
1018
+ CreateCommunityUser(variables, requestHeaders, signal) {
1019
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: CreateCommunityUserDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "CreateCommunityUser", "mutation", variables);
994
1020
  },
995
- CreateCliLogin(variables, requestHeaders) {
996
- return withWrapper((wrappedRequestHeaders) => client.request(CreateCliLoginDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "CreateCliLogin", "mutation", variables);
1021
+ CreateCliLogin(variables, requestHeaders, signal) {
1022
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: CreateCliLoginDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "CreateCliLogin", "mutation", variables);
997
1023
  },
998
- performCliLogin(variables, requestHeaders) {
999
- return withWrapper((wrappedRequestHeaders) => client.request(PerformCliLoginDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "performCliLogin", "mutation", variables);
1024
+ performCliLogin(variables, requestHeaders, signal) {
1025
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: PerformCliLoginDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "performCliLogin", "mutation", variables);
1000
1026
  },
1001
- CreateProject(variables, requestHeaders) {
1002
- return withWrapper((wrappedRequestHeaders) => client.request(CreateProjectDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "CreateProject", "mutation", variables);
1027
+ CreateProject(variables, requestHeaders, signal) {
1028
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: CreateProjectDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "CreateProject", "mutation", variables);
1003
1029
  },
1004
- validateRepoUrl(variables, requestHeaders) {
1005
- return withWrapper((wrappedRequestHeaders) => client.request(ValidateRepoUrlDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "validateRepoUrl", "query", variables);
1030
+ validateRepoUrl(variables, requestHeaders, signal) {
1031
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: ValidateRepoUrlDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "validateRepoUrl", "query", variables);
1006
1032
  },
1007
- gitReference(variables, requestHeaders) {
1008
- return withWrapper((wrappedRequestHeaders) => client.request(GitReferenceDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "gitReference", "query", variables);
1033
+ gitReference(variables, requestHeaders, signal) {
1034
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GitReferenceDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "gitReference", "query", variables);
1009
1035
  },
1010
- autoPrAnalysis(variables, requestHeaders) {
1011
- return withWrapper((wrappedRequestHeaders) => client.request(AutoPrAnalysisDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "autoPrAnalysis", "mutation", variables);
1036
+ autoPrAnalysis(variables, requestHeaders, signal) {
1037
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: AutoPrAnalysisDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "autoPrAnalysis", "mutation", variables);
1012
1038
  },
1013
- GetMCPFixes(variables, requestHeaders) {
1014
- return withWrapper((wrappedRequestHeaders) => client.request(GetMcpFixesDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), "GetMCPFixes", "query", variables);
1039
+ GetMCPFixes(variables, requestHeaders, signal) {
1040
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetMcpFixesDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "GetMCPFixes", "query", variables);
1015
1041
  }
1016
1042
  };
1017
1043
  }
@@ -1445,7 +1471,8 @@ var issueTypeMap = {
1445
1471
  ["WILDCARD_IMPORTS" /* WildcardImports */]: "Wildcard Imports should not be used",
1446
1472
  ["AVOID_IDENTITY_COMPARISON_CACHED_TYPES" /* AvoidIdentityComparisonCachedTypes */]: "Avoid Identity Comparison of Cached Types",
1447
1473
  ["AVOID_BUILTIN_SHADOWING" /* AvoidBuiltinShadowing */]: "Avoid Builtin Shadowing",
1448
- ["IMPROPER_STRING_FORMATTING" /* ImproperStringFormatting */]: "Improper String Formatting"
1474
+ ["IMPROPER_STRING_FORMATTING" /* ImproperStringFormatting */]: "Improper String Formatting",
1475
+ ["TAR_SLIP" /* TarSlip */]: "Tar Slip"
1449
1476
  };
1450
1477
  var issueTypeZ = z5.nativeEnum(IssueType_Enum);
1451
1478
  var getIssueTypeFriendlyString = (issueType) => {
@@ -1908,7 +1935,7 @@ var ConvertToSarifInputFileFormat = /* @__PURE__ */ ((ConvertToSarifInputFileFor
1908
1935
  var DEFUALT_ADO_ORIGIN = scmCloudUrl.Ado;
1909
1936
 
1910
1937
  // src/features/analysis/scm/ado/utils.ts
1911
- import querystring from "node:querystring";
1938
+ import querystring from "querystring";
1912
1939
  import * as api from "azure-devops-node-api";
1913
1940
  import Debug from "debug";
1914
1941
  import { z as z17 } from "zod";
@@ -2178,7 +2205,8 @@ var fixDetailsData = {
2178
2205
  ["AVOID_IDENTITY_COMPARISON_CACHED_TYPES" /* AvoidIdentityComparisonCachedTypes */]: void 0,
2179
2206
  ["AVOID_BUILTIN_SHADOWING" /* AvoidBuiltinShadowing */]: void 0,
2180
2207
  ["IMPROPER_STRING_FORMATTING" /* ImproperStringFormatting */]: void 0,
2181
- ["WILDCARD_IMPORTS" /* WildcardImports */]: void 0
2208
+ ["WILDCARD_IMPORTS" /* WildcardImports */]: void 0,
2209
+ ["TAR_SLIP" /* TarSlip */]: void 0
2182
2210
  };
2183
2211
 
2184
2212
  // src/features/analysis/scm/shared/src/commitDescriptionMarkup.ts
@@ -4862,7 +4890,7 @@ async function getAdoRepoList({
4862
4890
  }
4863
4891
 
4864
4892
  // src/features/analysis/scm/ado/AdoSCMLib.ts
4865
- import { setTimeout as setTimeout2 } from "node:timers/promises";
4893
+ import { setTimeout as setTimeout2 } from "timers/promises";
4866
4894
 
4867
4895
  // src/features/analysis/scm/scmSubmit/index.ts
4868
4896
  import { simpleGit } from "simple-git";
@@ -5143,7 +5171,7 @@ var AdoSCMLib = class extends SCMLib {
5143
5171
  };
5144
5172
 
5145
5173
  // src/features/analysis/scm/bitbucket/bitbucket.ts
5146
- import querystring2 from "node:querystring";
5174
+ import querystring2 from "querystring";
5147
5175
  import * as bitbucketPkgNode from "bitbucket";
5148
5176
  import bitbucketPkg from "bitbucket";
5149
5177
  import Debug2 from "debug";
@@ -5463,7 +5491,7 @@ async function getRepositoriesByWorkspace(bitbucketClient, { workspaceSlug }) {
5463
5491
  }
5464
5492
 
5465
5493
  // src/features/analysis/scm/bitbucket/BitbucketSCMLib.ts
5466
- import { setTimeout as setTimeout3 } from "node:timers/promises";
5494
+ import { setTimeout as setTimeout3 } from "timers/promises";
5467
5495
  import { z as z20 } from "zod";
5468
5496
  function getUserAndPassword(token) {
5469
5497
  const [username, password] = token.split(":");
@@ -6500,7 +6528,7 @@ var GithubSCMLib = class extends SCMLib {
6500
6528
  };
6501
6529
 
6502
6530
  // src/features/analysis/scm/gitlab/gitlab.ts
6503
- import querystring3 from "node:querystring";
6531
+ import querystring3 from "querystring";
6504
6532
  import {
6505
6533
  createRequesterFn
6506
6534
  } from "@gitbeaker/requester-utils";
@@ -7206,8 +7234,8 @@ __export(utils_exports, {
7206
7234
  });
7207
7235
 
7208
7236
  // src/utils/dirname.ts
7209
- import path from "node:path";
7210
- import { fileURLToPath } from "node:url";
7237
+ import path from "path";
7238
+ import { fileURLToPath } from "url";
7211
7239
  function getDirName() {
7212
7240
  return path.dirname(fileURLToPath(import.meta.url));
7213
7241
  }
@@ -7216,9 +7244,9 @@ function getTopLevelDirName(fullPath) {
7216
7244
  }
7217
7245
 
7218
7246
  // src/utils/keypress.ts
7219
- import readline from "node:readline";
7247
+ import readline2 from "readline";
7220
7248
  async function keypress() {
7221
- const rl = readline.createInterface({
7249
+ const rl = readline2.createInterface({
7222
7250
  input: process.stdin,
7223
7251
  output: process.stdout
7224
7252
  });
@@ -7275,8 +7303,8 @@ function Spinner({ ci = false } = {}) {
7275
7303
  }
7276
7304
 
7277
7305
  // src/utils/check_node_version.ts
7278
- import fs2 from "node:fs";
7279
- import path2 from "node:path";
7306
+ import fs2 from "fs";
7307
+ import path2 from "path";
7280
7308
  import semver from "semver";
7281
7309
  function getPackageJson() {
7282
7310
  let manifestPath = path2.join(getDirName(), "../package.json");
@@ -7300,8 +7328,8 @@ var CliError = class extends Error {
7300
7328
  };
7301
7329
 
7302
7330
  // src/commands/convert_to_sarif.ts
7303
- import AdmZip from "adm-zip";
7304
7331
  import multimatch from "multimatch";
7332
+ import StreamZip from "node-stream-zip";
7305
7333
  import tmp from "tmp";
7306
7334
  async function convertToSarif(options) {
7307
7335
  switch (options.inputFileFormat) {
@@ -7315,8 +7343,9 @@ async function convertToSarif(options) {
7315
7343
  }
7316
7344
  }
7317
7345
  async function convertFprToSarif(inputFilePath, outputFilePath, codePathPatterns) {
7318
- const zipIn = new AdmZip(inputFilePath);
7319
- if (!zipIn.getEntry("audit.fvdl")) {
7346
+ const zipIn = new StreamZip.async({ file: inputFilePath });
7347
+ const zipInEntries = await zipIn.entries();
7348
+ if (!("audit.fvdl" in zipInEntries)) {
7320
7349
  throw new CliError(
7321
7350
  "\nError: the input file should be in a valid Fortify FPR format."
7322
7351
  );
@@ -7325,12 +7354,12 @@ async function convertFprToSarif(inputFilePath, outputFilePath, codePathPatterns
7325
7354
  unsafeCleanup: true
7326
7355
  });
7327
7356
  try {
7328
- zipIn.extractEntryTo("audit.fvdl", tmpObj.name);
7329
- const auditFvdlSaxParser = initSaxParser(
7330
- path3.join(tmpObj.name, "audit.fvdl")
7331
- );
7357
+ const auditFvdlPath = path3.join(tmpObj.name, "audit.fvdl");
7358
+ await zipIn.extract("audit.fvdl", auditFvdlPath);
7359
+ const auditFvdlSaxParser = initSaxParser(auditFvdlPath);
7332
7360
  const vulnerabilityParser = new VulnerabilityParser(
7333
- auditFvdlSaxParser.parser
7361
+ auditFvdlSaxParser.parser,
7362
+ path3.join(tmpObj.name, "vulns.json")
7334
7363
  );
7335
7364
  const unifiedNodePoolParser = new UnifiedNodePoolParser(
7336
7365
  auditFvdlSaxParser.parser
@@ -7340,17 +7369,16 @@ async function convertFprToSarif(inputFilePath, outputFilePath, codePathPatterns
7340
7369
  );
7341
7370
  let auditMetadataParser = null;
7342
7371
  await auditFvdlSaxParser.parse();
7343
- if (zipIn.getEntry("audit.xml")) {
7344
- zipIn.extractEntryTo("audit.xml", tmpObj.name);
7345
- const auditXmlSaxParser = initSaxParser(
7346
- path3.join(tmpObj.name, "audit.xml")
7347
- );
7372
+ if ("audit.xml" in zipInEntries) {
7373
+ const auditXmlPath = path3.join(tmpObj.name, "audit.xml");
7374
+ await zipIn.extract("audit.xml", auditXmlPath);
7375
+ const auditXmlSaxParser = initSaxParser(auditXmlPath);
7348
7376
  auditMetadataParser = new AuditMetadataParser(auditXmlSaxParser.parser);
7349
7377
  await auditXmlSaxParser.parse();
7350
7378
  }
7351
- fs3.writeFileSync(
7352
- outputFilePath,
7353
- `{
7379
+ await zipIn.close();
7380
+ const writer = fs3.createWriteStream(outputFilePath);
7381
+ writer.write(`{
7354
7382
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
7355
7383
  "version": "2.1.0",
7356
7384
  "runs": [
@@ -7361,23 +7389,26 @@ async function convertFprToSarif(inputFilePath, outputFilePath, codePathPatterns
7361
7389
  }
7362
7390
  },
7363
7391
  "results": [
7364
- `
7365
- );
7366
- const filteredVulns = vulnerabilityParser.getVulnerabilities().map(
7367
- (vulnerability) => fortifyVulnerabilityToSarifResult(
7392
+ `);
7393
+ let isFirstVuln = true;
7394
+ for await (const vulnerability of vulnerabilityParser.getVulnerabilities()) {
7395
+ const sarifResult = fortifyVulnerabilityToSarifResult(
7368
7396
  vulnerability,
7369
7397
  auditMetadataParser,
7370
7398
  reportMetadataParser,
7371
7399
  unifiedNodePoolParser
7372
- )
7373
- ).filter((sarifResult) => filterSarifResult(sarifResult, codePathPatterns));
7374
- filteredVulns.forEach((sarifResult, index) => {
7375
- fs3.appendFileSync(outputFilePath, JSON.stringify(sarifResult, null, 2));
7376
- if (index !== filteredVulns.length - 1) {
7377
- fs3.appendFileSync(outputFilePath, ",\n");
7400
+ );
7401
+ if (filterSarifResult(sarifResult, codePathPatterns)) {
7402
+ if (isFirstVuln) {
7403
+ isFirstVuln = false;
7404
+ } else {
7405
+ writer.write(",\n");
7406
+ }
7407
+ writer.write(JSON.stringify(sarifResult, null, 2));
7378
7408
  }
7379
- });
7380
- fs3.appendFileSync(outputFilePath, "\n]}]}");
7409
+ }
7410
+ writer.write("\n]}]}");
7411
+ await new Promise((r) => writer.end(r));
7381
7412
  } finally {
7382
7413
  tmpObj.removeCallback();
7383
7414
  }
@@ -7451,8 +7482,8 @@ function fortifyNodesToSarifLocations(nodes, unifiedNodePoolParser) {
7451
7482
  import chalk2 from "chalk";
7452
7483
 
7453
7484
  // src/constants.ts
7454
- import path4 from "node:path";
7455
- import { fileURLToPath as fileURLToPath2 } from "node:url";
7485
+ import path4 from "path";
7486
+ import { fileURLToPath as fileURLToPath2 } from "url";
7456
7487
  import chalk from "chalk";
7457
7488
  import Debug4 from "debug";
7458
7489
  import * as dotenv from "dotenv";
@@ -7706,18 +7737,18 @@ import chalk10 from "chalk";
7706
7737
  import yargs from "yargs/yargs";
7707
7738
 
7708
7739
  // src/args/commands/analyze.ts
7709
- import fs7 from "node:fs";
7740
+ import fs7 from "fs";
7710
7741
 
7711
7742
  // src/commands/index.ts
7712
- import crypto from "node:crypto";
7713
- import os from "node:os";
7743
+ import crypto from "crypto";
7744
+ import os from "os";
7714
7745
 
7715
7746
  // src/features/analysis/index.ts
7716
- import fs6 from "node:fs";
7717
- import fsPromises from "node:fs/promises";
7718
- import path7 from "node:path";
7719
- import { env as env2 } from "node:process";
7720
- import { pipeline } from "node:stream/promises";
7747
+ import fs6 from "fs";
7748
+ import fsPromises from "fs/promises";
7749
+ import path7 from "path";
7750
+ import { env as env2 } from "process";
7751
+ import { pipeline } from "stream/promises";
7721
7752
  import chalk5 from "chalk";
7722
7753
  import Configstore from "configstore";
7723
7754
  import Debug18 from "debug";
@@ -8905,9 +8936,9 @@ var GQLClient = class {
8905
8936
  };
8906
8937
 
8907
8938
  // src/features/analysis/pack.ts
8908
- import fs5 from "node:fs";
8909
- import path5 from "node:path";
8910
- import AdmZip2 from "adm-zip";
8939
+ import fs5 from "fs";
8940
+ import path5 from "path";
8941
+ import AdmZip from "adm-zip";
8911
8942
  import Debug13 from "debug";
8912
8943
  import { globby } from "globby";
8913
8944
  import { isBinary } from "istextorbinary";
@@ -8969,7 +9000,7 @@ async function pack(srcDirPath, vulnFiles, isIncludeAllFiles = false) {
8969
9000
  dot: true
8970
9001
  });
8971
9002
  debug13("files found %d", filepaths.length);
8972
- const zip = new AdmZip2();
9003
+ const zip = new AdmZip();
8973
9004
  debug13("compressing files");
8974
9005
  for (const filepath of filepaths) {
8975
9006
  const absFilepath = path5.join(srcDirPath, filepath.toString());
@@ -8999,8 +9030,8 @@ async function pack(srcDirPath, vulnFiles, isIncludeAllFiles = false) {
8999
9030
  }
9000
9031
  async function repackFpr(fprPath) {
9001
9032
  debug13("repack fpr file %s", fprPath);
9002
- const zipIn = new AdmZip2(fprPath);
9003
- const zipOut = new AdmZip2();
9033
+ const zipIn = new AdmZip(fprPath);
9034
+ const zipOut = new AdmZip();
9004
9035
  const mappingXML = zipIn.readAsText("src-archive/index.xml", "utf-8");
9005
9036
  const filesMapping = FPR_SOURCE_CODE_FILE_MAPPING_SCHEMA.parse(
9006
9037
  await parseStringPromise(mappingXML)
@@ -9082,14 +9113,14 @@ async function snykArticlePrompt() {
9082
9113
  }
9083
9114
 
9084
9115
  // src/features/analysis/scanners/checkmarx.ts
9085
- import { createRequire } from "node:module";
9116
+ import { createRequire } from "module";
9086
9117
 
9087
9118
  // src/post_install/constants.mjs
9088
9119
  var cxOperatingSystemSupportMessage = `Your operating system does not support checkmarx.
9089
9120
  You can see the list of supported operating systems here: https://github.com/Checkmarx/ast-cli#releases`;
9090
9121
 
9091
9122
  // src/utils/child_process.ts
9092
- import cp from "node:child_process";
9123
+ import cp from "child_process";
9093
9124
  import Debug14 from "debug";
9094
9125
  import * as process2 from "process";
9095
9126
  function createFork({ args, processPath, name }, options) {
@@ -9258,7 +9289,7 @@ async function validateCheckamxCredentials() {
9258
9289
  }
9259
9290
 
9260
9291
  // src/features/analysis/scanners/snyk.ts
9261
- import { createRequire as createRequire2 } from "node:module";
9292
+ import { createRequire as createRequire2 } from "module";
9262
9293
  import chalk4 from "chalk";
9263
9294
  import Debug16 from "debug";
9264
9295
  import { createSpinner as createSpinner3 } from "nanospinner";
@@ -10662,8 +10693,8 @@ var GitService = class {
10662
10693
  };
10663
10694
 
10664
10695
  // src/mcp/services/PathValidation.ts
10665
- import fs8 from "node:fs";
10666
- import path10 from "node:path";
10696
+ import fs8 from "fs";
10697
+ import path10 from "path";
10667
10698
  var PathValidation = class {
10668
10699
  /**
10669
10700
  * Validates a path for MCP usage - combines security and existence checks
@@ -10707,9 +10738,9 @@ var PathValidation = class {
10707
10738
  };
10708
10739
 
10709
10740
  // src/mcp/services/FilePacking.ts
10710
- import fs9 from "node:fs";
10711
- import path11 from "node:path";
10712
- import AdmZip3 from "adm-zip";
10741
+ import fs9 from "fs";
10742
+ import path11 from "path";
10743
+ import AdmZip2 from "adm-zip";
10713
10744
  import { isBinary as isBinary2 } from "istextorbinary";
10714
10745
  var MAX_FILE_SIZE2 = 1024 * 1024 * 5;
10715
10746
  var EXCLUDED_FILE_PATTERNS = [
@@ -10895,7 +10926,7 @@ var FilePacking = class {
10895
10926
  }
10896
10927
  async packFiles(sourceDirectoryPath, filesToPack) {
10897
10928
  logInfo(`FilePacking: packing files from ${sourceDirectoryPath}`);
10898
- const zip = new AdmZip3();
10929
+ const zip = new AdmZip2();
10899
10930
  let packedFilesCount = 0;
10900
10931
  logInfo("FilePacking: compressing files");
10901
10932
  for (const filepath of filesToPack) {
@@ -11739,7 +11770,7 @@ var mcpHandler = async (_args) => {
11739
11770
  };
11740
11771
 
11741
11772
  // src/args/commands/review.ts
11742
- import fs10 from "node:fs";
11773
+ import fs10 from "fs";
11743
11774
  import chalk9 from "chalk";
11744
11775
  function reviewBuilder(yargs2) {
11745
11776
  return yargs2.option("f", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobbdev",
3
- "version": "1.0.87",
3
+ "version": "1.0.90",
4
4
  "description": "Automated secure code remediation tool",
5
5
  "repository": "git+https://github.com/mobb-dev/bugsy.git",
6
6
  "main": "dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "chalk-animation": "2.0.3",
56
56
  "configstore": "6.0.0",
57
57
  "cross-fetch": "4.1.0",
58
- "debug": "4.4.0",
58
+ "debug": "4.4.1",
59
59
  "dotenv": "16.5.0",
60
60
  "extract-zip": "2.0.1",
61
61
  "globby": "14.1.0",
@@ -71,26 +71,27 @@
71
71
  "multimatch": "7.0.0",
72
72
  "nanospinner": "1.1.0",
73
73
  "node-fetch": "3.3.2",
74
+ "node-stream-zip": "1.15.0",
74
75
  "octokit": "3.2.1",
75
76
  "open": "8.4.2",
76
77
  "parse-diff": "0.11.1",
77
78
  "sax": "1.4.1",
78
- "semver": "7.7.1",
79
+ "semver": "7.7.2",
79
80
  "simple-git": "3.27.0",
80
- "snyk": "1.1296.2",
81
+ "snyk": "1.1297.1",
81
82
  "tar": "6.2.1",
82
83
  "tmp": "0.2.3",
83
- "undici": "6.21.1",
84
+ "undici": "6.21.3",
84
85
  "uuid": "11.1.0",
85
86
  "ws": "8.18.2",
86
87
  "xml2js": "0.6.2",
87
88
  "yargs": "17.7.2",
88
- "zod": "3.24.4"
89
+ "zod": "3.25.36"
89
90
  },
90
91
  "devDependencies": {
91
92
  "@graphql-codegen/cli": "5.0.6",
92
93
  "@graphql-codegen/typescript": "4.1.6",
93
- "@graphql-codegen/typescript-graphql-request": "6.2.0",
94
+ "@graphql-codegen/typescript-graphql-request": "6.3.0",
94
95
  "@graphql-codegen/typescript-operations": "4.6.1",
95
96
  "@octokit/types": "13.10.0",
96
97
  "@types/adm-zip": "0.5.7",
@@ -108,18 +109,19 @@
108
109
  "@types/yargs": "17.0.33",
109
110
  "@typescript-eslint/eslint-plugin": "7.17.0",
110
111
  "@typescript-eslint/parser": "7.17.0",
111
- "@vitest/coverage-istanbul": "3.1.3",
112
- "@vitest/ui": "3.1.3",
112
+ "@vitest/coverage-istanbul": "3.1.4",
113
+ "@vitest/ui": "3.1.4",
113
114
  "eslint": "8.57.0",
114
115
  "eslint-plugin-import": "2.31.0",
115
116
  "eslint-plugin-prettier": "5.4.0",
116
117
  "eslint-plugin-simple-import-sort": "10.0.0",
117
- "msw": "2.7.6",
118
+ "msw": "2.8.5",
118
119
  "nock": "14.0.4",
120
+ "pino-pretty": "13.0.0",
119
121
  "prettier": "3.5.3",
120
- "tsup": "8.4.0",
122
+ "tsup": "8.5.0",
121
123
  "typescript": "4.9.5",
122
- "vitest": "3.1.3"
124
+ "vitest": "3.1.4"
123
125
  },
124
126
  "engines": {
125
127
  "node": ">=18.20.4"