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