diff --git a/package-lock.json b/package-lock.json index 60a45828..9e2c94a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6467,6 +6467,17 @@ "node": ">=20.0.0" } }, + "packages/code-analyzer-core/node_modules/@salesforce/code-analyzer-engine-api": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@salesforce/code-analyzer-engine-api/-/code-analyzer-engine-api-0.14.0.tgz", + "integrity": "sha512-SKqiHKtARSzA3NOaR/hXENt6Z+LmSIozhu2LEBGSq0tlqYtw/89pLXBUv2rozh/wfsyEERAQcxgpPT3v4cVqnQ==", + "dependencies": { + "@types/node": "^20.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "packages/code-analyzer-core/node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" @@ -6483,7 +6494,7 @@ }, "packages/code-analyzer-engine-api": { "name": "@salesforce/code-analyzer-engine-api", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { "@types/node": "^20.0.0" @@ -6504,14 +6515,14 @@ }, "packages/code-analyzer-eslint-engine": { "name": "@salesforce/code-analyzer-eslint-engine", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.24.7", "@babel/eslint-parser": "^7.24.7", "@eslint/js": "^8.57.0", "@lwc/eslint-plugin-lwc": "^1.8.0", - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@salesforce/eslint-config-lwc": "^3.5.3", "@salesforce/eslint-plugin-lightning": "^1.0.0", "@types/eslint": "^8.56.10", @@ -6539,10 +6550,10 @@ }, "packages/code-analyzer-flowtest-engine": { "name": "@salesforce/code-analyzer-flowtest-engine", - "version": "0.14.1", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/semver": "^7.5.8", "@types/tmp": "^0.2.6", @@ -6598,10 +6609,10 @@ }, "packages/code-analyzer-pmd-engine": { "name": "@salesforce/code-analyzer-pmd-engine", - "version": "0.14.1-SNAPSHOT", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/semver": "^7.5.8", "@types/tmp": "^0.2.6", @@ -6636,10 +6647,10 @@ }, "packages/code-analyzer-regex-engine": { "name": "@salesforce/code-analyzer-regex-engine", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "isbinaryfile": "^5.0.2" }, @@ -6659,10 +6670,10 @@ }, "packages/code-analyzer-retirejs-engine": { "name": "@salesforce/code-analyzer-retirejs-engine", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/tmp": "^0.2.6", "isbinaryfile": "^5.0.2", @@ -6686,10 +6697,10 @@ }, "packages/T-E-M-P-L-A-T-E": { "name": "@salesforce/t-e-m-p-l-a-t-e", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0" }, "devDependencies": { diff --git a/packages/T-E-M-P-L-A-T-E/package.json b/packages/T-E-M-P-L-A-T-E/package.json index 6091fff6..8aabb7f0 100644 --- a/packages/T-E-M-P-L-A-T-E/package.json +++ b/packages/T-E-M-P-L-A-T-E/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/t-e-m-p-l-a-t-e", "description": "T-E-M-P-L-A-T-E", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", @@ -14,7 +14,7 @@ "types": "dist/index.d.ts", "dependencies": { "@types/node": "^20.0.0", - "@salesforce/code-analyzer-engine-api": "0.14.0" + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT" }, "devDependencies": { "@eslint/js": "^8.57.0", diff --git a/packages/code-analyzer-engine-api/package.json b/packages/code-analyzer-engine-api/package.json index 0329570f..e59c2845 100644 --- a/packages/code-analyzer-engine-api/package.json +++ b/packages/code-analyzer-engine-api/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-engine-api", "description": "Engine API Package for the Salesforce Code Analyzer", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", diff --git a/packages/code-analyzer-engine-api/src/engines.ts b/packages/code-analyzer-engine-api/src/engines.ts index 6f353134..771dd21d 100644 --- a/packages/code-analyzer-engine-api/src/engines.ts +++ b/packages/code-analyzer-engine-api/src/engines.ts @@ -29,6 +29,8 @@ export abstract class Engine { abstract runRules(ruleNames: string[], runOptions: RunOptions): Promise + abstract getEngineVersion(): Promise; + public onEvent(eventType: T["type"], callback: (event: T) => void): void { this.eventEmitter.on(eventType, callback); } diff --git a/packages/code-analyzer-engine-api/test/api-v1.test.ts b/packages/code-analyzer-engine-api/test/api-v1.test.ts index 300a8fad..e9465e84 100644 --- a/packages/code-analyzer-engine-api/test/api-v1.test.ts +++ b/packages/code-analyzer-engine-api/test/api-v1.test.ts @@ -110,6 +110,10 @@ class DummyEngineV1 extends Engine { return "dummy" } + public getEngineVersion(): Promise { + return Promise.resolve('0.0.1'); + } + async runRules(_ruleNames: string[], _runOptions: RunOptions): Promise { this.emitRunRulesProgressEvent(5.0); this.emitLogEvent(LogLevel.Fine, "runRules called"); diff --git a/packages/code-analyzer-eslint-engine/package.json b/packages/code-analyzer-eslint-engine/package.json index 1d76f23f..913d3c51 100644 --- a/packages/code-analyzer-eslint-engine/package.json +++ b/packages/code-analyzer-eslint-engine/package.json @@ -1,77 +1,77 @@ { "name": "@salesforce/code-analyzer-eslint-engine", "description": "Plugin package that adds 'eslint' as an engine into Salesforce Code Analyzer", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", "repository": { - "type": "git", - "url": "git+https://github.com/forcedotcom/code-analyzer-core.git", - "directory": "packages/code-analyzer-eslint-engine" + "type": "git", + "url": "git+https://github.com/forcedotcom/code-analyzer-core.git", + "directory": "packages/code-analyzer-eslint-engine" }, "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "@types/node": "^20.0.0", - "@salesforce/code-analyzer-engine-api": "0.14.0", - "eslint": "^8.57.0", - "@eslint/js": "^8.57.0", - "@types/eslint": "^8.56.10", - "@lwc/eslint-plugin-lwc": "^1.8.0", - "@babel/core": "^7.24.7", - "@babel/eslint-parser": "^7.24.7", - "@salesforce/eslint-config-lwc": "^3.5.3", - "@salesforce/eslint-plugin-lightning": "^1.0.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^28.6.0", - "@typescript-eslint/parser": "^7.13.1", - "@typescript-eslint/eslint-plugin": "^7.13.1" + "@babel/core": "^7.24.7", + "@babel/eslint-parser": "^7.24.7", + "@eslint/js": "^8.57.0", + "@lwc/eslint-plugin-lwc": "^1.8.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", + "@salesforce/eslint-config-lwc": "^3.5.3", + "@salesforce/eslint-plugin-lightning": "^1.0.0", + "@types/eslint": "^8.56.10", + "@types/node": "^20.0.0", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", + "eslint": "^8.57.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^28.6.0" }, "devDependencies": { - "@types/jest": "^29.0.0", - "jest": "^29.0.0", - "cross-env": "^7.0.3", - "rimraf": "*", - "ts-jest": "^29.0.0", - "typescript": "^5.4.5", - "typescript-eslint": "^7.8.0", - "unzipper": "^0.10.9", - "@types/unzipper": "^0.10.9" + "@types/jest": "^29.0.0", + "@types/unzipper": "^0.10.9", + "cross-env": "^7.0.3", + "jest": "^29.0.0", + "rimraf": "*", + "ts-jest": "^29.0.0", + "typescript": "^5.4.5", + "typescript-eslint": "^7.8.0", + "unzipper": "^0.10.9" }, "engines": { - "node": ">=20.0.0" + "node": ">=20.0.0" }, "files": [ - "dist", - "LICENSE", - "package.json", - "worker-scripts" + "dist", + "LICENSE", + "package.json", + "worker-scripts" ], "scripts": { - "build": "tsc --build tsconfig.build.json --verbose", - "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", - "lint": "eslint src/**/*.ts", - "package": "npm pack", - "all": "npm run build && npm run test && npm run lint && npm run package", - "clean": "tsc --build tsconfig.build.json --clean", - "postclean": "rimraf dist && rimraf coverage && rimraf ./*.tgz && rimraf vulnerabilities", - "scrub": "npm run clean && rimraf node_modules", - "showcoverage": "open ./coverage/lcov-report/index.html" + "build": "tsc --build tsconfig.build.json --verbose", + "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts", + "package": "npm pack", + "all": "npm run build && npm run test && npm run lint && npm run package", + "clean": "tsc --build tsconfig.build.json --clean", + "postclean": "rimraf dist && rimraf coverage && rimraf ./*.tgz && rimraf vulnerabilities", + "scrub": "npm run clean && rimraf node_modules", + "showcoverage": "open ./coverage/lcov-report/index.html" }, "jest": { - "preset": "ts-jest", - "testEnvironment": "node", - "testMatch": [ - "**/*.test.ts" - ], - "testPathIgnorePatterns": [ - "/node_modules/", - "/dist/" - ], - "collectCoverageFrom": [ - "src/**/*.ts", - "!src/index.ts" - ] + "preset": "ts-jest", + "testEnvironment": "node", + "testMatch": [ + "**/*.test.ts" + ], + "testPathIgnorePatterns": [ + "/node_modules/", + "/dist/" + ], + "collectCoverageFrom": [ + "src/**/*.ts", + "!src/index.ts" + ] } - } +} diff --git a/packages/code-analyzer-eslint-engine/src/engine.ts b/packages/code-analyzer-eslint-engine/src/engine.ts index 933c4c76..7be5bc65 100644 --- a/packages/code-analyzer-eslint-engine/src/engine.ts +++ b/packages/code-analyzer-eslint-engine/src/engine.ts @@ -1,3 +1,5 @@ +import * as fs from 'node:fs/promises'; +import path from 'node:path'; import { DescribeOptions, Engine, @@ -30,6 +32,12 @@ export class ESLintEngine extends Engine { return ESLintEngine.NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fs.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + async describeRules(describeOptions: DescribeOptions): Promise { this.emitDescribeRulesProgressEvent(0); diff --git a/packages/code-analyzer-eslint-engine/test/engine.test.ts b/packages/code-analyzer-eslint-engine/test/engine.test.ts index d931476d..93ae1905 100644 --- a/packages/code-analyzer-eslint-engine/test/engine.test.ts +++ b/packages/code-analyzer-eslint-engine/test/engine.test.ts @@ -544,6 +544,15 @@ describe('Typical tests for the runRules method of ESLintEngine', () => { }); }); +describe('Tests for the getEngineVersion method of ESLint Engine', () => { + it('getEngineVersion() outputs something resembling a Semantic Version', async () => { + const engine: ESLintEngine = new ESLintEngine(DEFAULT_CONFIG); + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); +}); + describe('Tests for emitting events', () => { let engine: ESLintEngine; let logEvents: LogEvent[]; diff --git a/packages/code-analyzer-flowtest-engine/package.json b/packages/code-analyzer-flowtest-engine/package.json index 6858551c..f98c6282 100644 --- a/packages/code-analyzer-flowtest-engine/package.json +++ b/packages/code-analyzer-flowtest-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-flowtest-engine", "description": "Plugin package that adds 'flowtest' as an engine into Salesforce Code Analyzer", - "version": "0.14.1", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", @@ -13,7 +13,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/semver": "^7.5.8", "@types/tmp": "^0.2.6", diff --git a/packages/code-analyzer-flowtest-engine/src/engine.ts b/packages/code-analyzer-flowtest-engine/src/engine.ts index d2ae270c..7828b5e0 100644 --- a/packages/code-analyzer-flowtest-engine/src/engine.ts +++ b/packages/code-analyzer-flowtest-engine/src/engine.ts @@ -1,3 +1,5 @@ +import path from 'node:path'; +import * as fs from 'node:fs/promises'; import { CodeLocation, DescribeOptions, @@ -39,6 +41,12 @@ export class FlowTestEngine extends Engine { return FlowTestEngine.NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fs.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + public async describeRules(describeOptions: DescribeOptions): Promise { this.emitDescribeRulesProgressEvent(0); if (describeOptions.workspace) { diff --git a/packages/code-analyzer-flowtest-engine/test/engine.test.ts b/packages/code-analyzer-flowtest-engine/test/engine.test.ts index 58cf3558..e8595e50 100644 --- a/packages/code-analyzer-flowtest-engine/test/engine.test.ts +++ b/packages/code-analyzer-flowtest-engine/test/engine.test.ts @@ -227,6 +227,15 @@ describe('Tests for the FlowTestEngine', () => { expect(engineResults).toEqual(expectedResults); }); }); + + describe('#getEngineVersion', () => { + it('Returns something resembling a Semantic Version', async () => { + const engine: FlowTestEngine = new FlowTestEngine(new StubCommandWrapper()); + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); + }); }); }); diff --git a/packages/code-analyzer-pmd-engine/package.json b/packages/code-analyzer-pmd-engine/package.json index c431234b..b9e39e61 100644 --- a/packages/code-analyzer-pmd-engine/package.json +++ b/packages/code-analyzer-pmd-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-pmd-engine", "description": "Plugin package that adds 'pmd' and 'cpd' as engines into Salesforce Code Analyzer", - "version": "0.14.1-SNAPSHOT", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", @@ -14,7 +14,7 @@ "types": "dist/index.d.ts", "dependencies": { "@types/node": "^20.0.0", - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/tmp": "^0.2.6", "tmp": "^0.2.3", "@types/semver": "^7.5.8", diff --git a/packages/code-analyzer-pmd-engine/src/cpd-engine.ts b/packages/code-analyzer-pmd-engine/src/cpd-engine.ts index a03634f8..7be3a0f8 100644 --- a/packages/code-analyzer-pmd-engine/src/cpd-engine.ts +++ b/packages/code-analyzer-pmd-engine/src/cpd-engine.ts @@ -23,6 +23,8 @@ import { CpdRunResults, CpdWrapperInvoker } from "./cpd-wrapper"; +import path from "node:path"; +import fs from "node:fs/promises"; const RULE_NAME_PREFIX: string = 'DetectCopyPasteFor'; @@ -44,6 +46,12 @@ export class CpdEngine extends Engine { return CPD_ENGINE_NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fs.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + async describeRules(describeOptions: DescribeOptions): Promise { const workspaceLiaison: WorkspaceLiaison = this.getWorkspaceLiaison(describeOptions.workspace); this.emitDescribeRulesProgressEvent(33); diff --git a/packages/code-analyzer-pmd-engine/src/pmd-engine.ts b/packages/code-analyzer-pmd-engine/src/pmd-engine.ts index 8ed919ee..a42e7841 100644 --- a/packages/code-analyzer-pmd-engine/src/pmd-engine.ts +++ b/packages/code-analyzer-pmd-engine/src/pmd-engine.ts @@ -12,6 +12,7 @@ import { } from "@salesforce/code-analyzer-engine-api"; import {indent, JavaCommandExecutor, WorkspaceLiaison} from "./utils"; import path from "node:path"; +import * as fs from 'node:fs/promises'; import {extensionToLanguageId, LanguageId, PMD_ENGINE_NAME, SHARED_RULE_NAMES} from "./constants"; import {PmdResults, PmdRuleInfo, PmdViolation, PmdWrapperInvoker} from "./pmd-wrapper"; import {getMessage} from "./messages"; @@ -39,6 +40,12 @@ export class PmdEngine extends Engine { return PMD_ENGINE_NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fs.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + async describeRules(describeOptions: DescribeOptions): Promise { const workspaceLiaison: WorkspaceLiaison = this.getWorkspaceLiaison(describeOptions.workspace); this.emitDescribeRulesProgressEvent(5); diff --git a/packages/code-analyzer-pmd-engine/test/cpd-engine.test.ts b/packages/code-analyzer-pmd-engine/test/cpd-engine.test.ts index 381b56df..0870ba8c 100644 --- a/packages/code-analyzer-pmd-engine/test/cpd-engine.test.ts +++ b/packages/code-analyzer-pmd-engine/test/cpd-engine.test.ts @@ -313,4 +313,13 @@ describe('Tests for the runRules method of CpdEngine', () => { expect(results.violations).toHaveLength(0); // Should not pick up the someReplicatedFileWithOver100Tokens.html files }); +}); + +describe('Tests for the getEngineVersion method of CpdEngine', () => { + it('Outputs something resembling a Semantic Version', async () => { + const engine: CpdEngine = new CpdEngine(DEFAULT_CPD_ENGINE_CONFIG); + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); }); \ No newline at end of file diff --git a/packages/code-analyzer-pmd-engine/test/pmd-engine.test.ts b/packages/code-analyzer-pmd-engine/test/pmd-engine.test.ts index 4b646b85..5c99ad34 100644 --- a/packages/code-analyzer-pmd-engine/test/pmd-engine.test.ts +++ b/packages/code-analyzer-pmd-engine/test/pmd-engine.test.ts @@ -492,6 +492,15 @@ describe('Tests for the runRules method of PmdEngine', () => { }); }); +describe('Tests for the getEngineVersion method of PmdEngine', () => { + it('Outputs something resembling a Semantic Version', async () => { + const engine: PmdEngine = new PmdEngine(DEFAULT_PMD_ENGINE_CONFIG); + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); +}); + function expectNoDashesAppearOutsideOfOurLanguageSpecificRules(ruleDescriptions: RuleDescription[]): void { for (const ruleDescription of ruleDescriptions) { diff --git a/packages/code-analyzer-regex-engine/package.json b/packages/code-analyzer-regex-engine/package.json index a3398803..9b2ff291 100644 --- a/packages/code-analyzer-regex-engine/package.json +++ b/packages/code-analyzer-regex-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-regex-engine", "description": "Plugin package that adds 'regex' as an engine into Salesforce Code Analyzer", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", @@ -13,7 +13,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "isbinaryfile": "^5.0.2" }, diff --git a/packages/code-analyzer-regex-engine/src/engine.ts b/packages/code-analyzer-regex-engine/src/engine.ts index 3c7ede6c..00778936 100644 --- a/packages/code-analyzer-regex-engine/src/engine.ts +++ b/packages/code-analyzer-regex-engine/src/engine.ts @@ -10,6 +10,7 @@ import { } from "@salesforce/code-analyzer-engine-api"; import path from "node:path"; import fs from "node:fs"; +import * as fsp from 'node:fs/promises'; import os from "node:os"; import {RegexRule, RegexRules} from "./config"; import {isBinaryFile} from "isbinaryfile"; @@ -39,6 +40,12 @@ export class RegexEngine extends Engine { return RegexEngine.NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fsp.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + // For testing purposes only _getRegexRules(): RegexRules { return this.regexRules diff --git a/packages/code-analyzer-regex-engine/test/engine.test.ts b/packages/code-analyzer-regex-engine/test/engine.test.ts index fa7de44a..d1090fb7 100644 --- a/packages/code-analyzer-regex-engine/test/engine.test.ts +++ b/packages/code-analyzer-regex-engine/test/engine.test.ts @@ -763,4 +763,12 @@ describe('Tests for runRules', () => { expect(combinedRunViolations).toContainEqual(individualRunViolation); } }); +}); + +describe('Tests for getEngineVersion', () => { + it('Outputs something resembling a Semantic Version', async () => { + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); }); \ No newline at end of file diff --git a/packages/code-analyzer-retirejs-engine/package.json b/packages/code-analyzer-retirejs-engine/package.json index dbe5eeec..d287626c 100644 --- a/packages/code-analyzer-retirejs-engine/package.json +++ b/packages/code-analyzer-retirejs-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-retirejs-engine", "description": "Plugin package that adds 'retire-js' as an engine into Salesforce Code Analyzer", - "version": "0.14.0", + "version": "0.15.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", @@ -13,7 +13,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.14.0", + "@salesforce/code-analyzer-engine-api": "0.15.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/tmp": "^0.2.6", "isbinaryfile": "^5.0.2", diff --git a/packages/code-analyzer-retirejs-engine/src/engine.ts b/packages/code-analyzer-retirejs-engine/src/engine.ts index a804c597..5719b743 100644 --- a/packages/code-analyzer-retirejs-engine/src/engine.ts +++ b/packages/code-analyzer-retirejs-engine/src/engine.ts @@ -23,6 +23,7 @@ import { import {Finding, Vulnerability} from "retire/lib/types"; import {getMessage} from "./messages"; import path from "node:path"; +import * as fs from 'node:fs/promises'; // To speed up execution, we will only target files with extension among EXTENSIONS_TO_TARGET // that don't live under one of the FOLDERS_TO_SKIP @@ -72,6 +73,12 @@ export class RetireJsEngine extends Engine { return RetireJsEngine.NAME; } + public async getEngineVersion(): Promise { + const pathToPackageJson: string = path.join(__dirname, '..', 'package.json'); + const packageJson: {version: string} = JSON.parse(await fs.readFile(pathToPackageJson, 'utf-8')); + return packageJson.version; + } + async describeRules(describeOptions: DescribeOptions): Promise { if (describeOptions.workspace && (await this.getTargetFiles(describeOptions.workspace)).length === 0) { return []; diff --git a/packages/code-analyzer-retirejs-engine/test/engine.test.ts b/packages/code-analyzer-retirejs-engine/test/engine.test.ts index ab4b2102..87929bf0 100644 --- a/packages/code-analyzer-retirejs-engine/test/engine.test.ts +++ b/packages/code-analyzer-retirejs-engine/test/engine.test.ts @@ -116,6 +116,12 @@ describe('Tests for the RetireJsEngine', () => { expect(engine.getName()).toEqual('retire-js'); }); + it('When getEngineVersion is called, it returns something resembling a Semantic Version', async () => { + const version: string = await engine.getEngineVersion(); + + expect(version).toMatch(/\d+\.\d+\.\d+.*/); + }); + it('When describeRules is called, then the expected rules are returned', async () => { const ruleDescriptions: RuleDescription[] = await engine.describeRules(DUMMY_DESCRIBE_OPTIONS); expect(ruleDescriptions).toHaveLength(4);