npm install @modular-rocks/metrics-ts-js
or
yarn add @modular-rocks/metrics-ts-js
There are currently 8 metrics:
- Cyclomatic
- Total Cyclomatic Complexity
- Maintainability
- Import Coupling
- Identifier Coupling
- Halstead
- LOC
- LCOM*
*LCOM is not directly adaptable to functional Javascript because LCOM compares identifiers in methods in classes. So this LCOM method is a custom adaption that accounts for modern Javascript usage.
Each metric accepts an Options argument containing configuration options. Either one of two options are required, code or ast.
code is the code string to parse and evaluate. ast is an already parsed AST.
Execute the following examples in a node environment (not in a browser).
import { cyclomatic, totalCyclomaticComplexity, loc, halstead, maintainability } from "@modular-rocks/metrics"
const opts = {
code: `
function calculateAverage(numbers) {
if (!Array.isArray(numbers)) {
return 'Invalid input. Please provide an array of numbers.';
}
if (numbers.length === 0) {
return 'Empty array. Please provide an array with at least one number.';
}
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
const average = sum / numbers.length;
return average;
}
`
}
cyclomatic(opts)
// 7
totalCyclomaticComplexity(opts)
// 4
loc(opts)
// 17
halstead(opts)
// {
// "bugs": 0.0533612357509481,
// "difficulty": 8.125,
// "effort": 2025.446143672791,
// "length": 49,
// "time": 112.52478575959951,
// "vocabulary": 34,
// "volume": 249.2856792212666,
// }
maintainability(opts)
// 75.59906223945923
import { lcom, identifierCoupling } from "@modular-rocks/metrics"
const opts = {
code: `
// Shared variables
let sharedVariable = 0;
function incrementSharedVariable() {
sharedVariable++;
console.log('Shared Variable:', sharedVariable);
}
// Not shared variables
function multiplyNumbers(a, b) {
let result = a * b;
console.log('Result:', result);
}
function addNumbers(a, b) {
let sum = a + b;
console.log('Sum:', sum);
}
`
}
lcom(opts)
// { "cohesion": 0.5, "lcom": 2.25 }
identifierCoupling(opts)
// 0.25
import { importCoupling } from "@modular-rocks/metrics"
const opts = {
totalModulesCount: 10,
code: `
import ModuleA from 'module-a';
import { FunctionB } from 'module-b';
`
}
importCoupling(opts)
// 0.003316749585406302
The code in the test-project folder is a snapshot of the code from DIM, containing 600+ components/modules.
Apache 2.0