@activatus/code-standards 2.0.0 → 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.
Files changed (51) hide show
  1. package/README.md +12 -13
  2. package/docs/Guides/_category_.json +2 -2
  3. package/docs/Guides/migrating.md +33 -16
  4. package/docs/Guides/setup.md +46 -18
  5. package/docs/Standards/_category_.json +2 -2
  6. package/docs/Standards/agent-skills.md +29 -29
  7. package/docs/Standards/agent-specs.md +17 -32
  8. package/docs/Standards/direnv.mdx +8 -8
  9. package/docs/Standards/documentation.md +5 -2
  10. package/docs/Standards/editorconfig.md +23 -21
  11. package/docs/Standards/eslint.md +593 -402
  12. package/docs/Standards/human-readable-names.md +61 -21
  13. package/docs/Standards/lint-errors.md +37 -5
  14. package/docs/Standards/prettier.md +35 -26
  15. package/docs/Standards/readable-code.md +30 -0
  16. package/docs/Standards/stylelint.md +26 -11
  17. package/docs/Standards/styling.md +9 -3
  18. package/docs/Standards/tech-stack.md +3 -1
  19. package/docs/Structure/_category_.json +2 -2
  20. package/docs/Structure/component-organization.md +9 -2
  21. package/docs/Structure/folder-structure.md +26 -13
  22. package/docs/Structure/naming-conventions.md +0 -2
  23. package/docs/intro.md +1 -3
  24. package/docs/ontology.md +21 -26
  25. package/docs/templates.mdx +15 -38
  26. package/docs/version-history.md +133 -6
  27. package/package.json +6 -2
  28. package/scripts/renameSymbol.mjs +188 -0
  29. package/static/templates/.editorconfig +8 -11
  30. package/static/templates/AGENTS.md +16 -13
  31. package/static/templates/docs/development/coding-standards.md +4 -0
  32. package/static/templates/docsSite/docusaurus.config.mjs +144 -0
  33. package/static/templates/docsSite/sidebars.mjs +7 -0
  34. package/static/templates/docsSite/src/css/custom.css +6 -0
  35. package/static/templates/docsSite/tsconfig.json +5 -5
  36. package/static/templates/eslint/base/eslint.config.mjs +95 -70
  37. package/static/templates/eslint/nextjs/eslint.config.mjs +170 -126
  38. package/static/templates/eslint/react/eslint.config.mjs +160 -125
  39. package/static/templates/eslint/typescript/eslint.config.mjs +143 -115
  40. package/static/templates/globals.css +9 -9
  41. package/static/templates/next.config.mjs +13 -10
  42. package/static/templates/prettier.config.mjs +26 -0
  43. package/static/templates/stylelint/css/stylelint.config.mjs +37 -25
  44. package/static/templates/stylelint/scss/stylelint.config.mjs +10 -7
  45. package/docs/Standards/branch-naming.md +0 -66
  46. package/docs/Standards/conventional-commits.md +0 -189
  47. package/static/templates/.commitlintrc.json +0 -3
  48. package/static/templates/docsSite/docusaurus.config.ts +0 -119
  49. package/static/templates/docsSite/sidebars.ts +0 -8
  50. package/static/templates/husky/commit-msg +0 -1
  51. package/static/templates/prettier.config.js +0 -17
@@ -8,130 +8,174 @@ import unicorn from "eslint-plugin-unicorn";
8
8
  import globals from "globals";
9
9
 
10
10
  export default [
11
- { ignores: [".next/", "out/", "build/", "coverage/", "next-env.d.ts", "**/vendor/**"] },
12
- ...nextVitals,
13
- ...nextTypescript,
14
- comments.recommended,
15
- importX.recommended,
16
- importX.typescript,
17
- unicorn.configs.recommended,
18
- {
19
- languageOptions: { globals: { ...globals.browser, ...globals.node } },
20
- settings: {
21
- react: { version: "19.0" },
22
- "import-x/resolver-next": [createTypeScriptImportResolver()],
23
- },
24
- rules: {
25
- "@eslint-community/eslint-comments/require-description": "error",
26
- "func-style": ["error", "expression"],
27
- "max-depth": ["error", 3],
28
- "max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
29
- "no-nested-ternary": "error",
30
- "no-var": "error",
31
- "prefer-arrow-callback": "error",
32
- "prefer-const": "error",
33
- "no-magic-numbers": [
34
- "error",
35
- {
36
- ignore: [-1, 0, 1],
37
- ignoreArrayIndexes: true,
38
- ignoreDefaultValues: true,
39
- enforceConst: true,
40
- },
41
- ],
42
- "no-restricted-syntax": [
43
- "error",
44
- { selector: "ClassDeclaration", message: "Use functions, not classes." },
45
- { selector: "ClassExpression", message: "Use functions, not classes." },
46
- { selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
47
- {
48
- selector: "VariableDeclaration[kind='let']",
49
- message:
50
- "Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
51
- },
52
- {
53
- selector: "FunctionDeclaration[params.length>1]",
54
- message: "Use a single object parameter when a function needs more than one value.",
55
- },
56
- {
57
- selector:
58
- "VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
59
- message: "Use a single object parameter when a function needs more than one value.",
60
- },
61
- ],
62
- "import-x/no-cycle": "error",
63
- "import-x/no-default-export": "error",
64
- "no-use-before-define": "error",
65
- "unicorn/default-export-style": "off",
66
- "unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
67
- "unicorn/name-replacements": [
68
- "error",
69
- {
70
- // Dictionary words: see "Dictionary" in the Human-Readable Names standard.
71
- replacements: { docs: false, props: false, utils: false },
72
- // Third-party names, allowed only exactly as they are.
73
- allowList: { ref: true, params: true, searchParams: true },
74
- },
75
- ],
76
- "react/function-component-definition": [
77
- "error",
78
- { namedComponents: "arrow-function", unnamedComponents: "arrow-function" },
79
- ],
80
- "react/jsx-no-bind": "error",
81
- "react/no-multi-comp": "error",
82
- },
83
- },
84
- {
85
- files: ["**/*.{ts,tsx}"],
86
- rules: {
87
- "no-undef": "off",
88
- "no-magic-numbers": "off",
89
- "no-use-before-define": "off",
90
- "@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "never" }],
91
- "@typescript-eslint/consistent-type-imports": "error",
92
- "@typescript-eslint/naming-convention": [
93
- "error",
94
- {
95
- selector: ["typeAlias", "interface"],
96
- format: ["PascalCase"],
97
- custom: { regex: "(Props|Type)$", match: true },
98
- },
99
- ],
100
- "@typescript-eslint/no-explicit-any": "error",
101
- "@typescript-eslint/no-magic-numbers": [
102
- "error",
103
- {
104
- ignore: [-1, 0, 1],
105
- ignoreArrayIndexes: true,
106
- ignoreDefaultValues: true,
107
- enforceConst: true,
108
- ignoreEnums: true,
109
- ignoreNumericLiteralTypes: true,
110
- },
111
- ],
112
- "@typescript-eslint/no-non-null-assertion": "error",
113
- "@typescript-eslint/no-use-before-define": "error",
114
- },
115
- },
116
- {
117
- files: ["**/*.test.{ts,tsx}"],
118
- rules: {
119
- "max-lines": "off",
120
- "no-magic-numbers": "off",
121
- "@typescript-eslint/no-magic-numbers": "off",
122
- },
123
- },
124
- {
125
- files: [
126
- "**/*.config.{js,mjs,ts}",
127
- "**/*.stories.tsx",
128
- "app/**/{page,layout,template,default,loading,error,global-error,not-found}.tsx",
129
- ],
130
- rules: { "import-x/no-default-export": "off" },
131
- },
132
- {
133
- files: ["**/*.config.{js,mjs,ts}"],
134
- rules: { "unicorn/no-top-level-side-effects": "off" },
135
- },
136
- prettier,
11
+ {
12
+ ignores: [
13
+ ".next/",
14
+ "out/",
15
+ "build/",
16
+ "coverage/",
17
+ "next-env.d.ts",
18
+ "**/vendor/**",
19
+ ],
20
+ },
21
+ ...nextVitals,
22
+ ...nextTypescript,
23
+ comments.recommended,
24
+ importX.recommended,
25
+ importX.typescript,
26
+ unicorn.configs.recommended,
27
+ {
28
+ languageOptions: {
29
+ globals: { ...globals.browser, ...globals.node },
30
+ },
31
+ settings: {
32
+ // Keep this. eslint-plugin-react crashes on ESLint 10 if it has to detect the version itself.
33
+ // Update the number when the project upgrades React.
34
+ react: { version: "19.0" },
35
+ "import-x/resolver-next": [createTypeScriptImportResolver()],
36
+ },
37
+ rules: {
38
+ "@eslint-community/eslint-comments/require-description":
39
+ "error",
40
+ "func-style": ["error", "expression"],
41
+ "max-depth": ["error", 3],
42
+ "max-lines": [
43
+ "error",
44
+ { max: 300, skipBlankLines: true, skipComments: true },
45
+ ],
46
+ "no-nested-ternary": "error",
47
+ "no-var": "error",
48
+ "prefer-arrow-callback": "error",
49
+ "prefer-const": "error",
50
+ "no-magic-numbers": [
51
+ "error",
52
+ {
53
+ ignore: [-1, 0, 1],
54
+ ignoreArrayIndexes: true,
55
+ ignoreDefaultValues: true,
56
+ enforceConst: true,
57
+ },
58
+ ],
59
+ "no-restricted-syntax": [
60
+ "error",
61
+ {
62
+ selector: "ClassDeclaration",
63
+ message: "Use functions, not classes.",
64
+ },
65
+ {
66
+ selector: "ClassExpression",
67
+ message: "Use functions, not classes.",
68
+ },
69
+ {
70
+ selector: "VariableDeclarator > FunctionExpression",
71
+ message: "Use an arrow function.",
72
+ },
73
+ {
74
+ selector: "VariableDeclaration[kind='let']",
75
+ message:
76
+ "Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
77
+ },
78
+ {
79
+ selector: "FunctionDeclaration[params.length>1]",
80
+ message:
81
+ "Use a single object parameter when a function needs more than one value.",
82
+ },
83
+ {
84
+ selector:
85
+ "VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
86
+ message:
87
+ "Use a single object parameter when a function needs more than one value.",
88
+ },
89
+ ],
90
+ "import-x/no-cycle": "error",
91
+ "import-x/no-default-export": "error",
92
+ "no-use-before-define": "error",
93
+ "unicorn/default-export-style": "off",
94
+ "unicorn/filename-case": [
95
+ "error",
96
+ { cases: { camelCase: true, pascalCase: true } },
97
+ ],
98
+ "unicorn/name-replacements": [
99
+ "error",
100
+ {
101
+ // Dictionary words: see "Dictionary" in the Human-Readable Names standard.
102
+ replacements: {
103
+ docs: false,
104
+ lib: false,
105
+ props: false,
106
+ ref: false,
107
+ repo: false,
108
+ utils: false,
109
+ },
110
+ // Third-party names, allowed only exactly as they are.
111
+ allowList: { params: true, searchParams: true },
112
+ },
113
+ ],
114
+ "react/function-component-definition": [
115
+ "error",
116
+ {
117
+ namedComponents: "arrow-function",
118
+ unnamedComponents: "arrow-function",
119
+ },
120
+ ],
121
+ "react/jsx-no-bind": "error",
122
+ "react/no-multi-comp": "error",
123
+ },
124
+ },
125
+ {
126
+ files: ["**/*.{ts,tsx}"],
127
+ rules: {
128
+ "no-undef": "off",
129
+ "no-magic-numbers": "off",
130
+ "no-use-before-define": "off",
131
+ "@typescript-eslint/consistent-type-assertions": [
132
+ "error",
133
+ { assertionStyle: "never" },
134
+ ],
135
+ "@typescript-eslint/consistent-type-imports": "error",
136
+ "@typescript-eslint/naming-convention": [
137
+ "error",
138
+ {
139
+ selector: ["typeAlias", "interface"],
140
+ format: ["PascalCase"],
141
+ custom: { regex: "(Props|Type)$", match: true },
142
+ },
143
+ ],
144
+ "@typescript-eslint/no-explicit-any": "error",
145
+ "@typescript-eslint/no-magic-numbers": [
146
+ "error",
147
+ {
148
+ ignore: [-1, 0, 1],
149
+ ignoreArrayIndexes: true,
150
+ ignoreDefaultValues: true,
151
+ enforceConst: true,
152
+ ignoreEnums: true,
153
+ ignoreNumericLiteralTypes: true,
154
+ },
155
+ ],
156
+ "@typescript-eslint/no-non-null-assertion": "error",
157
+ "@typescript-eslint/no-use-before-define": "error",
158
+ },
159
+ },
160
+ {
161
+ files: ["**/*.test.{ts,tsx}"],
162
+ rules: {
163
+ "max-lines": "off",
164
+ "no-magic-numbers": "off",
165
+ "@typescript-eslint/no-magic-numbers": "off",
166
+ },
167
+ },
168
+ {
169
+ files: [
170
+ "**/*.config.{js,mjs,ts}",
171
+ "**/*.stories.tsx",
172
+ "app/**/{page,layout,template,default,loading,error,global-error,not-found}.tsx",
173
+ ],
174
+ rules: { "import-x/no-default-export": "off" },
175
+ },
176
+ {
177
+ files: ["**/*.config.{js,mjs,ts}"],
178
+ rules: { "unicorn/no-top-level-side-effects": "off" },
179
+ },
180
+ prettier,
137
181
  ];
@@ -10,129 +10,164 @@ import globals from "globals";
10
10
  import { configs as typescript } from "typescript-eslint";
11
11
 
12
12
  export default [
13
- { ignores: ["dist/", "build/", "coverage/", "**/vendor/**"] },
14
- js.configs.recommended,
15
- comments.recommended,
16
- importX.recommended,
17
- importX.typescript,
18
- unicorn.configs.recommended,
19
- ...typescript.recommended,
20
- react.configs.flat.recommended,
21
- react.configs.flat["jsx-runtime"],
22
- reactHooks.configs.flat.recommended,
23
- {
24
- languageOptions: { globals: { ...globals.browser, ...globals.node } },
25
- settings: {
26
- react: { version: "19.0" },
27
- "import-x/resolver-next": [createTypeScriptImportResolver()],
28
- },
29
- rules: {
30
- "@eslint-community/eslint-comments/require-description": "error",
31
- "func-style": ["error", "expression"],
32
- "max-depth": ["error", 3],
33
- "max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
34
- "no-nested-ternary": "error",
35
- "no-var": "error",
36
- "prefer-arrow-callback": "error",
37
- "prefer-const": "error",
38
- "no-magic-numbers": [
39
- "error",
40
- {
41
- ignore: [-1, 0, 1],
42
- ignoreArrayIndexes: true,
43
- ignoreDefaultValues: true,
44
- enforceConst: true,
45
- },
46
- ],
47
- "no-restricted-syntax": [
48
- "error",
49
- { selector: "ClassDeclaration", message: "Use functions, not classes." },
50
- { selector: "ClassExpression", message: "Use functions, not classes." },
51
- { selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
52
- {
53
- selector: "VariableDeclaration[kind='let']",
54
- message:
55
- "Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
56
- },
57
- {
58
- selector: "FunctionDeclaration[params.length>1]",
59
- message: "Use a single object parameter when a function needs more than one value.",
60
- },
61
- {
62
- selector:
63
- "VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
64
- message: "Use a single object parameter when a function needs more than one value.",
65
- },
66
- ],
67
- "import-x/no-cycle": "error",
68
- "import-x/no-default-export": "error",
69
- "no-use-before-define": "error",
70
- "unicorn/default-export-style": "off",
71
- "unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
72
- "unicorn/name-replacements": [
73
- "error",
74
- {
75
- // Dictionary words: see "Dictionary" in the Human-Readable Names standard.
76
- replacements: { docs: false, props: false, utils: false },
77
- // Third-party names, allowed only exactly as they are.
78
- allowList: { ref: true, params: true, searchParams: true },
79
- },
80
- ],
81
- "react/function-component-definition": [
82
- "error",
83
- { namedComponents: "arrow-function", unnamedComponents: "arrow-function" },
84
- ],
85
- "react/jsx-no-bind": "error",
86
- "react/no-multi-comp": "error",
87
- },
88
- },
89
- {
90
- files: ["**/*.{ts,tsx}"],
91
- rules: {
92
- "no-undef": "off",
93
- "no-magic-numbers": "off",
94
- "no-use-before-define": "off",
95
- "@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "never" }],
96
- "@typescript-eslint/consistent-type-imports": "error",
97
- "@typescript-eslint/naming-convention": [
98
- "error",
99
- {
100
- selector: ["typeAlias", "interface"],
101
- format: ["PascalCase"],
102
- custom: { regex: "(Props|Type)$", match: true },
103
- },
104
- ],
105
- "@typescript-eslint/no-explicit-any": "error",
106
- "@typescript-eslint/no-magic-numbers": [
107
- "error",
108
- {
109
- ignore: [-1, 0, 1],
110
- ignoreArrayIndexes: true,
111
- ignoreDefaultValues: true,
112
- enforceConst: true,
113
- ignoreEnums: true,
114
- ignoreNumericLiteralTypes: true,
115
- },
116
- ],
117
- "@typescript-eslint/no-non-null-assertion": "error",
118
- "@typescript-eslint/no-use-before-define": "error",
119
- },
120
- },
121
- {
122
- files: ["**/*.test.{ts,tsx}"],
123
- rules: {
124
- "max-lines": "off",
125
- "no-magic-numbers": "off",
126
- "@typescript-eslint/no-magic-numbers": "off",
127
- },
128
- },
129
- {
130
- files: ["**/*.config.{js,mjs,ts}", "**/*.stories.tsx"],
131
- rules: { "import-x/no-default-export": "off" },
132
- },
133
- {
134
- files: ["**/*.config.{js,mjs,ts}"],
135
- rules: { "unicorn/no-top-level-side-effects": "off" },
136
- },
137
- prettier,
13
+ { ignores: ["dist/", "build/", "coverage/", "**/vendor/**"] },
14
+ js.configs.recommended,
15
+ comments.recommended,
16
+ importX.recommended,
17
+ importX.typescript,
18
+ unicorn.configs.recommended,
19
+ ...typescript.recommended,
20
+ react.configs.flat.recommended,
21
+ react.configs.flat["jsx-runtime"],
22
+ reactHooks.configs.flat.recommended,
23
+ {
24
+ languageOptions: {
25
+ globals: { ...globals.browser, ...globals.node },
26
+ },
27
+ settings: {
28
+ // Keep this. eslint-plugin-react crashes on ESLint 10 if it has to detect the version itself.
29
+ // Update the number when the project upgrades React.
30
+ react: { version: "19.0" },
31
+ "import-x/resolver-next": [createTypeScriptImportResolver()],
32
+ },
33
+ rules: {
34
+ "@eslint-community/eslint-comments/require-description":
35
+ "error",
36
+ "func-style": ["error", "expression"],
37
+ "max-depth": ["error", 3],
38
+ "max-lines": [
39
+ "error",
40
+ { max: 300, skipBlankLines: true, skipComments: true },
41
+ ],
42
+ "no-nested-ternary": "error",
43
+ "no-var": "error",
44
+ "prefer-arrow-callback": "error",
45
+ "prefer-const": "error",
46
+ "no-magic-numbers": [
47
+ "error",
48
+ {
49
+ ignore: [-1, 0, 1],
50
+ ignoreArrayIndexes: true,
51
+ ignoreDefaultValues: true,
52
+ enforceConst: true,
53
+ },
54
+ ],
55
+ "no-restricted-syntax": [
56
+ "error",
57
+ {
58
+ selector: "ClassDeclaration",
59
+ message: "Use functions, not classes.",
60
+ },
61
+ {
62
+ selector: "ClassExpression",
63
+ message: "Use functions, not classes.",
64
+ },
65
+ {
66
+ selector: "VariableDeclarator > FunctionExpression",
67
+ message: "Use an arrow function.",
68
+ },
69
+ {
70
+ selector: "VariableDeclaration[kind='let']",
71
+ message:
72
+ "Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
73
+ },
74
+ {
75
+ selector: "FunctionDeclaration[params.length>1]",
76
+ message:
77
+ "Use a single object parameter when a function needs more than one value.",
78
+ },
79
+ {
80
+ selector:
81
+ "VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
82
+ message:
83
+ "Use a single object parameter when a function needs more than one value.",
84
+ },
85
+ ],
86
+ "import-x/no-cycle": "error",
87
+ "import-x/no-default-export": "error",
88
+ "no-use-before-define": "error",
89
+ "unicorn/default-export-style": "off",
90
+ "unicorn/filename-case": [
91
+ "error",
92
+ { cases: { camelCase: true, pascalCase: true } },
93
+ ],
94
+ "unicorn/name-replacements": [
95
+ "error",
96
+ {
97
+ // Dictionary words: see "Dictionary" in the Human-Readable Names standard.
98
+ replacements: {
99
+ docs: false,
100
+ lib: false,
101
+ props: false,
102
+ ref: false,
103
+ repo: false,
104
+ utils: false,
105
+ },
106
+ // Third-party names, allowed only exactly as they are.
107
+ allowList: { params: true, searchParams: true },
108
+ },
109
+ ],
110
+ "react/function-component-definition": [
111
+ "error",
112
+ {
113
+ namedComponents: "arrow-function",
114
+ unnamedComponents: "arrow-function",
115
+ },
116
+ ],
117
+ "react/jsx-no-bind": "error",
118
+ "react/no-multi-comp": "error",
119
+ },
120
+ },
121
+ {
122
+ files: ["**/*.{ts,tsx}"],
123
+ rules: {
124
+ "no-undef": "off",
125
+ "no-magic-numbers": "off",
126
+ "no-use-before-define": "off",
127
+ "@typescript-eslint/consistent-type-assertions": [
128
+ "error",
129
+ { assertionStyle: "never" },
130
+ ],
131
+ "@typescript-eslint/consistent-type-imports": "error",
132
+ "@typescript-eslint/naming-convention": [
133
+ "error",
134
+ {
135
+ selector: ["typeAlias", "interface"],
136
+ format: ["PascalCase"],
137
+ custom: { regex: "(Props|Type)$", match: true },
138
+ },
139
+ ],
140
+ "@typescript-eslint/no-explicit-any": "error",
141
+ "@typescript-eslint/no-magic-numbers": [
142
+ "error",
143
+ {
144
+ ignore: [-1, 0, 1],
145
+ ignoreArrayIndexes: true,
146
+ ignoreDefaultValues: true,
147
+ enforceConst: true,
148
+ ignoreEnums: true,
149
+ ignoreNumericLiteralTypes: true,
150
+ },
151
+ ],
152
+ "@typescript-eslint/no-non-null-assertion": "error",
153
+ "@typescript-eslint/no-use-before-define": "error",
154
+ },
155
+ },
156
+ {
157
+ files: ["**/*.test.{ts,tsx}"],
158
+ rules: {
159
+ "max-lines": "off",
160
+ "no-magic-numbers": "off",
161
+ "@typescript-eslint/no-magic-numbers": "off",
162
+ },
163
+ },
164
+ {
165
+ files: ["**/*.config.{js,mjs,ts}", "**/*.stories.tsx"],
166
+ rules: { "import-x/no-default-export": "off" },
167
+ },
168
+ {
169
+ files: ["**/*.config.{js,mjs,ts}"],
170
+ rules: { "unicorn/no-top-level-side-effects": "off" },
171
+ },
172
+ prettier,
138
173
  ];