@soleil-se/eslint-config 5.3.2 → 6.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/CHANGELOG.md +7 -0
- package/LICENSE.md +1 -1
- package/README.md +78 -90
- package/bin/index.js +2 -2
- package/eslint.config.js +5 -0
- package/index.js +48 -108
- package/node-config.js +9 -0
- package/package.json +19 -12
- package/{svelte.prettier.js → prettier-config.js} +2 -2
- package/rules/js/bestPractices.js +422 -0
- package/rules/js/errors.js +188 -0
- package/rules/js/es6.js +170 -0
- package/rules/js/imports.js +235 -0
- package/rules/js/index.js +17 -0
- package/rules/js/restrictedImports.js +70 -0
- package/rules/js/strict.js +3 -0
- package/rules/js/style.js +530 -0
- package/rules/js/variables.js +116 -0
- package/rules/svelte/bestPractices.js +8 -0
- package/rules/svelte/errors.js +9 -0
- package/rules/svelte/index.js +13 -0
- package/rules/svelte/overrides.js +26 -0
- package/rules/svelte/security.js +3 -0
- package/rules/svelte/style.js +6 -0
- package/script-module-config.js +38 -0
- package/setup.js +59 -50
- package/.eslintrc.js +0 -13
- package/legacy.js +0 -38
- package/utils/hasDependency.js +0 -15
- package/utils/restrictedImports.js +0 -68
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ Alla förändringar i detta repository antecknas här.
|
|
|
7
7
|
Formatet baseras på [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
8
8
|
och projektet använder [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
|
+
## [6.0.0] - 2025-02-04
|
|
11
|
+
|
|
12
|
+
* Uppdatera till ESLint 9 och format på konfigurationsfiler till flat config.
|
|
13
|
+
* Ändra `trailingComma` till 'all' i Prettier-konfigurationen.
|
|
14
|
+
* Lägg till global för `envision`.
|
|
15
|
+
* Döpt om `legacy` till `script-module` då det är det den används till.
|
|
16
|
+
|
|
10
17
|
## [5.3.2] - 2024-12-13
|
|
11
18
|
|
|
12
19
|
* Stäng av regeln `svelte/no-unused-svelte-ignore` då den strular.
|
package/LICENSE.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(c) Copyright
|
|
1
|
+
(c) Copyright 2025 Soleil AB, all rights reserved.
|
package/README.md
CHANGED
|
@@ -4,105 +4,92 @@ ESLint konfiguration för Sitevision projekt som bygger på Airbnbs JavaScript s
|
|
|
4
4
|
**ES2015+**
|
|
5
5
|
<https://github.com/airbnb/javascript>
|
|
6
6
|
|
|
7
|
-
**Legacy (ES5)**
|
|
8
|
-
<https://github.com/airbnb/javascript/tree/es5-deprecated/es5>
|
|
9
|
-
|
|
10
7
|
Om man stöter på ett fel man inte förstår kan man kolla i styleguiden eller söka på ESLints hemsida.
|
|
11
8
|
<https://eslint.org/docs/rules/>
|
|
12
9
|
|
|
13
10
|
## Installera
|
|
14
11
|
|
|
15
|
-
Installera
|
|
12
|
+
Installera dependencies och sätt upp konfigurationsfiler:
|
|
16
13
|
|
|
17
14
|
```sh
|
|
18
|
-
npx @soleil-se/eslint-config-sitevision --setup
|
|
15
|
+
npx @soleil-se/eslint-config-sitevision@latest --setup
|
|
19
16
|
```
|
|
20
17
|
|
|
21
18
|
För att installera manuellt installera följande dependencies och skapa upp konfigurationsfiler enligt [nedan](#config).
|
|
22
19
|
|
|
23
20
|
```sh
|
|
24
|
-
npm i @soleil-se/eslint-config-sitevision eslint
|
|
21
|
+
npm i @soleil-se/eslint-config-sitevision eslint --save-dev
|
|
25
22
|
```
|
|
26
23
|
|
|
27
24
|
## Uppgradera
|
|
28
25
|
|
|
26
|
+
Enklast är att köra setup skriptet för att uppdatera till senaste versionen.
|
|
27
|
+
```sh
|
|
28
|
+
npx @soleil-se/eslint-config-sitevision@latest --setup
|
|
29
|
+
```
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
:::::details[Manuellt]
|
|
32
|
+
::::steps
|
|
33
|
+
:::step[Avinstallera plugins]
|
|
34
|
+
Avinstallera alla gamla plugins med:
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
- Installera `eslint-config-prettier` om det inte redan är installerat.
|
|
36
|
+
```sh
|
|
37
|
+
npm remove eslint-config-airbnb-base eslint-plugin-import eslint-plugin-svelte
|
|
38
|
+
```
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
:::
|
|
41
|
+
:::step[Uppdatera dependencies]
|
|
42
|
+
Uppdatera `@soleil-se/eslint-config-sitevision` till version 6 och `eslint` till version 9:
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
npm i @soleil-se/eslint-config-sitevision@6 eslint@9 --save-dev
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
:::
|
|
49
|
+
:::step[Ta bort gammal konfiguration]
|
|
40
50
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- `@soleil-se/eslint-config-sitevision/server` > `@soleil-se/eslint-config-sitevision/legacy`
|
|
56
|
-
:::
|
|
57
|
-
:::details[Version 2.x.x > 3.x.x]
|
|
58
|
-
|
|
59
|
-
- Uppgradera `@soleil-se/eslint-config-sitevision` till version 3.
|
|
60
|
-
- Uppgradera `eslint` till version 8.
|
|
61
|
-
- Uppgradera `eslint-config-airbnb-base` till version 15.
|
|
62
|
-
- Ändra importer till Sitevisions API:er till `@sitevision/api/(server|common|client)/NamnPåAPI`.
|
|
63
|
-
:::
|
|
64
|
-
:::details[Version 1.x.x > 2.x.x]
|
|
65
|
-
|
|
66
|
-
- Uppgradera `eslint` till version 7.
|
|
67
|
-
- Installera alla dependencies enligt installationssteget.
|
|
68
|
-
- Om `@soleil-se/eslint-config-sitevision/vue` används byt till `@soleil-se/eslint-config-sitevision/client`.
|
|
69
|
-
:::
|
|
51
|
+
Ta bort gamla konfigurationsfiler.
|
|
52
|
+
|
|
53
|
+
- `.eslintrc.cjs`
|
|
54
|
+
- `.eslintignore`
|
|
55
|
+
- `.prettierrc.cjs`
|
|
56
|
+
|
|
57
|
+
:::
|
|
58
|
+
:::step[Skapa upp ny konfiguration]
|
|
59
|
+
Skapa upp nya konfigurationsfiler enligt [nedan](#config).
|
|
60
|
+
:::
|
|
61
|
+
|
|
62
|
+
::::
|
|
63
|
+
|
|
64
|
+
:::::
|
|
70
65
|
|
|
71
66
|
## Config
|
|
72
67
|
|
|
73
|
-
ESLint läser främst från
|
|
68
|
+
ESLint läser främst från `eslint.config.js` filer i projektet.
|
|
74
69
|
<https://eslint.org/docs/user-guide/configuring#using-configuration-files-1>
|
|
75
70
|
|
|
76
71
|
### Importera config
|
|
77
72
|
|
|
78
73
|
```js
|
|
79
|
-
// .
|
|
80
|
-
|
|
81
|
-
extends: '@soleil-se/eslint-config-sitevision',
|
|
82
|
-
};
|
|
83
|
-
```
|
|
74
|
+
// eslint.config.js
|
|
75
|
+
import sitevision from '@soleil-se/eslint-config-sitevision';
|
|
84
76
|
|
|
85
|
-
|
|
86
|
-
|
|
77
|
+
export default [
|
|
78
|
+
...sitevision,
|
|
79
|
+
];
|
|
87
80
|
|
|
88
|
-
```js
|
|
89
|
-
// .eslintrc.cjs
|
|
90
|
-
module.exports = {
|
|
91
|
-
extends: '@soleil-se/eslint-config-sitevision/legacy',
|
|
92
|
-
root: true,
|
|
93
|
-
};
|
|
94
81
|
```
|
|
95
82
|
|
|
96
|
-
|
|
83
|
+
Config för skriptmoduler och Rhino.
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
// eslint.config.js
|
|
87
|
+
import script from '@soleil-se/eslint-config-sitevision/script-module';
|
|
97
88
|
|
|
98
|
-
|
|
89
|
+
export default [
|
|
90
|
+
...script,
|
|
91
|
+
];
|
|
99
92
|
|
|
100
|
-
```text
|
|
101
|
-
// .eslintignore
|
|
102
|
-
dist
|
|
103
|
-
node_nodules
|
|
104
|
-
**/node_nodules
|
|
105
|
-
svelte.config
|
|
106
93
|
```
|
|
107
94
|
|
|
108
95
|
## Editors
|
|
@@ -190,28 +177,28 @@ Slår man på `{ "mode": "auto" }` försöker den automatiskt hitta rätt konfig
|
|
|
190
177
|
|
|
191
178
|
```json
|
|
192
179
|
// settings.json
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
180
|
+
|
|
181
|
+
"files.eol": "\n",
|
|
182
|
+
"files.insertFinalNewline": true,
|
|
183
|
+
"editor.codeActionsOnSave": {
|
|
184
|
+
"source.fixAll.eslint": "explicit"
|
|
185
|
+
},
|
|
186
|
+
"editor.rulers": [
|
|
187
|
+
100
|
|
188
|
+
],
|
|
189
|
+
"editor.formatOnSave": false,
|
|
190
|
+
"editor.tabSize": 2,
|
|
191
|
+
"editor.insertSpaces": true,
|
|
192
|
+
"eslint.validate": [
|
|
193
|
+
"javascript",
|
|
194
|
+
"javascriptreact",
|
|
195
|
+
"svelte",
|
|
196
|
+
],
|
|
197
|
+
"[svelte]": {
|
|
198
|
+
"editor.formatOnSave": true
|
|
199
|
+
},
|
|
200
|
+
"eslint.workingDirectories": [{ "mode": "auto" }],
|
|
201
|
+
|
|
215
202
|
```
|
|
216
203
|
|
|
217
204
|
## CLI
|
|
@@ -228,11 +215,12 @@ Installera [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.s
|
|
|
228
215
|
Formatering av kod i Svelte använder Prettier så man behöver lägga till insällningar för det så HTML kan formateras,
|
|
229
216
|
dessvärre påverkar detta även JavaScript så några regler som man är van vid har fått stängas av så
|
|
230
217
|
det inte krockar med Prettier.
|
|
231
|
-
Skapa en fil som heter
|
|
218
|
+
Skapa en fil som heter `prettier.config.js` i roten av appen eller projektet.
|
|
232
219
|
|
|
233
220
|
```js
|
|
234
|
-
// .
|
|
235
|
-
|
|
221
|
+
// prettier.config.js
|
|
222
|
+
export { default } from '@soleil-se/eslint-config-sitevision/prettier';
|
|
223
|
+
|
|
236
224
|
```
|
|
237
225
|
|
|
238
226
|
För att formatera automatiskt behöver man lägga till följande i `settings.json` i Visual Studio Code.
|
package/bin/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
if (process.argv.includes('--setup')) {
|
|
4
|
-
|
|
4
|
+
import('../setup.js');
|
|
5
5
|
} else {
|
|
6
|
-
console.log('Available commands:\n--setup: Setup ESLint + Prettier configuration and dependencies needed for @soleil/eslint-config.');
|
|
6
|
+
console.log('Available commands:\n--setup: Setup ESLint + Prettier configuration and dependencies needed for @soleil/eslint-config-sitevision.');
|
|
7
7
|
}
|
package/eslint.config.js
ADDED
package/index.js
CHANGED
|
@@ -1,121 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import globals from 'globals';
|
|
2
|
+
import importPlugin from 'eslint-plugin-import';
|
|
3
|
+
import eslintPluginSvelte from 'eslint-plugin-svelte';
|
|
4
|
+
import eslintConfigPrettier from 'eslint-config-prettier';
|
|
3
5
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
rules: {
|
|
19
|
-
'import/extensions': ['error', 'never', {
|
|
20
|
-
ignorePackages: true,
|
|
21
|
-
pattern: {
|
|
22
|
-
svelte: 'always',
|
|
23
|
-
json: 'always',
|
|
6
|
+
import jsRules from './rules/js/index.js';
|
|
7
|
+
import svelteRules from './rules/svelte/index.js';
|
|
8
|
+
|
|
9
|
+
export default [
|
|
10
|
+
{
|
|
11
|
+
name: 'soleil/base',
|
|
12
|
+
languageOptions: {
|
|
13
|
+
ecmaVersion: 'latest',
|
|
14
|
+
sourceType: 'module',
|
|
15
|
+
globals: {
|
|
16
|
+
process: 'readonly',
|
|
17
|
+
Packages: 'readonly',
|
|
18
|
+
envision: 'readonly',
|
|
19
|
+
...globals.browser,
|
|
24
20
|
},
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
ImportDeclaration: { minProperties: 8, multiline: true, consistent: true },
|
|
32
|
-
ExportDeclaration: { minProperties: 8, multiline: true, consistent: true },
|
|
33
|
-
}],
|
|
34
|
-
'no-console': [1, { allow: ['error'] }],
|
|
35
|
-
'no-restricted-imports': restrictedImports,
|
|
36
|
-
'max-len': ['error', 100, 2, {
|
|
37
|
-
ignoreUrls: true,
|
|
38
|
-
ignoreComments: true,
|
|
39
|
-
ignoreRegExpLiterals: true,
|
|
40
|
-
ignoreStrings: true,
|
|
41
|
-
ignoreTemplateLiterals: true,
|
|
42
|
-
}],
|
|
43
|
-
},
|
|
44
|
-
settings: {
|
|
45
|
-
svelte: {
|
|
21
|
+
},
|
|
22
|
+
ignores: ['dist', 'node_modules'],
|
|
23
|
+
plugins: { import: importPlugin },
|
|
24
|
+
rules: jsRules,
|
|
25
|
+
settings: {
|
|
26
|
+
svelte: {
|
|
46
27
|
// Ignore max-len in template and style, still works for script tags.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
28
|
+
ignoreWarnings: [
|
|
29
|
+
'max-len',
|
|
30
|
+
],
|
|
31
|
+
},
|
|
50
32
|
},
|
|
51
33
|
},
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
34
|
+
...eslintPluginSvelte.configs['flat/recommended'],
|
|
35
|
+
...eslintPluginSvelte.configs['flat/prettier'],
|
|
36
|
+
{
|
|
37
|
+
name: 'soleil/svelte',
|
|
38
|
+
files: ['**/*.svelte'],
|
|
56
39
|
rules: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
'import/no-named-as-default': 0,
|
|
60
|
-
'import/no-named-as-default-member': 0,
|
|
61
|
-
'import/named': 0,
|
|
62
|
-
'import/namespace': 0,
|
|
63
|
-
'import/default': 0,
|
|
64
|
-
'import/no-cycle': 0,
|
|
65
|
-
'import/no-unused-modules': 0,
|
|
66
|
-
'import/no-deprecated': 0,
|
|
67
|
-
'no-multiple-empty-lines': 0,
|
|
68
|
-
'no-label-var': 0,
|
|
69
|
-
'no-undef-init': 0,
|
|
70
|
-
'no-return-assign': 0,
|
|
71
|
-
'operator-linebreak': 'off',
|
|
72
|
-
'object-curly-newline': 'off',
|
|
73
|
-
// Security Vulnerability
|
|
74
|
-
'svelte/no-at-html-tags': 'warn',
|
|
75
|
-
// Possible Errors
|
|
76
|
-
'svelte/infinite-reactive-loop': 'error',
|
|
77
|
-
'svelte/no-dupe-else-if-blocks': 'error',
|
|
78
|
-
'svelte/no-dupe-on-directives': 'error',
|
|
79
|
-
'svelte/no-reactive-reassign': 'error',
|
|
80
|
-
'svelte/no-store-async': 'error',
|
|
81
|
-
'svelte/require-store-reactive-access': 'error',
|
|
82
|
-
'svelte/valid-compile': 0,
|
|
83
|
-
// Best Practices
|
|
84
|
-
'svelte/no-at-debug-tags': 'warn',
|
|
85
|
-
'svelte/no-immutable-reactive-statements': 'warn',
|
|
86
|
-
'svelte/no-reactive-functions': 'warn',
|
|
87
|
-
'svelte/no-reactive-literals': 'warn',
|
|
88
|
-
'svelte/no-useless-mustaches': 'warn',
|
|
89
|
-
'svelte/no-unused-svelte-ignore': 0,
|
|
90
|
-
// Stylistic
|
|
91
|
-
'svelte/no-extra-reactive-curlies': 'warn',
|
|
92
|
-
'svelte/prefer-style-directive': 'warn',
|
|
93
|
-
'svelte/sort-attributes': 'warn',
|
|
94
|
-
'svelte/spaced-html-comment': 'warn',
|
|
95
|
-
// Extension Rules
|
|
96
|
-
'svelte/no-trailing-spaces': 'error',
|
|
97
|
-
// Same value as airbnb-base.
|
|
98
|
-
'max-len': ['error', 100, 2, {
|
|
99
|
-
ignoreUrls: true,
|
|
100
|
-
ignoreComments: true,
|
|
101
|
-
ignoreRegExpLiterals: true,
|
|
102
|
-
ignoreStrings: true,
|
|
103
|
-
ignoreTemplateLiterals: true,
|
|
104
|
-
}],
|
|
105
|
-
// Do not enforce const because of reactivity for runes in Svelte 5.
|
|
106
|
-
'prefer-const': 0,
|
|
40
|
+
...svelteRules,
|
|
41
|
+
...eslintConfigPrettier.rules,
|
|
107
42
|
},
|
|
108
43
|
}, {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
44
|
+
name: 'soleil/svelte.js',
|
|
45
|
+
files: ['**/*.svelte.js', '**/*.svelte.ts'],
|
|
46
|
+
languageOptions: {
|
|
47
|
+
ecmaVersion: 'latest',
|
|
48
|
+
sourceType: 'module',
|
|
49
|
+
globals: {
|
|
50
|
+
$state: 'readonly',
|
|
51
|
+
$derived: 'readonly',
|
|
52
|
+
$effect: 'readonly',
|
|
53
|
+
$inspect: 'readonly',
|
|
54
|
+
},
|
|
112
55
|
},
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
files: ['*.svelte.js, *.svelte.ts'],
|
|
116
56
|
rules: {
|
|
117
57
|
// Do not enforce const because of reactivity for runes in Svelte 5.
|
|
118
58
|
'prefer-const': 0,
|
|
119
59
|
},
|
|
120
|
-
}
|
|
121
|
-
|
|
60
|
+
},
|
|
61
|
+
];
|
package/node-config.js
ADDED
package/package.json
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soleil-se/eslint-config",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "ESLint konfiguration för Sitevision utveckling",
|
|
5
5
|
"author": "Soleil AB",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"private": false,
|
|
8
8
|
"homepage": "https://docs.soleil.se/packages/@soleil-se/eslint-config/",
|
|
9
|
+
"type": "module",
|
|
9
10
|
"bin": "./bin/index.js",
|
|
11
|
+
"main": "./index.js",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./index.js",
|
|
14
|
+
"./prettier": "./prettier-config.js",
|
|
15
|
+
"./script-module": "./script-module-config.js",
|
|
16
|
+
"./node": "./node-config.js"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"eslint-config-prettier": "^10.0.1",
|
|
20
|
+
"eslint-plugin-import": "^2.31.0",
|
|
21
|
+
"eslint-plugin-svelte": "^2.46.1",
|
|
22
|
+
"globals": "^15.14.0"
|
|
23
|
+
},
|
|
10
24
|
"devDependencies": {
|
|
11
|
-
"eslint": "^
|
|
12
|
-
"
|
|
13
|
-
"eslint-plugin-import": "^2.29.1",
|
|
14
|
-
"eslint-plugin-svelte": "^2.39.0",
|
|
15
|
-
"eslint-config-prettier": "^9.1.0",
|
|
16
|
-
"svelte": "^4.2.17"
|
|
25
|
+
"eslint": "^9.18.0",
|
|
26
|
+
"svelte": "^5.17.4"
|
|
17
27
|
},
|
|
18
28
|
"peerDependencies": {
|
|
19
|
-
"eslint": "
|
|
20
|
-
|
|
21
|
-
"eslint-plugin-import": "^2.25.0"
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {}
|
|
29
|
+
"eslint": ">= 9"
|
|
30
|
+
}
|
|
24
31
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
export default {
|
|
2
2
|
printWidth: 100,
|
|
3
3
|
tabWidth: 2,
|
|
4
4
|
singleQuote: true,
|
|
5
5
|
arrowParens: 'always',
|
|
6
6
|
svelteStrictMode: false,
|
|
7
|
-
trailingComma: '
|
|
7
|
+
trailingComma: 'all',
|
|
8
8
|
svelteSortOrder: 'options-scripts-markup-styles',
|
|
9
9
|
bracketSameLine: false,
|
|
10
10
|
};
|