@hibryda/count-sloc-h

0.0.1 • Public • Published

NodeJS SLoCs counter with COCOMO I metrics

count-sloc-h

A ES6 module for counting SLoCs with support of COCOMO I metrics and globbing, made specifically to address Vue's polymorphic files. Deep fork (very deep, almost rewrite) of Edvin Havic's node-sloc package.

The module has several useful features:

  • returns metrics in both aggregated and per-file form

  • produces several objects containing the following:

    • timestamp

    • totals of all metrics

    • flat list of files with associated metrics

    • files' tree

    • aggregated counts for all file types

    • aggregated counts for actual, separate, languages

    • aggregated counts for polymorphic files (like Vue, which is the only defined atm, however definitions of others are planned)

    • COCOMO I assessment of effort, duration and staffing. COCOMO II is planned to be included as well.

  • supports globbing in excluded files

  • supports multiple sources (directories or files)

  • is asynchronous and skips globbed out destinations without scanning

  • allows for excluding parts of files from counting

Installation

npm -i @hibryda/count-sloc-h

or

yarn add @hibryda/count-sloc-h

Interface

The module exposes the class CountSlocH which must/can be provided with the following options:

  • path | [required]

    path or paths to scan for files. If they overlap, duplicates are eliminated

  • ignore | [optional]

    glob or path to exclude from results. Defaults to node_modules/

  • root [optional]

    common absolute root part of of path to remove from filepaths when delivering results. Defaults to empty string

  • extensions [optional]

    List of extensions to look after. Adds provided extensions to standard lookup list

  • ignoreDefault [optional]

    Instructs object to ignore default lookup list and use only provided extenstions. Works only in tandem with the previous command

  • logger [optional]

    alternative logger to present output in terminal - defaults to standard console

  • logLevel [optional]

    Number in range from 0 to 3, where 0 displays nothing, 3 displays all messages, defaults to 3

  • logMargin [optional]

    Specifies margin (in characters) that must be taken into account when shortening filepaths displayed in terminal during search. Important when alternative console, like consola are used (due to labels). Defaults to 10.

  • logPadUp [optional]

    In alternative consoles single line messages can take up 2 lines for aesthetic reasons - this parameter allows for getting rid of surplus lines. Defaults to 1

  • cocomoModel [optional]

    Specifies model used in COCOMO calculations. Defaults to basic and it's the only option at the moment

  • cocomoMode [optional]

    Specifies mode of calculations. Available are: organic, semiDetached, embedded

In addition to options, parts of files can be skipped by using two switches:

  • [countsloch:off] excludes this and subsequent lines from counting

  • [countsloch:on] swiches counting on again

Switches must be surrounded inside files in language-specific comment markers. For instance, in JavaScript it would look as follows:

const countSloc = async (file, envObj) => {
// [countsloch:off]
    return new Promise((resolve, reject) => {
        const extension = file
            .split('.')
            .pop()
            .toLowerCase()
        let isLangMulti = false
// [countsloch:on]
        let allComments = getCommentChars(extension)

Usage

The default export of the module provides an instance. However there's also a named export CountSlocH which exposes the class itself.

Both accept options to be initiated.

import { CountSlocH } from 'count-sloc-h'
;(async () => {
    const csh = new CountSlocH({
        root: '/home/hibryda/apps/project1',
        path: ['/home/hibryda/apps/project1/subproject1', './project1/subproject2', '../index.vue'],
        ignore: ['node_modules/', '*.json', '.nuxt'],
        logger: consola
    })

    const slocsCounts = await csh.scan()

    consola.log(slocCounts)
})()

After initiation, the following methods are available:

  • scan [async]

    Performs scan and returns an object with counts

  • update [required]

    Updates the instance with new options

  • getExtensions

    Returns an array of extensions defined in module

The output of scan method presents as follows:

metrics: {
    timestamp: 1610827135710
},
totals: { files: 15, loc: 1558, sloc: 1401, comments: 157, blanks: 40, lines: 1598, skipped: 0 },
files: {
    '674680299911|||/subproject1/charts.js': {
        fileWithoutRoot: '/subproject1/charts.js',
        loc: 17,
        sloc: 7,
        comments: 10,
        blanks: 2,
        lines: 19,
        skipped: 0
    },
    '476981730777|||/subproject1/charts-mod.js': {
        fileWithoutRoot: '/subproject1/charts-mod.js',
        loc: 216,
        sloc: 211,
        comments: 5,
        blanks: 5,
        lines: 221,
        skipped: 0
    }

    ...

},
tree: {
    project1: {
        subproject1: {
            'charts.js': {
                filename: '/subproject1/charts.js',
                lang: 'js',
                multi: false,
                loc: 17,
                sloc: 7,
                comments: 10,
                blanks: 2,
                lines: 19,
                skipped: 0
            },
            'charts-mod.js': {
                fileWithoutRoot: '/subproject1/charts-mod.js',
                lang: 'js',
                multi: false,
                loc: 216,
                sloc: 211,
                comments: 5,
                blanks: 5,
                lines: 221,
                skipped: 0
            }

            ...

        }
    }
},
allLangs: {
    js: { files: 3, loc: 136, sloc: 89, comments: 47, blanks: 7, lines: 143, skipped: 0 },

    ...

    vue: { files: 12, loc: 1422, sloc: 1312, comments: 110, blanks: 33, lines: 1455, skipped: 0 }
},
langs: { js: { files: 3, loc: 136, sloc: 89, comments: 47, blanks: 7, lines: 143, skipped: 0 } ... },
multi: { vue: { files: 12, loc: 1422, sloc: 1312, comments: 110, blanks: 33, lines: 1455, skipped: 0 } ... },
cocomo: {
    effort: 22.84699009797671,
    duration: 8.505139152658836,
    staffing: 2.9487509187608016
}

License

MIT - enjoy

Package Sidebar

Install

npm i @hibryda/count-sloc-h

Weekly Downloads

0

Version

0.0.1

License

MIT

Unpacked Size

25 kB

Total Files

8

Last publish

Collaborators

  • hibryda