Skip to content

Commit 47047a8

Browse files
committed
feat: add stylelint
1 parent 331a4b5 commit 47047a8

7 files changed

+127
-0
lines changed

src/categories/js/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { commitlint } from './commitlint/commitlint.entrypoint';
33
import { eslint } from './eslint/eslint.entrypoint';
44
import { husky } from './husky/husky.entrypoint';
55
import { lintStaged } from './lint-staged/lint-staged.entrypoint';
6+
import { stylelint } from './stylelint/stylelint.entrypoint';
67
import { prettier } from './prettier/prettier.entrypoint';
78
import { standardVersion } from './standard-version/standard-version.entrypoint';
89
import { releaseWorkflow } from './release-workflow/release-worflow.entrypoint';
@@ -21,6 +22,7 @@ const options = {
2122
standardVersion,
2223
eslint,
2324
lintStaged,
25+
stylelint,
2426
releaseWorkflow,
2527
// named jestEntrypoint because in test environment jest name is reserved
2628
jest: jestEntrypoint,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { NpmScript } from 'src/utils/npm';
2+
3+
export interface Config {
4+
devDependencies: string[];
5+
scripts: NpmScript[];
6+
stylelintConfig: string;
7+
stylelintIgnore: string;
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { readableMultilineString } from 'src/utils/string';
2+
import { Config } from './config.interface';
3+
4+
const stylelintConfig = readableMultilineString`
5+
{
6+
"extends": [
7+
"stylelint-config-standard",
8+
"stylelint-config-rational-order-fix"
9+
],
10+
"plugins": [
11+
"stylelint-order",
12+
"stylelint-config-rational-order-fix/plugin"
13+
],
14+
"rules": {
15+
"declaration-empty-line-before": null,
16+
"no-empty-first-line": null,
17+
"order/properties-order": [],
18+
"plugin/rational-order": [true, {
19+
"border-in-box-model": false,
20+
"empty-line-between-groups": false
21+
}]
22+
}
23+
}
24+
`;
25+
26+
const stylelintIgnore = readableMultilineString`
27+
node_modules
28+
build
29+
dist
30+
`;
31+
32+
export const defaultConfig: Config = {
33+
stylelintConfig,
34+
stylelintIgnore,
35+
devDependencies: ['stylelint', 'stylelint-config-standard', 'stylelint-order', 'stylelint-config-rational-order-fix'],
36+
scripts: [
37+
{ name: 'csslint', script: 'stylelint "src/**/*.css"' },
38+
{ name: 'csslint:fix', script: 'stylelint "src/**/*.css" --fix' },
39+
],
40+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { readableMultilineString } from 'src/utils/string';
2+
import { Config } from './config.interface';
3+
4+
const stylelintConfig = readableMultilineString`
5+
{
6+
"extends": [
7+
"stylelint-config-standard",
8+
"stylelint-config-rational-order-fix"
9+
],
10+
"plugins": [
11+
"stylelint-order",
12+
"stylelint-config-rational-order-fix/plugin"
13+
],
14+
"rules": {
15+
"declaration-empty-line-before": null,
16+
"no-empty-first-line": null,
17+
"order/properties-order": [],
18+
"plugin/rational-order": [true, {
19+
"border-in-box-model": false,
20+
"empty-line-between-groups": false
21+
}]
22+
},
23+
"overrides": [
24+
{
25+
"files": ["**/*.{js,jsx,ts,tsx}"],
26+
"customSyntax": "@stylelint/postcss-css-in-js"
27+
}
28+
]
29+
}
30+
`;
31+
32+
const stylelintIgnore = readableMultilineString`
33+
node_modules
34+
.next
35+
build
36+
dist
37+
`;
38+
39+
export const reactTsConfig: Config = {
40+
stylelintConfig,
41+
stylelintIgnore,
42+
devDependencies: [
43+
'stylelint',
44+
'stylelint-config-standard',
45+
'stylelint-order',
46+
'stylelint-config-rational-order-fix',
47+
'@stylelint/postcss-css-in-js',
48+
],
49+
scripts: [
50+
{ name: 'csslint', script: 'stylelint "src/**/*.{css,js,jsx,ts,tsx}"' },
51+
{ name: 'csslint:fix', script: 'stylelint "src/**/*.{css,js,jsx,ts,tsx}" --fix' },
52+
],
53+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { jsCategoryState } from 'src/states/categories';
2+
import { defaultConfig } from './config/default.config';
3+
import { reactTsConfig } from './config/react:ts.config';
4+
5+
export const [getConfig] = jsCategoryState.useConfigState({
6+
default: defaultConfig,
7+
'react:ts': reactTsConfig,
8+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const STYLELINT_CONFIG_NAME = '.stylelintrc';
2+
export const STYLELINT_IGNORE_NAME = '.stylelintignore';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { addFileToRoot } from 'src/utils/fs';
2+
import { addScripts, installDevelopmentDependencies } from 'src/utils/npm';
3+
import { getConfig } from './stylelint.config';
4+
import { STYLELINT_CONFIG_NAME, STYLELINT_IGNORE_NAME } from './stylelint.const';
5+
6+
export const stylelint = async () => {
7+
const { stylelintConfig, stylelintIgnore, scripts, devDependencies } = getConfig();
8+
9+
await installDevelopmentDependencies(...devDependencies);
10+
await addScripts(...scripts);
11+
12+
await addFileToRoot(STYLELINT_CONFIG_NAME, stylelintConfig);
13+
await addFileToRoot(STYLELINT_IGNORE_NAME, stylelintIgnore);
14+
};

0 commit comments

Comments
 (0)