@ossjs/release
Version:
Minimalistic, opinionated, and predictable release automation tool.
56 lines • 2.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseCommits = void 0;
const node_stream_1 = require("node:stream");
const outvariant_1 = require("outvariant");
const deferred_promise_1 = require("@open-draft/deferred-promise");
const conventional_commits_parser_1 = __importDefault(require("conventional-commits-parser"));
const COMMIT_HEADER_APPENDIX_REGEXP = /^(.+)(!)(:)/g;
async function parseCommits(commits) {
const through = new node_stream_1.PassThrough();
const commitMap = new Map();
for (const commit of commits) {
commitMap.set(commit.subject, commit);
const message = joinCommit(commit.subject, commit.body);
through.write(message, 'utf8');
}
through.end();
const commitParser = (0, conventional_commits_parser_1.default)();
const parsingStreamPromise = new deferred_promise_1.DeferredPromise();
parsingStreamPromise.finally(() => {
through.destroy();
});
const parsedCommits = [];
through
.pipe(commitParser)
.on('error', (error) => parsingStreamPromise.reject(error))
.on('data', (parsedCommit) => {
let resolvedParsingResult = parsedCommit;
if (!parsedCommit.header) {
return;
}
let typeAppendix;
if (COMMIT_HEADER_APPENDIX_REGEXP.test(parsedCommit.header)) {
const headerWithoutAppendix = parsedCommit.header.replace(COMMIT_HEADER_APPENDIX_REGEXP, '$1$3');
resolvedParsingResult = conventional_commits_parser_1.default.sync(joinCommit(headerWithoutAppendix, parsedCommit.body));
typeAppendix = '!';
}
const originalCommit = commitMap.get(parsedCommit.header);
(0, outvariant_1.invariant)(originalCommit, 'Failed to parse commit "%s": no original commit found associated with header', parsedCommit.header);
const commit = Object.assign({}, resolvedParsingResult, {
hash: originalCommit.hash,
typeAppendix,
});
parsedCommits.push(commit);
})
.on('end', () => parsingStreamPromise.resolve(parsedCommits));
return parsingStreamPromise;
}
exports.parseCommits = parseCommits;
function joinCommit(subject, body) {
return [subject, body].filter(Boolean).join('\n');
}
//# sourceMappingURL=parseCommits.js.map