@romashka_rv/frontend-config 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Frontend Configs
2
+
3
+ Configs for frontend (ESLint 9, React 19, TypeScript 5)
@@ -0,0 +1,15 @@
1
+ module.exports = {
2
+ extends: ['@commitlint/config-conventional'],
3
+ rules: {
4
+ 'header-max-length': [0, 'always'],
5
+ 'footer-max-line-length': [0, 'always'],
6
+ 'body-max-line-length': [0, 'always'],
7
+ 'footer-leading-blank': [0, 'always'],
8
+ 'body-leading-blank': [0, 'always'],
9
+ 'type-enum': [
10
+ 2,
11
+ 'always',
12
+ ['ci', 'docs', 'feature', 'fix', 'refactoring', 'revert', 'test']
13
+ ]
14
+ }
15
+ };
@@ -0,0 +1,149 @@
1
+ import js from "@eslint/js";
2
+ import react from "eslint-plugin-react";
3
+ import reactHooks from "eslint-plugin-react-hooks";
4
+ import tsEslint from "@typescript-eslint/eslint-plugin";
5
+ import tsParser from "@typescript-eslint/parser";
6
+ import prettier from "eslint-plugin-prettier";
7
+ import importPlugin from "eslint-plugin-import";
8
+ import importHelpers from "eslint-plugin-import-helpers";
9
+ import unusedImports from "eslint-plugin-unused-imports";
10
+ import stylistic from "@stylistic/eslint-plugin";
11
+ import nextPlugin from "@next/eslint-plugin-next";
12
+ import globals from "globals";
13
+
14
+ const generatePathGroup = (name) => {
15
+ return [
16
+ `/^${name}/`, // import like: layouts/...
17
+ `/^@${name}/`, // import like: @layouts/...
18
+ `/^\\.\\/${name}/` // import like: ./layouts/...
19
+ ];
20
+ };
21
+
22
+ export default [
23
+ {
24
+ files: ["**/*.{ts,tsx,js,jsx}"],
25
+ ignores: [
26
+ "**/node_modules/**",
27
+ "**/.next/**",
28
+ "**/dist/**",
29
+ "**/build/**"
30
+ ],
31
+ languageOptions: {
32
+ parser: tsParser,
33
+ parserOptions: {
34
+ ecmaVersion: "latest",
35
+ sourceType: "module",
36
+ ecmaFeatures: { jsx: true },
37
+ project: ["tsconfig.json"]
38
+ },
39
+ globals: {
40
+ ...globals.browser,
41
+ ...globals.node
42
+ }
43
+ },
44
+ plugins: {
45
+ react,
46
+ "react-hooks": reactHooks,
47
+ "@typescript-eslint": tsEslint,
48
+ prettier,
49
+ import: importPlugin,
50
+ "import-helpers": importHelpers,
51
+ "unused-imports": unusedImports,
52
+ "@stylistic": stylistic,
53
+ "@next/next": nextPlugin
54
+ },
55
+ settings: {
56
+ react: { version: "detect" },
57
+ "import/resolver": {
58
+ node: {
59
+ paths: ["src"],
60
+ extensions: [".js", ".jsx", ".ts", ".tsx"]
61
+ },
62
+ typescript: {
63
+ alwaysTryTypes: true,
64
+ project: ["tsconfig.json"]
65
+ }
66
+ }
67
+ },
68
+ rules: {
69
+ // --- base ---
70
+ ...js.configs.recommended.rules,
71
+
72
+ // --- react ---
73
+ ...react.configs.recommended.rules,
74
+
75
+ // --- typescript ---
76
+ ...tsEslint.configs.recommended.rules,
77
+
78
+ // --- prettier ---
79
+ ...prettier.configs.recommended.rules,
80
+
81
+ // --- imports ---
82
+ ...importPlugin.configs.recommended.rules,
83
+
84
+ // --- next.js ---
85
+ ...nextPlugin.configs.recommended.rules,
86
+
87
+ // --- custom ---
88
+ "unused-imports/no-unused-imports": "error",
89
+ "react-hooks/rules-of-hooks": "error",
90
+ "react-hooks/exhaustive-deps": "off",
91
+
92
+ // jsx/props
93
+ "react/no-unknown-property": ["error", { ignore: ["classNames"] }],
94
+ "react/react-in-jsx-scope": "off",
95
+ "react/no-unescaped-entities": "off",
96
+
97
+ // style
98
+ "react/jsx-tag-spacing": ["error"],
99
+ "react/jsx-newline": "error",
100
+ quotes: ["error", "double"],
101
+ "@stylistic/semi": ["error", "always"],
102
+ "object-curly-spacing": ["error", "always"],
103
+ "comma-dangle": ["error", "never"],
104
+ "linebreak-style": ["error", "unix"],
105
+ "no-trailing-spaces": ["error", { skipBlankLines: true }],
106
+ "no-multiple-empty-lines": ["error", { max: 1, maxBOF: 0, maxEOF: 0 }],
107
+ "eol-last": "error",
108
+
109
+ // ts
110
+ "@typescript-eslint/ban-ts-comment": "warn",
111
+ "@typescript-eslint/no-empty-function": "off",
112
+ "@typescript-eslint/no-non-null-assertion": "off",
113
+ "@typescript-eslint/consistent-type-imports": "error",
114
+
115
+ // imports ordering
116
+ "import-helpers/order-imports": [
117
+ "error",
118
+ {
119
+ newlinesBetween: "always",
120
+ groups: [
121
+ "module",
122
+ ...[
123
+ "layouts",
124
+ "pages",
125
+ "components",
126
+ "hooks",
127
+ "functions",
128
+ "utils",
129
+ "assets",
130
+ "constants",
131
+ "types"
132
+ ].reduce((acc, name) => acc.concat(generatePathGroup(name)), []),
133
+ "parent",
134
+ "sibling",
135
+ "index"
136
+ ],
137
+ alphabetize: { order: "asc", ignoreCase: true }
138
+ }
139
+ ],
140
+
141
+ // dep
142
+ eqeqeq: ["error", "always", { null: "ignore" }],
143
+ "import/no-cycle": [2, { maxDepth: 1 }],
144
+ "no-extra-boolean-cast": "off",
145
+ "no-case-declarations": "off",
146
+ "prettier/prettier": ["error", { trailingComma: "none" }]
147
+ }
148
+ }
149
+ ];
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@romashka_rv/frontend-config",
3
+ "version": "3.0.0",
4
+ "description": "Configs for frontend (ESLint 9, React 19, TypeScript 5)",
5
+ "repository": "https://github.com/RomashkaRV/frontend.configs",
6
+ "author": "RomashkaRV",
7
+ "license": "MIT",
8
+ "dependencies": {
9
+ "@commitlint/cli": "19.8.1",
10
+ "@commitlint/config-conventional": "19.8.1",
11
+ "@next/eslint-plugin-next": "^15.5.4",
12
+ "commitlint": "19.8.1",
13
+ "globals": "^16.4.0"
14
+ },
15
+ "peerDependencies": {
16
+ "@stylistic/eslint-plugin": "^5.2.0",
17
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
18
+ "@typescript-eslint/parser": "^8.0.0",
19
+ "eslint": "^9.0.0",
20
+ "eslint-config-prettier": "^10.0.0",
21
+ "eslint-plugin-import": "^2.32.0",
22
+ "eslint-plugin-import-helpers": "^2.0.0",
23
+ "eslint-plugin-prettier": "^5.2.0",
24
+ "eslint-plugin-react": "^7.37.0",
25
+ "eslint-plugin-react-hooks": "^5.2.0",
26
+ "eslint-plugin-unused-imports": "^4.2.0",
27
+ "prettier": "^3.0.0",
28
+ "stylelint": "^16.0.0",
29
+ "stylelint-config-standard-scss": "^15.0.0",
30
+ "stylelint-order": "^7.0.0",
31
+ "stylelint-scss": "^6.0.0"
32
+ },
33
+ "exports": {
34
+ "./commitlint": "./commitlint.config.cjs"
35
+ }
36
+ }
package/prettier.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "trailingComma": "none"
3
+ }
@@ -0,0 +1,320 @@
1
+ {
2
+ "extends": "stylelint-config-standard-scss",
3
+ "plugins": [
4
+ "stylelint-order"
5
+ ],
6
+ "rules": {
7
+ "scss/double-slash-comment-whitespace-inside": null,
8
+ "selector-type-case": null,
9
+ "no-descending-specificity": null,
10
+ "selector-class-pattern": null,
11
+ "order/order": [
12
+ "custom-properties",
13
+ "declarations"
14
+ ],
15
+ "custom-property-empty-line-before": null,
16
+ "declaration-empty-line-before": null,
17
+ "color-function-notation": null,
18
+ "alpha-value-notation": null,
19
+ "color-hex-length": null,
20
+ "property-no-vendor-prefix": null,
21
+ "value-keyword-case": [
22
+ "lower",
23
+ {
24
+ "ignoreProperties": [
25
+ "text-rendering"
26
+ ]
27
+ }
28
+ ],
29
+ "order/properties-order": [
30
+ {
31
+ "groupName": "width",
32
+ "emptyLineBefore": "always",
33
+ "properties": [
34
+ "width",
35
+ "min-width",
36
+ "max-width",
37
+ "height",
38
+ "min-height",
39
+ "max-height"
40
+ ]
41
+ },
42
+ {
43
+ "emptyLineBefore": "always",
44
+ "properties": ["box-sizing"]
45
+ },
46
+ {
47
+ "groupName": "flex-grow",
48
+ "emptyLineBefore": "always",
49
+ "properties": [
50
+ "flex",
51
+ "flex-flow",
52
+ "flex-basis",
53
+ "flex-grow",
54
+ "flex-shrink"
55
+ ]
56
+ },
57
+ {
58
+ "groupName": "margin",
59
+ "emptyLineBefore": "always",
60
+ "properties": [
61
+ "margin",
62
+ "margin-top",
63
+ "margin-right",
64
+ "margin-bottom",
65
+ "margin-left",
66
+ "padding",
67
+ "padding-top",
68
+ "padding-right",
69
+ "padding-bottom",
70
+ "padding-left"
71
+ ]
72
+ },
73
+ {
74
+ "groupName": "position",
75
+ "emptyLineBefore": "always",
76
+ "properties": [
77
+ "position",
78
+ "top",
79
+ "left",
80
+ "right",
81
+ "bottom"
82
+ ]
83
+ },
84
+ {
85
+ "groupName": "flex-order",
86
+ "emptyLineBefore": "always",
87
+ "properties": [
88
+ "order",
89
+ "align-self"
90
+ ]
91
+ },
92
+ {
93
+ "groupName": "display",
94
+ "emptyLineBefore": "always",
95
+ "properties": [
96
+ "display",
97
+ "grid-template-columns",
98
+ "align-content",
99
+ "align-items",
100
+ "justify-content",
101
+ "flex-direction",
102
+ "vertical-align",
103
+ "flex-wrap",
104
+ "gap"
105
+ ]
106
+ },
107
+ {
108
+ "groupName": "font",
109
+ "emptyLineBefore": "always",
110
+ "properties": [
111
+ "font",
112
+ "font-family",
113
+ "font-size",
114
+ "font-style",
115
+ "font-weight",
116
+ "font-variant",
117
+ "font-size-adjust",
118
+ "font-stretch",
119
+ "line-height",
120
+ "letter-spacing"
121
+ ]
122
+ },
123
+ {
124
+ "groupName": "text",
125
+ "emptyLineBefore": "always",
126
+ "properties": [
127
+ "text-align",
128
+ "text-align-last",
129
+ "text-outline",
130
+ "text-transform",
131
+ "text-wrap",
132
+ "text-overflow",
133
+ "text-overflow-ellipsis",
134
+ "text-overflow-mode",
135
+ "text-decoration",
136
+ "text-emphasis",
137
+ "text-emphasis-color",
138
+ "text-emphasis-style",
139
+ "text-emphasis-position",
140
+ "text-indent",
141
+ "text-justify",
142
+ "text-shadow",
143
+ "white-space",
144
+ "word-spacing",
145
+ "word-wrap",
146
+ "word-break"
147
+ ]
148
+ },
149
+ {
150
+ "groupName": "list",
151
+ "emptyLineBefore": "always",
152
+ "properties": [
153
+ "list-style",
154
+ "list-style-position",
155
+ "list-style-type",
156
+ "list-style-image"
157
+ ]
158
+ },
159
+ {
160
+ "groupName": "animation",
161
+ "emptyLineBefore": "always",
162
+ "properties": [
163
+ "animation",
164
+ "animation-name",
165
+ "animation-duration",
166
+ "animation-play-state",
167
+ "animation-timing-function",
168
+ "animation-delay",
169
+ "animation-iteration-count",
170
+ "animation-direction"
171
+ ]
172
+ },
173
+ "content",
174
+ "cursor",
175
+ "resize",
176
+ {
177
+ "emptyLineBefore": "always",
178
+ "properties": [
179
+ "user-select",
180
+ "pointer-events"
181
+ ]
182
+ },
183
+ {
184
+ "emptyLineBefore": "always",
185
+ "properties": [
186
+ "transform",
187
+ "transform-origin"
188
+ ]
189
+ },
190
+ {
191
+ "groupName": "border",
192
+ "emptyLineBefore": "always",
193
+ "properties": [
194
+ "outline",
195
+ "outline-width",
196
+ "outline-style",
197
+ "outline-color",
198
+ "outline-offset",
199
+ "border",
200
+ "border-width",
201
+ "border-style",
202
+ "border-color",
203
+ "border-top",
204
+ "border-top-width",
205
+ "border-top-style",
206
+ "border-top-color",
207
+ "border-right",
208
+ "border-right-width",
209
+ "border-right-style",
210
+ "border-right-color",
211
+ "border-bottom",
212
+ "border-bottom-width",
213
+ "border-bottom-style",
214
+ "border-bottom-color",
215
+ "border-left",
216
+ "border-left-width",
217
+ "border-left-style",
218
+ "border-left-color",
219
+ "border-radius",
220
+ "border-top-left-radius",
221
+ "border-top-right-radius",
222
+ "border-bottom-right-radius",
223
+ "border-bottom-left-radius",
224
+ "border-image",
225
+ "border-image-source",
226
+ "border-image-slice",
227
+ "border-image-width",
228
+ "border-image-outset",
229
+ "border-image-repeat",
230
+ "border-spacing",
231
+ "border-collapse"
232
+ ]
233
+ },
234
+ {
235
+ "groupName": "transition",
236
+ "emptyLineBefore": "always",
237
+ "properties": [
238
+ "transition",
239
+ "transition-delay",
240
+ "transition-timing-function",
241
+ "transition-duration",
242
+ "transition-property"
243
+ ]
244
+ },
245
+ {
246
+ "emptyLineBefore": "always",
247
+ "properties": [
248
+ "overflow",
249
+ "overflow-x",
250
+ "overflow-y"
251
+ ]
252
+ },
253
+ {
254
+ "emptyLineBefore": "always",
255
+ "properties": [
256
+ "visibility",
257
+ "opacity"
258
+ ]
259
+ },
260
+ {
261
+ "emptyLineBefore": "always",
262
+ "properties": ["z-index"]
263
+ },
264
+ {
265
+ "emptyLineBefore": "always",
266
+ "properties": ["box-shadow"]
267
+ },
268
+ {
269
+ "emptyLineBefore": "always",
270
+ "properties": ["backdrop-filter"]
271
+ },
272
+ {
273
+ "groupName": "color",
274
+ "emptyLineBefore": "always",
275
+ "properties": [
276
+ "color",
277
+ "background",
278
+ "background-color",
279
+ "background-image",
280
+ "background-repeat",
281
+ "background-attachment",
282
+ "background-position",
283
+ "background-position-x",
284
+ "background-position-y",
285
+ "background-clip",
286
+ "background-origin",
287
+ "background-size"
288
+ ]
289
+ }
290
+ ],
291
+ "property-disallowed-list": [
292
+ "clip",
293
+ "zoom",
294
+ "float",
295
+ "clear",
296
+ "hyphens",
297
+ "table-layout",
298
+ "empty-cells",
299
+ "caption-side",
300
+ "nav-index",
301
+ "nav-right",
302
+ "nav-up",
303
+ "nav-down",
304
+ "nav-left",
305
+ "tab-size",
306
+ "box-decoration-break",
307
+ "quotes",
308
+ "counter-reset",
309
+ "counter-increment",
310
+ "table-layout",
311
+ "empty-cells",
312
+ "caption-side",
313
+ "nav-index",
314
+ "nav-up",
315
+ "nav-right",
316
+ "nav-down",
317
+ "nav-left"
318
+ ]
319
+ }
320
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": [
5
+ "dom",
6
+ "dom.iterable",
7
+ "esnext"
8
+ ],
9
+ "allowJs": true,
10
+ "skipLibCheck": true,
11
+ "strict": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "noEmit": true,
14
+ "esModuleInterop": true,
15
+ "module": "esnext",
16
+ "moduleResolution": "node",
17
+ "resolveJsonModule": true,
18
+ "isolatedModules": true,
19
+ "jsx": "preserve",
20
+ "incremental": true,
21
+ "baseUrl": "./src"
22
+ },
23
+ "include": [
24
+ "**/*.ts",
25
+ "**/*.tsx"
26
+ ],
27
+ "exclude": [
28
+ "node_modules"
29
+ ]
30
+ }