@elastic/eslint-plugin-eui 0.2.0 → 1.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 CHANGED
@@ -148,13 +148,27 @@ will raise an ESLint report and suggest replacing the `style` attribute with `cs
148
148
 
149
149
  ## Testing
150
150
 
151
+ ### Running unit tests
152
+
153
+ Run unit tests using the following command:
154
+
155
+ ```bash
156
+ yarn test
157
+ ```
158
+
159
+ Unit tests are written using `RuleTester` from `@typescript-eslint/rule-tester`.
160
+
151
161
  ### Against an existing package
152
162
 
153
163
  To test the local changes to the plugin, you must:
154
164
 
155
- 1. Run `yarn pack` in the directory.
156
- 2. In your project's `package.json`, point `@elastic/eslint-plugin-eui` to `file:/path/to/package.tgz`.
157
- 3. Install dependencies: `yarn kbn bootstrap --no-validate`.
165
+ 1. Install `yalc` globally if you haven't already: `npm install -g yalc`.
166
+ 2. Open a terminal and navigate to this folder: `cd packages/eslint-plugin`
167
+ 3. Build the package: `yarn build`
168
+ 4. Run `yalc publish` in the plugin's directory to publish it locally.
169
+ 5. In your project's directory, run `yalc add @elastic/eslint-plugin-eui` to link the locally published package.
170
+ 6. Install dependencies: `yarn` (if you're a Kibana contributor, run `yarn kbn bootstrap --no-validate`).
171
+ 7. After making further changes to the plugin, repeat the steps from 3.
158
172
 
159
173
  ## Publishing
160
174
 
package/lib/cjs/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  var _href_or_on_click = require("./rules/href_or_on_click");
4
4
  var _no_restricted_eui_imports = require("./rules/no_restricted_eui_imports");
5
5
  var _no_css_color = require("./rules/no_css_color");
6
- var _prefer_css_attribute_for_eui_components = require("./rules/prefer_css_attribute_for_eui_components");
6
+ var _prefer_css_prop_for_static_styles = require("./rules/prefer_css_prop_for_static_styles");
7
7
  /*
8
8
  * Licensed to Elasticsearch B.V. under one or more contributor
9
9
  * license agreements. See the NOTICE file distributed with
@@ -28,7 +28,7 @@ const config = {
28
28
  'href-or-on-click': _href_or_on_click.HrefOnClick,
29
29
  'no-restricted-eui-imports': _no_restricted_eui_imports.NoRestrictedEuiImports,
30
30
  'no-css-color': _no_css_color.NoCssColor,
31
- 'prefer-css-attributes-for-eui-components': _prefer_css_attribute_for_eui_components.PreferCSSAttributeForEuiComponents
31
+ 'prefer-css-prop-for-static-styles': _prefer_css_prop_for_static_styles.PreferCSSPropForStaticStyles
32
32
  },
33
33
  configs: {
34
34
  recommended: {
@@ -37,7 +37,7 @@ const config = {
37
37
  '@elastic/eui/href-or-on-click': 'warn',
38
38
  '@elastic/eui/no-restricted-eui-imports': 'warn',
39
39
  '@elastic/eui/no-css-color': 'warn',
40
- '@elastic/eui/prefer-css-attributes-for-eui-components': 'warn'
40
+ '@elastic/eui/prefer-css-prop-for-static-styles': 'warn'
41
41
  }
42
42
  }
43
43
  }
@@ -0,0 +1,3 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const PreferCSSPropForStaticStyles: ESLintUtils.RuleModule<"preferCSSPropForStaticStyles", [], unknown, ESLintUtils.RuleListener>;
3
+ //# sourceMappingURL=prefer_css_prop_for_static_styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer_css_prop_for_static_styles.d.ts","sourceRoot":"","sources":["../../../src/rules/prefer_css_prop_for_static_styles.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAY,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEjE,eAAO,MAAM,4BAA4B,+FA8DxC,CAAC"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PreferCSSAttributeForEuiComponents = void 0;
6
+ exports.PreferCSSPropForStaticStyles = void 0;
7
7
  var _utils = require("@typescript-eslint/utils");
8
8
  /*
9
9
  * Licensed to Elasticsearch B.V. under one or more contributor
@@ -24,7 +24,7 @@ var _utils = require("@typescript-eslint/utils");
24
24
  * under the License.
25
25
  */
26
26
 
27
- const PreferCSSAttributeForEuiComponents = exports.PreferCSSAttributeForEuiComponents = _utils.ESLintUtils.RuleCreator.withoutDocs({
27
+ const PreferCSSPropForStaticStyles = exports.PreferCSSPropForStaticStyles = _utils.ESLintUtils.RuleCreator.withoutDocs({
28
28
  create(context) {
29
29
  const isNamedEuiComponentRegex = /^Eui[A-Z]*/;
30
30
  return {
@@ -34,13 +34,17 @@ const PreferCSSAttributeForEuiComponents = exports.PreferCSSAttributeForEuiCompo
34
34
  if (styleAttrNode = node.attributes.filter(attr => attr.type === 'JSXAttribute').find(attr => attr.name.name === 'style')) {
35
35
  context.report({
36
36
  node: styleAttrNode?.parent,
37
- messageId: 'preferCSSAttributeForEuiComponents',
37
+ messageId: 'preferCSSPropForStaticStyles',
38
38
  fix(fixer) {
39
39
  const cssAttr = node.attributes.find(attr => attr.type === 'JSXAttribute' && attr.name.name === 'css');
40
40
  if (cssAttr) {
41
41
  return null;
42
42
  }
43
- return fixer.replaceTextRange(styleAttrNode?.name?.range, 'css');
43
+ const range = styleAttrNode?.name?.range;
44
+ if (!range) {
45
+ return null;
46
+ }
47
+ return fixer.replaceTextRange(range, 'css');
44
48
  }
45
49
  });
46
50
  }
@@ -51,10 +55,10 @@ const PreferCSSAttributeForEuiComponents = exports.PreferCSSAttributeForEuiCompo
51
55
  meta: {
52
56
  type: 'suggestion',
53
57
  docs: {
54
- description: 'Prefer the JSX css attribute for EUI components'
58
+ description: 'Prefer the `css` prop for static styles in EUI components'
55
59
  },
56
60
  messages: {
57
- preferCSSAttributeForEuiComponents: 'Prefer the css attribute for EUI components'
61
+ preferCSSPropForStaticStyles: 'Use the `css` prop instead of `style` for static styles in EUI components to ensure better performance and consistency with EUI’s styling approach. Read more: https://emotion.sh/docs/best-practices#use-the-style-prop-for-dynamic-styles'
58
62
  },
59
63
  fixable: 'code',
60
64
  schema: []
@@ -1 +1 @@
1
- {"version":3,"file":"resolve_member_expression_root.d.ts","sourceRoot":"","sources":["../../../src/utils/resolve_member_expression_root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,eAAO,MAAM,2BAA2B,SAChC,QAAQ,CAAC,gBAAgB,KAC9B,QAAQ,CAAC,UAMX,CAAC"}
1
+ {"version":3,"file":"resolve_member_expression_root.d.ts","sourceRoot":"","sources":["../../../src/utils/resolve_member_expression_root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,eAAO,MAAM,2BAA2B,GACtC,MAAM,QAAQ,CAAC,gBAAgB,KAC9B,QAAQ,CAAC,UAMX,CAAC"}
package/lib/esm/index.js CHANGED
@@ -21,13 +21,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
21
21
  const href_or_on_click_1 = require("./rules/href_or_on_click");
22
22
  const no_restricted_eui_imports_1 = require("./rules/no_restricted_eui_imports");
23
23
  const no_css_color_1 = require("./rules/no_css_color");
24
- const prefer_css_attribute_for_eui_components_1 = require("./rules/prefer_css_attribute_for_eui_components");
24
+ const prefer_css_prop_for_static_styles_1 = require("./rules/prefer_css_prop_for_static_styles");
25
25
  const config = {
26
26
  rules: {
27
27
  'href-or-on-click': href_or_on_click_1.HrefOnClick,
28
28
  'no-restricted-eui-imports': no_restricted_eui_imports_1.NoRestrictedEuiImports,
29
29
  'no-css-color': no_css_color_1.NoCssColor,
30
- 'prefer-css-attributes-for-eui-components': prefer_css_attribute_for_eui_components_1.PreferCSSAttributeForEuiComponents,
30
+ 'prefer-css-prop-for-static-styles': prefer_css_prop_for_static_styles_1.PreferCSSPropForStaticStyles,
31
31
  },
32
32
  configs: {
33
33
  recommended: {
@@ -36,7 +36,7 @@ const config = {
36
36
  '@elastic/eui/href-or-on-click': 'warn',
37
37
  '@elastic/eui/no-restricted-eui-imports': 'warn',
38
38
  '@elastic/eui/no-css-color': 'warn',
39
- '@elastic/eui/prefer-css-attributes-for-eui-components': 'warn',
39
+ '@elastic/eui/prefer-css-prop-for-static-styles': 'warn',
40
40
  },
41
41
  },
42
42
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAEH,+DAAuD;AACvD,iFAA2E;AAC3E,uDAAkD;AAClD,6GAAqG;AAErG,MAAM,MAAM,GAAG;IACb,KAAK,EAAE;QACL,kBAAkB,EAAE,8BAAW;QAC/B,2BAA2B,EAAE,kDAAsB;QACnD,cAAc,EAAE,yBAAU;QAC1B,0CAA0C,EACxC,4EAAkC;KACrC;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,4BAA4B,CAAC;YACvC,KAAK,EAAE;gBACL,+BAA+B,EAAE,MAAM;gBACvC,wCAAwC,EAAE,MAAM;gBAChD,2BAA2B,EAAE,MAAM;gBACnC,uDAAuD,EAAE,MAAM;aAChE;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAEH,+DAAuD;AACvD,iFAA2E;AAC3E,uDAAkD;AAClD,iGAAyF;AAEzF,MAAM,MAAM,GAAG;IACb,KAAK,EAAE;QACL,kBAAkB,EAAE,8BAAW;QAC/B,2BAA2B,EAAE,kDAAsB;QACnD,cAAc,EAAE,yBAAU;QAC1B,mCAAmC,EAAE,gEAA4B;KAClE;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,4BAA4B,CAAC;YACvC,KAAK,EAAE;gBACL,+BAA+B,EAAE,MAAM;gBACvC,wCAAwC,EAAE,MAAM;gBAChD,2BAA2B,EAAE,MAAM;gBACnC,gDAAgD,EAAE,MAAM;aACzD;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const PreferCSSPropForStaticStyles: ESLintUtils.RuleModule<"preferCSSPropForStaticStyles", [], unknown, ESLintUtils.RuleListener>;
@@ -18,9 +18,9 @@
18
18
  * under the License.
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.PreferCSSAttributeForEuiComponents = void 0;
21
+ exports.PreferCSSPropForStaticStyles = void 0;
22
22
  const utils_1 = require("@typescript-eslint/utils");
23
- exports.PreferCSSAttributeForEuiComponents = utils_1.ESLintUtils.RuleCreator.withoutDocs({
23
+ exports.PreferCSSPropForStaticStyles = utils_1.ESLintUtils.RuleCreator.withoutDocs({
24
24
  create(context) {
25
25
  const isNamedEuiComponentRegex = /^Eui[A-Z]*/;
26
26
  return {
@@ -33,13 +33,17 @@ exports.PreferCSSAttributeForEuiComponents = utils_1.ESLintUtils.RuleCreator.wit
33
33
  .find((attr) => attr.name.name === 'style'))) {
34
34
  context.report({
35
35
  node: styleAttrNode?.parent,
36
- messageId: 'preferCSSAttributeForEuiComponents',
36
+ messageId: 'preferCSSPropForStaticStyles',
37
37
  fix(fixer) {
38
38
  const cssAttr = node.attributes.find((attr) => attr.type === 'JSXAttribute' && attr.name.name === 'css');
39
39
  if (cssAttr) {
40
40
  return null;
41
41
  }
42
- return fixer.replaceTextRange(styleAttrNode?.name?.range, 'css');
42
+ const range = styleAttrNode?.name?.range;
43
+ if (!range) {
44
+ return null;
45
+ }
46
+ return fixer.replaceTextRange(range, 'css');
43
47
  },
44
48
  });
45
49
  }
@@ -50,14 +54,14 @@ exports.PreferCSSAttributeForEuiComponents = utils_1.ESLintUtils.RuleCreator.wit
50
54
  meta: {
51
55
  type: 'suggestion',
52
56
  docs: {
53
- description: 'Prefer the JSX css attribute for EUI components',
57
+ description: 'Prefer the `css` prop for static styles in EUI components',
54
58
  },
55
59
  messages: {
56
- preferCSSAttributeForEuiComponents: 'Prefer the css attribute for EUI components',
60
+ preferCSSPropForStaticStyles: 'Use the `css` prop instead of `style` for static styles in EUI components to ensure better performance and consistency with EUI’s styling approach. Read more: https://emotion.sh/docs/best-practices#use-the-style-prop-for-dynamic-styles',
57
61
  },
58
62
  fixable: 'code',
59
63
  schema: [],
60
64
  },
61
65
  defaultOptions: [],
62
66
  });
63
- //# sourceMappingURL=prefer_css_attribute_for_eui_components.js.map
67
+ //# sourceMappingURL=prefer_css_prop_for_static_styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer_css_prop_for_static_styles.js","sourceRoot":"","sources":["../../../src/rules/prefer_css_prop_for_static_styles.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,oDAAiE;AAEpD,QAAA,4BAA4B,GAAG,mBAAW,CAAC,WAAW,CAAC,WAAW,CAC7E;IACE,MAAM,CAAC,OAAO;QACZ,MAAM,wBAAwB,GAAG,YAAY,CAAC;QAE9C,OAAO;YACL,iBAAiB,CAAC,IAAgC;gBAChD,IACE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;oBAClC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7C,CAAC;oBACD,IAAI,aAAgD,CAAC;oBAErD,IACE,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU;yBAC7B,MAAM,CACL,CAAC,IAAI,EAAiC,EAAE,CACtC,IAAI,CAAC,IAAI,KAAK,cAAc,CAC/B;yBACA,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,EAC9C,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,aAAa,EAAE,MAAM;4BAC3B,SAAS,EAAE,8BAA8B;4BACzC,GAAG,CAAC,KAAK;gCACP,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAC3D,CAAC;gCAEF,IAAI,OAAO,EAAE,CAAC;oCACZ,OAAO,IAAI,CAAC;gCACd,CAAC;gCAED,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC;gCACzC,IAAI,CAAC,KAAK,EAAE,CAAC;oCACX,OAAO,IAAI,CAAC;gCACd,CAAC;gCAED,OAAO,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;4BAC9C,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,2DAA2D;SAC9D;QACD,QAAQ,EAAE;YACR,4BAA4B,EAC1B,6OAA6O;SAChP;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;CACnB,CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elastic/eslint-plugin-eui",
3
- "version": "0.2.0",
3
+ "version": "1.0.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,11 +27,11 @@
27
27
  "@types/dedent": "^0.7.2",
28
28
  "@types/jest": "^29.5.14",
29
29
  "@types/micromatch": "^4.0.9",
30
- "@typescript-eslint/eslint-plugin": "^8.22.0",
31
- "@typescript-eslint/parser": "^8.22.0",
32
- "@typescript-eslint/rule-tester": "^8.22.0",
33
- "@typescript-eslint/typescript-estree": "^8.22.0",
34
- "@typescript-eslint/utils": "^8.22.0",
30
+ "@typescript-eslint/eslint-plugin": "^8.31.1",
31
+ "@typescript-eslint/parser": "^8.31.1",
32
+ "@typescript-eslint/rule-tester": "^8.31.1",
33
+ "@typescript-eslint/typescript-estree": "^8.31.1",
34
+ "@typescript-eslint/utils": "^8.31.1",
35
35
  "cssstyle": "^4.2.1",
36
36
  "dedent": "^1.5.3",
37
37
  "eslint": "^8.57.0",
@@ -40,7 +40,7 @@
40
40
  "rimraf": "^6.0.1",
41
41
  "ts-jest": "^29.2.5",
42
42
  "ts-node": "^10.9.2",
43
- "typescript": "^5.7.3"
43
+ "typescript": "^5.8.3"
44
44
  },
45
45
  "scripts": {
46
46
  "test": "jest src",
@@ -48,8 +48,7 @@
48
48
  "build:clean": "rimraf lib/",
49
49
  "build:compile:esm": "tsc --project ./tsconfig.esm.json",
50
50
  "build:compile": "NODE_ENV=production babel src --out-dir=lib/cjs --extensions .js,.ts,.tsx",
51
- "build:types": "NODE_ENV=production tsc --project tsconfig.types.json",
52
- "build:pack": "yarn build && npm pack"
51
+ "build:types": "NODE_ENV=production tsc --project tsconfig.types.json"
53
52
  },
54
53
  "files": [
55
54
  "lib",
@@ -1,3 +0,0 @@
1
- import { ESLintUtils } from '@typescript-eslint/utils';
2
- export declare const PreferCSSAttributeForEuiComponents: ESLintUtils.RuleModule<"preferCSSAttributeForEuiComponents", [], unknown, ESLintUtils.RuleListener>;
3
- //# sourceMappingURL=prefer_css_attribute_for_eui_components.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prefer_css_attribute_for_eui_components.d.ts","sourceRoot":"","sources":["../../../src/rules/prefer_css_attribute_for_eui_components.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAY,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEjE,eAAO,MAAM,kCAAkC,qGA0D3C,CAAC"}
@@ -1,2 +0,0 @@
1
- import { ESLintUtils } from '@typescript-eslint/utils';
2
- export declare const PreferCSSAttributeForEuiComponents: ESLintUtils.RuleModule<"preferCSSAttributeForEuiComponents", [], unknown, ESLintUtils.RuleListener>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"prefer_css_attribute_for_eui_components.js","sourceRoot":"","sources":["../../../src/rules/prefer_css_attribute_for_eui_components.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,oDAAiE;AAEpD,QAAA,kCAAkC,GAC7C,mBAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IAClC,MAAM,CAAC,OAAO;QACZ,MAAM,wBAAwB,GAAG,YAAY,CAAC;QAE9C,OAAO;YACL,iBAAiB,CAAC,IAAgC;gBAChD,IACE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;oBAClC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7C,CAAC;oBACD,IAAI,aAAgD,CAAC;oBAErD,IACE,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU;yBAC7B,MAAM,CACL,CAAC,IAAI,EAAiC,EAAE,CACtC,IAAI,CAAC,IAAI,KAAK,cAAc,CAC/B;yBACA,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,EAC9C,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,aAAa,EAAE,MAAM;4BAC3B,SAAS,EAAE,oCAAoC;4BAC/C,GAAG,CAAC,KAAK;gCACP,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAC3D,CAAC;gCAEF,IAAI,OAAO,EAAE,CAAC;oCACZ,OAAO,IAAI,CAAC;gCACd,CAAC;gCAED,OAAO,KAAK,CAAC,gBAAgB,CAC3B,aAAa,EAAE,IAAI,EAAE,KAAM,EAC3B,KAAK,CACN,CAAC;4BACJ,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,iDAAiD;SAC/D;QACD,QAAQ,EAAE;YACR,kCAAkC,EAChC,6CAA6C;SAChD;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC"}