From ba09b00c2d00bd83ce12a2b93d051b86b747c3e5 Mon Sep 17 00:00:00 2001 From: junners Date: Sun, 26 Jan 2025 01:44:49 -0800 Subject: [PATCH] feat: tree shaking on dependencies that aren't used --- package-lock.json | 60 +++++++-------------------------- package.json | 9 ++--- src/commands/flow/scan.ts | 36 +++++++++++++------- src/libs/CoreFixService.ts | 2 +- src/libs/XMLParser.ts | 22 ------------ test/commands/flow/scan.test.ts | 7 +++- 6 files changed, 47 insertions(+), 89 deletions(-) delete mode 100644 src/libs/XMLParser.ts diff --git a/package-lock.json b/package-lock.json index 049024fd..79eacdd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,17 +11,14 @@ "dependencies": { "@oclif/core": "^4.2.4", "@salesforce/core": "^8.8.2", - "@salesforce/sf-plugins-core": "^12.1.2", + "@salesforce/sf-plugins-core": "^12.1.3", "chalk": "^5.4.1", "cosmiconfig": "^9.0.0", - "fs-extra": "^11.3.0", "glob": "^11.0.1", - "lightning-flow-scanner-core": "4.11.0", - "tslib": "^2", - "xml2js": "^0.6.2" + "lightning-flow-scanner-core": "^4.13.0" }, "devDependencies": { - "@oclif/plugin-help": "^6.2.22", + "@oclif/plugin-help": "^6.2.23", "@oclif/test": "^4.1.8", "@salesforce/dev-config": "^4.3.1", "@salesforce/ts-sinon": "^1.4.30", @@ -2984,9 +2981,9 @@ } }, "node_modules/@oclif/plugin-help": { - "version": "6.2.22", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.22.tgz", - "integrity": "sha512-h4DxdEqlHFT310OUB3bDAZ8/ZDyOdyq3r1lLxaPcGWxHPt4mC3OLgYYMz95E+PmxvVd8kz2gzP3nHGO22ziCUw==", + "version": "6.2.23", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.23.tgz", + "integrity": "sha512-BA0h1fbheN74cdrITKIwqfsRtnw/G+oysHbn+IsqWcsecgy5HZwI37/cCRLXZSZQndsgoYAhqvVpyleXv3g83A==", "dev": true, "license": "MIT", "dependencies": { @@ -3341,14 +3338,14 @@ "integrity": "sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA==" }, "node_modules/@salesforce/sf-plugins-core": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/@salesforce/sf-plugins-core/-/sf-plugins-core-12.1.2.tgz", - "integrity": "sha512-qrmGZr2mG7uOpqhOpeOJjBEVztM7Mt8B10lD3rG+aOBZQelTm3YQ738yZYcwHjksQW3AOyf0QtqZICCfe0nD8A==", + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/@salesforce/sf-plugins-core/-/sf-plugins-core-12.1.3.tgz", + "integrity": "sha512-xJSzwl2G7OYSpZTokzWgq9Ybfw/ZtR3reQEFvJTNATLoPk7nv7UGo8WWbX1gcaepURBVvtmQlHsa8mVyoKjYmw==", "license": "BSD-3-Clause", "dependencies": { "@inquirer/confirm": "^3.1.22", "@inquirer/password": "^2.2.0", - "@oclif/core": "^4.0.34", + "@oclif/core": "^4.2.4", "@oclif/table": "^0.4.0", "@salesforce/core": "^8.5.1", "@salesforce/kit": "^3.2.3", @@ -6535,37 +6532,6 @@ ], "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -7841,9 +7807,9 @@ } }, "node_modules/lightning-flow-scanner-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/lightning-flow-scanner-core/-/lightning-flow-scanner-core-4.11.0.tgz", - "integrity": "sha512-BkKRLw3prMaowJd1RfEEccNJM92bHdNBz5EnW84zi6cIlEFBT/Kh0oDxnZO/0tnVXPgfrb35hm3YrVIZcl8Kbg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/lightning-flow-scanner-core/-/lightning-flow-scanner-core-4.13.0.tgz", + "integrity": "sha512-/+94x/GIexkTacVPq/Ltif0AZmQ5fy+J6jmq2ss2mtJTWaRbCZFxz3m1dB9Al9Xsug52qNUzObC+efP9GaOBtw==", "license": "MIT", "dependencies": { "path-browserify": "^1.0.1", diff --git a/package.json b/package.json index 243e5fc6..e315cded 100644 --- a/package.json +++ b/package.json @@ -5,17 +5,14 @@ "dependencies": { "@oclif/core": "^4.2.4", "@salesforce/core": "^8.8.2", - "@salesforce/sf-plugins-core": "^12.1.2", + "@salesforce/sf-plugins-core": "^12.1.3", "chalk": "^5.4.1", "cosmiconfig": "^9.0.0", - "fs-extra": "^11.3.0", "glob": "^11.0.1", - "lightning-flow-scanner-core": "4.11.0", - "tslib": "^2", - "xml2js": "^0.6.2" + "lightning-flow-scanner-core": "^4.13.0" }, "devDependencies": { - "@oclif/plugin-help": "^6.2.22", + "@oclif/plugin-help": "^6.2.23", "@oclif/test": "^4.1.8", "@salesforce/dev-config": "^4.3.1", "@salesforce/ts-sinon": "^1.4.30", diff --git a/src/commands/flow/scan.ts b/src/commands/flow/scan.ts index ccc2ec33..b308a5c6 100644 --- a/src/commands/flow/scan.ts +++ b/src/commands/flow/scan.ts @@ -1,7 +1,5 @@ import { SfCommand, Flags } from "@salesforce/sf-plugins-core"; import { Messages, SfError } from "@salesforce/core"; -import * as core from "lightning-flow-scanner-core"; -import * as fse from "fs-extra"; import chalk from "chalk"; import { exec } from "child_process"; @@ -9,6 +7,15 @@ import { loadScannerOptions } from "../../libs/ScannerConfig.js"; import { FindFlows } from "../../libs/FindFlows.js"; import { ScanResult } from "../../models/ScanResult.js"; +import { + parse, + ParsedFlow, + scan, + RuleResult, + ResultDetails, + ScanResult as scanResults, +} from "lightning-flow-scanner-core"; + Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages("lightning-flow-scanner", "command"); @@ -21,6 +28,7 @@ export default class Scan extends SfCommand { "sf flow scan -c path/to/config.json", "sf flow scan -c path/to/config.json --failon warning", "sf flow scan -d path/to/flows/directory", + "sf flow scan -p path/to/single/file.flow-meta.xml", ]; protected static requiresUsername = false; @@ -56,10 +64,13 @@ export default class Scan extends SfCommand { description: "Force retrieve Flows from org at the start of the command", default: false, }), - sourcepath: Flags.directory({ + sourcepath: Flags.file({ char: "p", description: "Comma-separated list of source flow paths to scan", required: false, + aliases: ["files"], + multiple: true, + exists: true, }), targetusername: Flags.string({ char: "u", @@ -82,14 +93,15 @@ export default class Scan extends SfCommand { this.spinner.start(`Identified ${flowFiles.length} flows to scan`); // to // core.Flow - const parsedFlows = await core.parse(flowFiles); + const parsedFlows: ParsedFlow[] = await parse(flowFiles); + this.debug(`parsed flows ${parsedFlows.length}`, ...parsedFlows); - const scanResults: core.ScanResult[] = + const scanResults: scanResults[] = this.userConfig && Object.keys(this.userConfig).length > 0 - ? core.scan(parsedFlows, this.userConfig) - : core.scan(parsedFlows); + ? scan(parsedFlows, this.userConfig) + : scan(parsedFlows); - this.debug("scan results", ...scanResults); + this.debug(`scan results: ${scanResults.length}`, ...scanResults); this.spinner.stop(`Scan complete`); this.log(""); @@ -175,7 +187,7 @@ export default class Scan extends SfCommand { return { summary, status: status, results }; } - private findFlows(directory: string, sourcepath: string) { + private findFlows(directory: string, sourcepath: string[]) { // List flows that will be scanned let flowFiles; if (directory && sourcepath) { @@ -186,7 +198,7 @@ export default class Scan extends SfCommand { } else if (directory) { flowFiles = FindFlows(directory); } else if (sourcepath) { - flowFiles = sourcepath.split(",").filter((f) => fse.exists(f)); + flowFiles = sourcepath; } else { flowFiles = FindFlows("."); } @@ -222,7 +234,7 @@ export default class Scan extends SfCommand { for (const scanResult of scanResults) { const flowName = scanResult.flow.label; const flowType = scanResult.flow.type[0]; - for (const ruleResult of scanResult.ruleResults as core.RuleResult[]) { + for (const ruleResult of scanResult.ruleResults as RuleResult[]) { const ruleDescription = ruleResult.ruleDefinition.description; const rule = ruleResult.ruleDefinition.label; if ( @@ -231,7 +243,7 @@ export default class Scan extends SfCommand { ruleResult.details.length > 0 ) { const severity = ruleResult.severity || "error"; - for (const result of ruleResult.details as core.ResultDetails[]) { + for (const result of ruleResult.details as ResultDetails[]) { const detailObj = Object.assign(result, { ruleDescription, rule, diff --git a/src/libs/CoreFixService.ts b/src/libs/CoreFixService.ts index 494b02e5..7c0556a8 100644 --- a/src/libs/CoreFixService.ts +++ b/src/libs/CoreFixService.ts @@ -4,7 +4,7 @@ import { scan, ScanResult as ScanResults, } from "lightning-flow-scanner-core"; -import { IRulesConfig } from "lightning-flow-scanner-core/main/interfaces/IRulesConfig.js"; +import IRulesConfig from "lightning-flow-scanner-core/main/interfaces/IRulesConfig.js"; import { writeFileSync } from "node:fs"; import { FindFlows } from "./FindFlows.js"; diff --git a/src/libs/XMLParser.ts b/src/libs/XMLParser.ts deleted file mode 100644 index dfdd6313..00000000 --- a/src/libs/XMLParser.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Parser } from "xml2js"; -import * as core from "lightning-flow-scanner-core"; - -export class XMLParser { - private parser: Parser; - - constructor() { - this.parser = new Parser(); - } - - public execute(xml): Promise<{ Flow: core.Flow }> { - return new Promise<{ Flow: core.Flow }>((resolve, reject) => { - this.parser.parseString(xml, (err, result) => { - if (err) { - reject(err); - } else { - resolve(result); - } - }); - }); - } -} diff --git a/test/commands/flow/scan.test.ts b/test/commands/flow/scan.test.ts index cdb8e9dc..4ec4f581 100644 --- a/test/commands/flow/scan.test.ts +++ b/test/commands/flow/scan.test.ts @@ -18,7 +18,12 @@ describe("flow:scan", () => { let output: ScanResult; try { const output = await new Scan( - ["--directory", "test/", "--sourcepath", "test/"], + [ + "--directory", + "test/", + "--sourcepath", + "test/commands/flow/scan.test.ts", + ], config, ).run(); console.log(output);