1fa3a1382SChris Kay/* 2fa3a1382SChris Kay * Copyright (c) 2021, Arm Limited. All rights reserved. 3fa3a1382SChris Kay * 4fa3a1382SChris Kay * SPDX-License-Identifier: BSD-3-Clause 5fa3a1382SChris Kay */ 6fa3a1382SChris Kay 7fa3a1382SChris Kay/* eslint-env es6 */ 8fa3a1382SChris Kay 9fa3a1382SChris Kay"use strict"; 10fa3a1382SChris Kay 11*f64c5582SChris Kayconst fs = require("fs"); 12*f64c5582SChris Kayconst yaml = require("js-yaml"); 13*f64c5582SChris Kay 14fa3a1382SChris Kayconst { "trailer-exists": trailerExists } = require("@commitlint/rules").default; 15fa3a1382SChris Kay 16c4e8edabSChris Kay/* 17*f64c5582SChris Kay * The types and scopes accepted by both Commitlint and Commitizen are defined by the changelog 18*f64c5582SChris Kay * configuration file - `changelog.yaml` - as they decide which section of the changelog commits 19*f64c5582SChris Kay * with a given type and scope are placed in. 20c4e8edabSChris Kay */ 21c4e8edabSChris Kay 22*f64c5582SChris Kaylet changelog; 23*f64c5582SChris Kay 24*f64c5582SChris Kaytry { 25*f64c5582SChris Kay const contents = fs.readFileSync("changelog.yaml", "utf8"); 26*f64c5582SChris Kay 27*f64c5582SChris Kay changelog = yaml.load(contents); 28*f64c5582SChris Kay} catch (err) { 29*f64c5582SChris Kay console.log(err); 30*f64c5582SChris Kay 31*f64c5582SChris Kay throw err; 32*f64c5582SChris Kay} 33*f64c5582SChris Kay 34*f64c5582SChris Kayfunction getTypes(sections) { 35*f64c5582SChris Kay return sections.map(section => section.type) 36*f64c5582SChris Kay} 37*f64c5582SChris Kay 38*f64c5582SChris Kayfunction getScopes(subsections) { 39*f64c5582SChris Kay return subsections.flatMap(subsection => { 40*f64c5582SChris Kay const scope = subsection.scope ? [ subsection.scope ] : []; 41*f64c5582SChris Kay const subscopes = getScopes(subsection.subsections || []); 42c4e8edabSChris Kay 43c4e8edabSChris Kay return scope.concat(subscopes); 44c4e8edabSChris Kay }) 45c4e8edabSChris Kay}; 46c4e8edabSChris Kay 47*f64c5582SChris Kayconst types = getTypes(changelog.sections).sort(); /* Sort alphabetically */ 48*f64c5582SChris Kayconst scopes = getScopes(changelog.subsections).sort(); /* Sort alphabetically */ 49c4e8edabSChris Kay 50fa3a1382SChris Kaymodule.exports = { 51fa3a1382SChris Kay extends: ["@commitlint/config-conventional"], 52fa3a1382SChris Kay plugins: [ 53fa3a1382SChris Kay { 54fa3a1382SChris Kay rules: { 55fa3a1382SChris Kay "signed-off-by-exists": trailerExists, 56fa3a1382SChris Kay "change-id-exists": trailerExists, 57fa3a1382SChris Kay }, 58fa3a1382SChris Kay }, 59fa3a1382SChris Kay ], 60fa3a1382SChris Kay rules: { 61*f64c5582SChris Kay "header-max-length": [1, "always", 50], /* Warning */ 62*f64c5582SChris Kay "body-max-line-length": [1, "always", 72], /* Warning */ 63fa3a1382SChris Kay 64fa3a1382SChris Kay "change-id-exists": [1, "always", "Change-Id:"], /* Warning */ 65fa3a1382SChris Kay "signed-off-by-exists": [1, "always", "Signed-off-by:"], /* Warning */ 66c4e8edabSChris Kay 67*f64c5582SChris Kay "type-case": [2, "always", "lower-case" ], /* Error */ 68*f64c5582SChris Kay "type-enum": [2, "always", types], /* Error */ 69*f64c5582SChris Kay 70804e52e9SYann Gautier "scope-case": [2, "always", "lower-case"], /* Error */ 71*f64c5582SChris Kay "scope-empty": [2, "never"], /* Error */ 72c4e8edabSChris Kay "scope-enum": [1, "always", scopes] /* Warning */ 73fa3a1382SChris Kay }, 74fa3a1382SChris Kay}; 75