ryu1kn/vscode-annotator

View on GitHub
src/lib/git-annotation/git-annotation-line-values.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%

const _padStart = require('lodash.padstart');
const _reduce = require('lodash.reduce');
import * as Const from '../const';
const multiline = require('multiline-string')();

export class GitAnnotationLineValues {
    private readonly _lineBlameData: any;
    private readonly _lineNumber: any;
    private readonly _lineNumberWidth: any;
    private readonly _repositoryRoot: any;
    private readonly _formatDateTime: any;

    constructor(params) {
        this._lineBlameData = params.lineBlame;
        this._lineNumber = params.lineNumber;
        this._lineNumberWidth = params.lineNumberWidth;
        this._repositoryRoot = params.repositoryRoot;
        this._formatDateTime = params.formatDateTime;
    }

    get isCommitted() {
        return !/^0+$/.test(this._lineBlameData.commitHash);
    }

    get details() {
        const blame = this._lineBlameData;
        return multiline(`
            Commit: ${blame.commitHash}
            Author: ${blame.authorName}
            Date: ${this._formatDateTime(new Date(blame.authorTime * 1000))}

            ${blame.subject}`);
    }

    get caption() {
        const paddedLineNumber = _padStart(this._lineNumber, this._lineNumberWidth);
        if (!this.isCommitted) return paddedLineNumber;

        const lineBlame = this._lineBlameData;
        const dateString = this._getDateString(new Date(lineBlame.authorTime * 1000));
        return `${paddedLineNumber}  ${dateString} ${lineBlame.authorName}`;
    }

    get lineContents() {
        return this._lineBlameData.lineContents;
    }

    get command() {
        if (!this.isCommitted) return null;
        return {
            name: `${Const.EXTENSION_NAME}.takeDiff`,
            args: [this._getCommandParams(this._lineBlameData, this._repositoryRoot)]
        };
    }

    get commitHash() {
        return this._lineBlameData.commitHash;
    }

    _getCommandParams(lineBlame, repositoryRoot) {
        const pickKeys = ['commitHash', 'filename', 'previousCommitHash', 'previousFilename'];
        const substituteKeys = {
            filename: 'path',
            previousFilename: 'previousPath'
        };
        return _reduce(lineBlame, (memo, value, key) => {
            if (!pickKeys.includes(key)) return memo;

            const newKey = substituteKeys[key] || key;
            return Object.assign(memo, {[newKey]: value});
        }, {repositoryRoot});
    }

    _getDateString(date) {
        const pad0 = n => n < 10 ? `0${n}` : n;
        return [date.getFullYear(), date.getMonth() + 1, date.getDate()].map(pad0).join('-');
    }

}