Skip to content

extends should be resolved from left to right #2069

Closed
@ikatyang

Description

@ikatyang

The order of the current extends resolution is counterintuitive, extends are usually resolved from left to right, but it is currently resolved from right to left.

Expected Behavior

extends should be resolved from left to right.

Current Behavior

extends is currently resolved from right to left.

Affected packages

  • @commitlint/resolve-extends

Possible Solution

Change the order of the extends resolution.

Steps to Reproduce (for bugs)

Add the following test case to /@commitlint/resolve-extends/src/index.test.ts:

test('extends rules from left to right with overlap', () => {
  const input = {extends: ['left', 'right']};

  const require = (id: string) => {
    switch (id) {
      case 'left':
        return {rules: {a: true}};
      case 'right':
        return {rules: {a: false, b: true}};
      default:
        return {};
    }
  };

  const ctx = {resolve: id, require: jest.fn(require)} as ResolveExtendsContext;

  const actual = resolveExtends(input, ctx);

  const expected = {
    extends: ['left', 'right'],
    rules: {
      a: false,
      b: true,
    },
  };

  expect(actual).toEqual(expected);
});
● extends rules from left to right with overlap

    expect(received).toEqual(expected) // deep equality

    - Expected  - 1
    + Received  + 1

    @@ -2,9 +2,9 @@
        "extends": Array [
          "left",
          "right",
        ],
        "rules": Object {
    -     "a": false,
    +     "a": true,
          "b": true,
        },
      }

Context

I'd like to have a base config and extend it as needed, for example I want to use the base config most of the time:

{"extends": ["my-config"]}

and override it if the repository has some sharable special requirements:

{"extends": ["my-config", "my-config/special-requirements"]}

Your Environment

Executable Version
commitlint --version 9.1.2

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions