From 648531b6cb9d26769cd11c4b49698da5bb59ca10 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sat, 10 Oct 2020 16:26:54 -0700 Subject: [PATCH 01/11] build: add commitlint scope `deps-dev` --- commitlint.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/commitlint.config.js b/commitlint.config.js index e0e2fd57..8616ce9e 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -23,6 +23,7 @@ module.exports = { ...ls('./src/scripts'), ...ls('./src/api'), 'deps', + 'deps-dev', 'build', ], ], From 8c7f94c71e54b71e5c26d74fb52c7a1f7147d2ae Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sat, 10 Oct 2020 23:46:35 -0700 Subject: [PATCH 02/11] build: add top level directories to commitlint configuration --- commitlint.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/commitlint.config.js b/commitlint.config.js index 8616ce9e..89070da8 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -19,8 +19,11 @@ module.exports = { 1, 'always', [ + 'config', ...ls('./src/config'), + 'scripts', ...ls('./src/scripts'), + 'api', ...ls('./src/api'), 'deps', 'deps-dev', From dd996e8ea6a02d8d903f279a04d777cb4f842cee Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:28:42 -0700 Subject: [PATCH 03/11] feat(api): add `commit` API module with commitlint scope helper --- .../__fixtures__/ls/configs/.foorc.json | 0 .../__fixtures__/ls/configs/foo.config.js | 0 .../__tests__/__fixtures__/ls/configs/foo.js | 0 .../__fixtures__/ls/configs/foo.setup.ts | 0 src/api/__tests__/commit.js | 18 +++++++++++ src/api/commit.js | 31 +++++++++++++++++++ 6 files changed, 49 insertions(+) create mode 100644 src/api/__tests__/__fixtures__/ls/configs/.foorc.json create mode 100644 src/api/__tests__/__fixtures__/ls/configs/foo.config.js create mode 100644 src/api/__tests__/__fixtures__/ls/configs/foo.js create mode 100644 src/api/__tests__/__fixtures__/ls/configs/foo.setup.ts create mode 100644 src/api/__tests__/commit.js create mode 100644 src/api/commit.js diff --git a/src/api/__tests__/__fixtures__/ls/configs/.foorc.json b/src/api/__tests__/__fixtures__/ls/configs/.foorc.json new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/__fixtures__/ls/configs/foo.config.js b/src/api/__tests__/__fixtures__/ls/configs/foo.config.js new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/__fixtures__/ls/configs/foo.js b/src/api/__tests__/__fixtures__/ls/configs/foo.js new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/__fixtures__/ls/configs/foo.setup.ts b/src/api/__tests__/__fixtures__/ls/configs/foo.setup.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/commit.js b/src/api/__tests__/commit.js new file mode 100644 index 00000000..2c1f6184 --- /dev/null +++ b/src/api/__tests__/commit.js @@ -0,0 +1,18 @@ +const {ls} = require('../commit') + +const fixtures = './src/api/__tests__/__fixtures__' + +describe('ls', () => { + test('configs', () => { + const result = ls.configs(`${fixtures}/ls/configs`) + + const expected = [ + 'configs/.foorc', + 'configs/foo', + 'configs/foo.setup', + 'configs/foo', + ] + + expect(result.sort()).toEqual(expected.sort()) + }) +}) diff --git a/src/api/commit.js b/src/api/commit.js new file mode 100644 index 00000000..bff463d8 --- /dev/null +++ b/src/api/commit.js @@ -0,0 +1,31 @@ +const {readdirSync, statSync} = require('fs') +const {join, sep} = require('path') + +/** + * Enumerate config files + * + * Example + * + * - `dir/foo.js` + * - `dir/bar.config.js` + * - `dir/baz.json` + * - `dir/qux.ts` + * + * `ls.config('./dir') → ['dir/foo', 'dir/bar', 'dir/baz', 'dir/qux']` + * + * @param {string} path - directory to enumerate + */ +const configs = path => + readdirSync(path) + .filter(f => statSync(join(path, f)).isFile()) + .map( + f => + `${path.split(sep).reverse()[0]}/${f.replace( + /(\.config)?.(json|js|ts)/, + '', + )}`, + ) + +const ls = {configs} + +module.exports = {ls} From acefd0d87bdf45b1fbb4afe1a8b7cd99766d3f6e Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:35:06 -0700 Subject: [PATCH 04/11] feat(config/commitlint): add deps-dev , format , and lint as scopes (intended for `build()`) --- src/config/commitlint.config.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/config/commitlint.config.js b/src/config/commitlint.config.js index 64a0f753..9d9bdecd 100644 --- a/src/config/commitlint.config.js +++ b/src/config/commitlint.config.js @@ -19,6 +19,17 @@ module.exports = { ], ], 'scope-case': [1, 'always', 'kebab-case'], - 'scope-enum': [0, 'always', ['deps', 'build']], + 'scope-enum': [ + 0, + 'always', + [ + // build(...) + 'build', + 'deps', + 'deps-dev', + 'format', + 'lint', + ], + ], }, } From 8952227b066aa4191d322ef57cd4b486f49a67b8 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:37:56 -0700 Subject: [PATCH 05/11] fix(config/commitlint): remove 'build' scope --- src/config/commitlint.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config/commitlint.config.js b/src/config/commitlint.config.js index 9d9bdecd..b8f2377e 100644 --- a/src/config/commitlint.config.js +++ b/src/config/commitlint.config.js @@ -24,7 +24,6 @@ module.exports = { 'always', [ // build(...) - 'build', 'deps', 'deps-dev', 'format', From a76c5ee3ded28bacfc6f05b7b09a49aed1c39def Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:46:13 -0700 Subject: [PATCH 06/11] feat(api/commit): expose `scopes` module with some common scope lists --- src/api/commit.js | 20 +++++++++++++++++++- src/config/commitlint.config.js | 14 +++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/api/commit.js b/src/api/commit.js index bff463d8..e6545f70 100644 --- a/src/api/commit.js +++ b/src/api/commit.js @@ -1,6 +1,24 @@ const {readdirSync, statSync} = require('fs') const {join, sep} = require('path') +// +// Common scopes + +/** + * Build scopes + * - commit + * - deps + * - deps-dev + * - format + * - lint + */ +const build = () => ['commit', 'deps', 'deps-dev', 'format', 'lint'] + +const scopes = {build} + +// +// Scope helpers + /** * Enumerate config files * @@ -28,4 +46,4 @@ const configs = path => const ls = {configs} -module.exports = {ls} +module.exports = {ls, scopes} diff --git a/src/config/commitlint.config.js b/src/config/commitlint.config.js index b8f2377e..39a4b52e 100644 --- a/src/config/commitlint.config.js +++ b/src/config/commitlint.config.js @@ -1,3 +1,5 @@ +const {scopes} = require('../api/commit') + module.exports = { extends: ['@commitlint/config-conventional'], rules: { @@ -19,16 +21,6 @@ module.exports = { ], ], 'scope-case': [1, 'always', 'kebab-case'], - 'scope-enum': [ - 0, - 'always', - [ - // build(...) - 'deps', - 'deps-dev', - 'format', - 'lint', - ], - ], + 'scope-enum': [0, 'always', scopes.build()], }, } From b5cda63e75f8be272ee58745c579eb32ed5a0b79 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:50:33 -0700 Subject: [PATCH 07/11] build(commit): dogfood `ls` helper from API --- commitlint.config.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/commitlint.config.js b/commitlint.config.js index 89070da8..afa33ffe 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,16 +1,4 @@ -const {readdirSync, statSync} = require('fs') -const {join, sep} = require('path') - -const ls = path => - readdirSync(path) - .filter(f => statSync(join(path, f)).isFile()) - .map( - f => - `${path.split(sep).reverse()[0]}/${f.replace( - /(\.config)?.(json|js)/, - '', - )}`, - ) +const {ls} = require('./src/api/commit') module.exports = { extends: ['./src/config/commitlint.config'], @@ -20,14 +8,14 @@ module.exports = { 'always', [ 'config', - ...ls('./src/config'), 'scripts', - ...ls('./src/scripts'), 'api', - ...ls('./src/api'), 'deps', 'deps-dev', 'build', + ...ls.configs('./src/config'), + ...ls.configs('./src/scripts'), + ...ls.configs('./src/api'), ], ], }, From a2c0baf7c77193495bc9f4ddd487dc390564e8e4 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 00:52:26 -0700 Subject: [PATCH 08/11] build(commit): dogfood `scopes` helper from API --- commitlint.config.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/commitlint.config.js b/commitlint.config.js index afa33ffe..45a4623e 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,4 +1,4 @@ -const {ls} = require('./src/api/commit') +const {ls, scopes} = require('./src/api/commit') module.exports = { extends: ['./src/config/commitlint.config'], @@ -7,12 +7,10 @@ module.exports = { 1, 'always', [ + ...scopes.build(), 'config', 'scripts', 'api', - 'deps', - 'deps-dev', - 'build', ...ls.configs('./src/config'), ...ls.configs('./src/scripts'), ...ls.configs('./src/api'), From a90833105f0a53e6189c7a9bab98072abdf2b133 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 01:06:10 -0700 Subject: [PATCH 09/11] feat(api/commit): add `ls.dirs` scope enumeration helper --- .../__fixtures__/ls/dirs/.baz/.gitkeep | 0 .../__fixtures__/ls/dirs/bar/.gitkeep | 0 .../__fixtures__/ls/dirs/foo/.gitkeep | 0 src/api/__tests__/commit.js | 18 ++++++++++++++++++ src/api/commit.js | 14 +++++++++++++- 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/api/__tests__/__fixtures__/ls/dirs/.baz/.gitkeep create mode 100644 src/api/__tests__/__fixtures__/ls/dirs/bar/.gitkeep create mode 100644 src/api/__tests__/__fixtures__/ls/dirs/foo/.gitkeep diff --git a/src/api/__tests__/__fixtures__/ls/dirs/.baz/.gitkeep b/src/api/__tests__/__fixtures__/ls/dirs/.baz/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/__fixtures__/ls/dirs/bar/.gitkeep b/src/api/__tests__/__fixtures__/ls/dirs/bar/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/__fixtures__/ls/dirs/foo/.gitkeep b/src/api/__tests__/__fixtures__/ls/dirs/foo/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/api/__tests__/commit.js b/src/api/__tests__/commit.js index 2c1f6184..00949bac 100644 --- a/src/api/__tests__/commit.js +++ b/src/api/__tests__/commit.js @@ -15,4 +15,22 @@ describe('ls', () => { expect(result.sort()).toEqual(expected.sort()) }) + + describe('dirs', () => { + test('without prefix', () => { + const result = ls.dirs(`${fixtures}/ls/dirs`) + + const expected = ['.baz', 'bar', 'foo'] + + expect(result.sort()).toEqual(expected.sort()) + }) + + test('with prefix', () => { + const result = ls.dirs(`${fixtures}/ls/dirs`, 'prefix') + + const expected = ['prefix/.baz', 'prefix/bar', 'prefix/foo'] + + expect(result.sort()).toEqual(expected.sort()) + }) + }) }) diff --git a/src/api/commit.js b/src/api/commit.js index e6545f70..06b5d312 100644 --- a/src/api/commit.js +++ b/src/api/commit.js @@ -44,6 +44,18 @@ const configs = path => )}`, ) -const ls = {configs} +/** + * Enumerate one level of directories + * + * @param {string} path - directory to enumerate + * @param {string} [prefix] - prefix for each scope entry (e.g: `prefix/entry`) + */ +const dirs = (path, prefix) => + readdirSync(path) + .filter(f => statSync(join(path, f)).isDirectory()) + .map(item => (prefix ? `${prefix}/${item}` : item)) + .map(item => item.toLowerCase()) + +const ls = {configs, dirs} module.exports = {ls, scopes} From 8dbc250166a274e8cd7e5d9a199cce93cda19a9b Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sat, 10 Oct 2020 23:44:39 -0700 Subject: [PATCH 10/11] refactor(config/eslint): rename ESlint 'builder' --- src/config/eslintrc-react.js | 2 +- src/config/eslintrc.js | 2 +- src/config/helpers/{eslint.js => build-eslint.js} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/config/helpers/{eslint.js => build-eslint.js} (100%) diff --git a/src/config/eslintrc-react.js b/src/config/eslintrc-react.js index 608378db..38f61a57 100644 --- a/src/config/eslintrc-react.js +++ b/src/config/eslintrc-react.js @@ -1,3 +1,3 @@ -const {buildConfig} = require('./helpers/eslint') +const {buildConfig} = require('./helpers/build-eslint') module.exports = buildConfig({withReact: true}) diff --git a/src/config/eslintrc.js b/src/config/eslintrc.js index bdf9ebf6..67e2ff47 100644 --- a/src/config/eslintrc.js +++ b/src/config/eslintrc.js @@ -1,3 +1,3 @@ -const {buildConfig} = require('./helpers/eslint') +const {buildConfig} = require('./helpers/build-eslint') module.exports = buildConfig() diff --git a/src/config/helpers/eslint.js b/src/config/helpers/build-eslint.js similarity index 100% rename from src/config/helpers/eslint.js rename to src/config/helpers/build-eslint.js From be88ce0db68f02a5e97e4a1a9f3b639179c0e3a3 Mon Sep 17 00:00:00 2001 From: Jamie Rolfs Date: Sun, 11 Oct 2020 14:15:55 -0700 Subject: [PATCH 11/11] feat(config/eslintrc): enable `import/order` and `sort-imports` rule BREAKING CHANGE: sets `import/order` (with `alphabetize` set to `asc`) and `sort-imports` rules to `error` --- src/config/helpers/build-eslint.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/config/helpers/build-eslint.js b/src/config/helpers/build-eslint.js index 9b9dac80..53978d16 100644 --- a/src/config/helpers/build-eslint.js +++ b/src/config/helpers/build-eslint.js @@ -40,7 +40,6 @@ const buildConfig = ({withReact = false} = {}) => { ifReact('plugin:react-hooks/recommended'), ].filter(Boolean), rules: { - 'prettier/prettier': 'error', 'import/prefer-default-export': 'off', 'import/no-extraneous-dependencies': [ 'error', @@ -55,7 +54,21 @@ const buildConfig = ({withReact = false} = {}) => { optionalDependencies: false, }, ], + 'import/order': [ + 'error', + { + alphabetize: {order: 'asc'}, + 'newlines-between': 'always', + pathGroups: [ + {pattern: 'src/**/*', group: 'parent', position: 'before'}, + {pattern: 'assets/**/*', group: 'parent', position: 'before'}, + ], + pathGroupsExcludedImportTypes: ['builtin'], + }, + ], 'no-void': ['error', {allowAsStatement: true}], + 'prettier/prettier': 'error', + 'sort-imports': ['error', {ignoreDeclarationSort: true}], ...parserRules(false, isReact), }, overrides: [