@gaia-react/lint 1.2.0 → 1.3.1
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 +85 -66
- package/dist/configs/base.d.ts +1 -1
- package/dist/configs/base.d.ts.map +1 -1
- package/dist/configs/guardrails.d.ts +1 -1
- package/dist/configs/guardrails.d.ts.map +1 -1
- package/dist/configs/ignores.d.ts +10 -2
- package/dist/configs/ignores.d.ts.map +1 -1
- package/dist/configs/style-hygiene.d.ts +1 -1
- package/dist/configs/style-hygiene.d.ts.map +1 -1
- package/dist/index.d.ts +44 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +442 -431
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -17,44 +17,55 @@ verbatim and adjust the override block at the bottom for your project.
|
|
|
17
17
|
import gaiaLint from '@gaia-react/lint';
|
|
18
18
|
import {defineConfig} from 'eslint/config';
|
|
19
19
|
|
|
20
|
+
const lint = gaiaLint();
|
|
21
|
+
|
|
20
22
|
export default defineConfig([
|
|
21
|
-
...
|
|
22
|
-
...
|
|
23
|
-
...
|
|
24
|
-
...
|
|
25
|
-
...
|
|
26
|
-
...
|
|
27
|
-
...
|
|
28
|
-
...
|
|
29
|
-
...
|
|
30
|
-
|
|
31
|
-
ignore: ['plain-link', 'plain-table'],
|
|
32
|
-
}),
|
|
33
|
-
...gaiaLint.prettier,
|
|
23
|
+
...lint.ignores,
|
|
24
|
+
...lint.base,
|
|
25
|
+
...lint.react,
|
|
26
|
+
...lint.testing,
|
|
27
|
+
...lint.storybook,
|
|
28
|
+
...lint.playwright,
|
|
29
|
+
...lint.styleHygiene,
|
|
30
|
+
...lint.guardrails,
|
|
31
|
+
...lint.betterTailwind({entryPoint: './app/styles/tailwind.css'}),
|
|
32
|
+
...lint.prettier,
|
|
34
33
|
]);
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
##
|
|
36
|
+
## Factory options
|
|
37
|
+
|
|
38
|
+
`gaiaLint(opts?)` returns a bundle of config blocks. Call it once at the
|
|
39
|
+
top of `eslint.config.mjs` and spread the returned configs into
|
|
40
|
+
`defineConfig`.
|
|
41
|
+
|
|
42
|
+
| Option | Type | Default | Description |
|
|
43
|
+
| ----------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
44
|
+
| `sourceDir` | `string` | `'app'` | Project source directory (relative to repo root). Used to scope filename conventions, hook-folder rules, and the `no-relative-import-paths` root path. |
|
|
45
|
+
|
|
46
|
+
Non-GAIA projects that store source under `src/` (or any other path):
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
const lint = gaiaLint({sourceDir: 'src'});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
That single call rebinds `base`, `styleHygiene`, and `guardrails` to the
|
|
53
|
+
new source root — no per-config override blocks needed.
|
|
38
54
|
|
|
39
|
-
|
|
55
|
+
## Bundle shape
|
|
56
|
+
|
|
57
|
+
| Property | Shape | Includes | Required? |
|
|
40
58
|
| ---------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
|
|
41
59
|
| `base` | `Linter.Config[]` | JS recommended, TypeScript (typescript-eslint), `import-x`, `eslint-comments`, `prefer-arrow-functions`, lodash/underscore guard | required |
|
|
42
60
|
| `react` | `Linter.Config[]` | `eslint-plugin-react`, `react-hooks`, `jsx-a11y`, GAIA-specific React rules | required for React apps |
|
|
43
61
|
| `styleHygiene` | `Linter.Config[]` | `canonical`, `perfectionist`, `unicorn`, `unused-imports`, `check-file` | required |
|
|
44
|
-
| `guardrails` | `Linter.Config[]` | `no-enum` (custom), `no-switch` (custom), `no-relative-import-paths`, `sonarjs`, `eslint-comments`, `import-x`, `prefer-arrow-functions`
|
|
62
|
+
| `guardrails` | `Linter.Config[]` | `no-enum` (custom), `no-switch` (custom), `no-jsx-iife` (custom), `no-relative-import-paths`, `sonarjs`, `eslint-comments`, `import-x`, `prefer-arrow-functions` | required |
|
|
45
63
|
| `testing` | `Linter.Config[]` | Vitest + Testing Library config scoped to `*.test.*` and `test/` | optional |
|
|
46
64
|
| `storybook` | `Linter.Config[]` | `eslint-plugin-storybook` scoped to `*.stories.*` | optional |
|
|
47
65
|
| `playwright` | `Linter.Config[]` | `eslint-plugin-playwright` scoped to `e2e/` | optional |
|
|
48
66
|
| `prettier` | `Linter.Config[]` | `eslint-config-prettier` — must be **last** to disable formatting rules | required if using Prettier |
|
|
49
67
|
| `betterTailwind` | `(opts) => Linter.Config[]` | `eslint-plugin-better-tailwindcss` factory; takes `entryPoint` (path to Tailwind entry CSS) and optional `ignore` (class names to skip) | optional |
|
|
50
|
-
| `ignores` | `(opts?) => Linter.Config[]`
|
|
51
|
-
|
|
52
|
-
The default export bundles every named export:
|
|
53
|
-
|
|
54
|
-
```js
|
|
55
|
-
import gaiaLint from '@gaia-react/lint';
|
|
56
|
-
// gaiaLint.base, gaiaLint.react, gaiaLint.betterTailwind({...}), ...
|
|
57
|
-
```
|
|
68
|
+
| `ignores` | `Iterable<Linter.Config> & ((opts?) => Linter.Config[])` | `includeIgnoreFile` helper plus GAIA defaults. Spread directly for defaults (`...lint.ignores`) or call with options to override (`...lint.ignores({extra: ['.gaia/**']})`). | recommended |
|
|
58
69
|
|
|
59
70
|
## Override patterns
|
|
60
71
|
|
|
@@ -65,8 +76,8 @@ gaia-lint spreads to disable, change, or scope rules.
|
|
|
65
76
|
|
|
66
77
|
```js
|
|
67
78
|
export default defineConfig([
|
|
68
|
-
...
|
|
69
|
-
...
|
|
79
|
+
...lint.base,
|
|
80
|
+
...lint.react,
|
|
70
81
|
{rules: {'sonarjs/cognitive-complexity': 'off'}},
|
|
71
82
|
]);
|
|
72
83
|
```
|
|
@@ -75,8 +86,8 @@ export default defineConfig([
|
|
|
75
86
|
|
|
76
87
|
```js
|
|
77
88
|
export default defineConfig([
|
|
78
|
-
...
|
|
79
|
-
...
|
|
89
|
+
...lint.base,
|
|
90
|
+
...lint.react,
|
|
80
91
|
{
|
|
81
92
|
files: ['app/legacy/**'],
|
|
82
93
|
rules: {'sonarjs/cognitive-complexity': 'off'},
|
|
@@ -88,7 +99,7 @@ export default defineConfig([
|
|
|
88
99
|
|
|
89
100
|
```js
|
|
90
101
|
export default defineConfig([
|
|
91
|
-
...
|
|
102
|
+
...lint.base,
|
|
92
103
|
{
|
|
93
104
|
languageOptions: {
|
|
94
105
|
parserOptions: {project: './tsconfig.eslint.json'},
|
|
@@ -103,8 +114,8 @@ export default defineConfig([
|
|
|
103
114
|
import myPlugin from 'eslint-plugin-my-plugin';
|
|
104
115
|
|
|
105
116
|
export default defineConfig([
|
|
106
|
-
...
|
|
107
|
-
...
|
|
117
|
+
...lint.base,
|
|
118
|
+
...lint.react,
|
|
108
119
|
{
|
|
109
120
|
plugins: {'my-plugin': myPlugin},
|
|
110
121
|
rules: {'my-plugin/some-rule': 'error'},
|
|
@@ -129,7 +140,7 @@ Supported versions:
|
|
|
129
140
|
|
|
130
141
|
## Custom rules included
|
|
131
142
|
|
|
132
|
-
|
|
143
|
+
Three rules are implemented inside this package and ship as part of
|
|
133
144
|
`guardrails`.
|
|
134
145
|
|
|
135
146
|
### `no-enum`
|
|
@@ -139,21 +150,6 @@ tree-shakeable, conflate value and type space, and have well-known footguns
|
|
|
139
150
|
around numeric vs string enums and reverse mappings. Use a `const` object
|
|
140
151
|
plus a derived union type instead.
|
|
141
152
|
|
|
142
|
-
```ts
|
|
143
|
-
// flagged
|
|
144
|
-
enum Status {
|
|
145
|
-
Active,
|
|
146
|
-
Inactive,
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// preferred
|
|
150
|
-
const Status = {
|
|
151
|
-
Active: 'active',
|
|
152
|
-
Inactive: 'inactive',
|
|
153
|
-
} as const;
|
|
154
|
-
type Status = (typeof Status)[keyof typeof Status];
|
|
155
|
-
```
|
|
156
|
-
|
|
157
153
|
Opt out for a file or block:
|
|
158
154
|
|
|
159
155
|
```js
|
|
@@ -173,13 +169,23 @@ Opt out for a file or block:
|
|
|
173
169
|
{files: ['src/parser/**'], rules: {'no-switch/no-switch': 'off'}}
|
|
174
170
|
```
|
|
175
171
|
|
|
172
|
+
### `no-jsx-iife`
|
|
173
|
+
|
|
174
|
+
Forbids IIFEs (`{(() => { ... })()}`) inside JSX expression containers in `.tsx` and `.jsx` files. IIFEs obscure intent and allocate a new function on every render. Compute the value in a variable before the return statement, or use an inline `&&` expression instead.
|
|
175
|
+
|
|
176
|
+
Opt out for a file or block:
|
|
177
|
+
|
|
178
|
+
```js
|
|
179
|
+
{files: ['src/legacy/**'], rules: {'no-jsx-iife/no-jsx-iife': 'off'}}
|
|
180
|
+
```
|
|
181
|
+
|
|
176
182
|
## Tailwind / better-tailwindcss factory
|
|
177
183
|
|
|
178
184
|
`betterTailwind` is a factory because the underlying plugin needs to know
|
|
179
185
|
where your Tailwind entry CSS file lives.
|
|
180
186
|
|
|
181
187
|
```js
|
|
182
|
-
...
|
|
188
|
+
...lint.betterTailwind({
|
|
183
189
|
entryPoint: './app/styles/tailwind.css',
|
|
184
190
|
ignore: ['plain-link', 'plain-table'],
|
|
185
191
|
}),
|
|
@@ -193,37 +199,50 @@ where your Tailwind entry CSS file lives.
|
|
|
193
199
|
## Ignores factory
|
|
194
200
|
|
|
195
201
|
`ignores` produces a leading flat-config block that merges your
|
|
196
|
-
`.gitignore` plus GAIA defaults.
|
|
202
|
+
`.gitignore` plus GAIA defaults. `.gitignore` is picked up automatically
|
|
203
|
+
if it exists at the project root — no need to declare it.
|
|
204
|
+
|
|
205
|
+
`lint.ignores` is dual-shape: spread it directly for the default case
|
|
206
|
+
(no call), or call it with options to override.
|
|
197
207
|
|
|
198
208
|
```js
|
|
199
|
-
...
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}),
|
|
209
|
+
...lint.ignores, // default: auto .gitignore + GAIA defaults
|
|
210
|
+
...lint.ignores({extra: ['coverage/**']}), // + extra globs
|
|
211
|
+
...lint.ignores({gitignore: 'config/.gitignore'}), // override the path
|
|
212
|
+
...lint.ignores({gitignore: false}), // opt out of the merge
|
|
203
213
|
```
|
|
204
214
|
|
|
205
|
-
| Option | Type
|
|
206
|
-
| ---------- |
|
|
207
|
-
| `gitignore`| `string`
|
|
208
|
-
| `extra` | `string[]`
|
|
215
|
+
| Option | Type | Required | Description |
|
|
216
|
+
| ---------- | ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
217
|
+
| `gitignore`| `string \| false` | no | Path to a `.gitignore` file (relative to `cwd` or absolute). Defaults to `'.gitignore'`. Silently skipped if the resolved path does not exist. Pass `false` to opt out entirely. |
|
|
218
|
+
| `extra` | `string[]` | no | Extra ignore globs merged with GAIA defaults. |
|
|
209
219
|
|
|
210
220
|
## GAIA folder conventions baked into `check-file`
|
|
211
221
|
|
|
212
|
-
The `check-file` rules in `styleHygiene` encode GAIA's folder layout
|
|
222
|
+
The `check-file` rules in `styleHygiene` encode GAIA's folder layout (with
|
|
223
|
+
`sourceDir` substituted for the literal `app/` prefix):
|
|
213
224
|
|
|
214
|
-
-
|
|
215
|
-
-
|
|
216
|
-
-
|
|
225
|
+
- `<sourceDir>/components/**` — component file naming
|
|
226
|
+
- `<sourceDir>/pages/**` — route/page file naming
|
|
227
|
+
- `<sourceDir>/hooks/**` — hook file naming (`use-*.ts`)
|
|
217
228
|
- `test/**` — test harness naming
|
|
218
229
|
|
|
219
|
-
|
|
220
|
-
`check-file/*` rules **after** the `styleHygiene` spread:
|
|
230
|
+
For most non-GAIA layouts, passing `sourceDir` to the factory is enough:
|
|
221
231
|
|
|
222
232
|
```js
|
|
233
|
+
const lint = gaiaLint({sourceDir: 'src'});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
If the convention itself differs (e.g. PascalCase component files instead
|
|
237
|
+
of `index.tsx`), override the relevant `check-file/*` rules **after** the
|
|
238
|
+
`styleHygiene` spread:
|
|
239
|
+
|
|
240
|
+
```js
|
|
241
|
+
const lint = gaiaLint({sourceDir: 'src'});
|
|
242
|
+
|
|
223
243
|
export default defineConfig([
|
|
224
|
-
...
|
|
225
|
-
...
|
|
226
|
-
// Project uses src/ instead of app/
|
|
244
|
+
...lint.base,
|
|
245
|
+
...lint.styleHygiene,
|
|
227
246
|
{
|
|
228
247
|
files: ['src/components/**'],
|
|
229
248
|
rules: {
|
package/dist/configs/base.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAgT3C,eAAO,MAAM,SAAS,GAAI,WAAW,MAAM,KAAG,MAAM,CAAC,MAAM,EAS1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/configs/guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/configs/guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAmGnC,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MAAM,CAAC,MAAM,EAMhE,CAAC"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type { Linter } from 'eslint';
|
|
2
2
|
export type GaiaLintIgnoresOptions = {
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Path to a `.gitignore` file to merge in. Resolved from `process.cwd()`
|
|
5
|
+
* if relative. Pass `false` to skip the gitignore merge entirely.
|
|
6
|
+
*
|
|
7
|
+
* If the resolved path does not exist, the merge is silently skipped —
|
|
8
|
+
* projects without a `.gitignore` don't need to opt out explicitly.
|
|
9
|
+
*
|
|
10
|
+
* @default '.gitignore'
|
|
11
|
+
*/
|
|
12
|
+
gitignore?: string | false;
|
|
5
13
|
/** Extra ignore globs to merge with GAIA defaults. */
|
|
6
14
|
extra?: string[];
|
|
7
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ignores.d.ts","sourceRoot":"","sources":["../../src/configs/ignores.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ignores.d.ts","sourceRoot":"","sources":["../../src/configs/ignores.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAInC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC3B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAoBF;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,sBAAsB,KAAG,MAAM,CAAC,MAAM,EAmBpE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-hygiene.d.ts","sourceRoot":"","sources":["../../src/configs/style-hygiene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAsQnC,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"style-hygiene.d.ts","sourceRoot":"","sources":["../../src/configs/style-hygiene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAsQnC,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,MAAM,CAAC,MAAM,EAMlE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,34 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export {
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import { guardrails } from './configs/guardrails.js';
|
|
15
|
-
import { testing } from './configs/testing.js';
|
|
16
|
-
import { storybook } from './configs/storybook.js';
|
|
17
|
-
import { playwright } from './configs/playwright.js';
|
|
18
|
-
import { prettier } from './configs/prettier.js';
|
|
19
|
-
import { betterTailwind } from './configs/better-tailwind.js';
|
|
20
|
-
import { ignores } from './configs/ignores.js';
|
|
21
|
-
declare const gaiaLint: {
|
|
22
|
-
base: typeof base;
|
|
23
|
-
react: typeof react;
|
|
24
|
-
styleHygiene: typeof styleHygiene;
|
|
25
|
-
guardrails: typeof guardrails;
|
|
26
|
-
testing: typeof testing;
|
|
27
|
-
storybook: typeof storybook;
|
|
28
|
-
playwright: typeof playwright;
|
|
29
|
-
prettier: typeof prettier;
|
|
30
|
-
betterTailwind: typeof betterTailwind;
|
|
31
|
-
ignores: typeof ignores;
|
|
1
|
+
import type { Linter } from 'eslint';
|
|
2
|
+
import { type GaiaLintBetterTailwindOptions } from './configs/better-tailwind.js';
|
|
3
|
+
import { type GaiaLintIgnoresOptions } from './configs/ignores.js';
|
|
4
|
+
export type { GaiaLintBetterTailwindOptions, GaiaLintIgnoresOptions };
|
|
5
|
+
export type GaiaLintOptions = {
|
|
6
|
+
/**
|
|
7
|
+
* Application source directory (relative to project root). Used to scope
|
|
8
|
+
* file-path-based rules — filename conventions, hook-folder scoping,
|
|
9
|
+
* `no-relative-import-paths` root, etc.
|
|
10
|
+
*
|
|
11
|
+
* @default 'app'
|
|
12
|
+
*/
|
|
13
|
+
sourceDir?: string;
|
|
32
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Dual-shape `ignores` accessor. Spread it directly for the default
|
|
17
|
+
* configuration (`...lint.ignores`) or call it to override
|
|
18
|
+
* (`...lint.ignores({extra: ['coverage/**']})`).
|
|
19
|
+
*/
|
|
20
|
+
export type GaiaLintIgnores = ((opts?: GaiaLintIgnoresOptions) => Linter.Config[]) & Iterable<Linter.Config>;
|
|
21
|
+
export type GaiaLintBundle = {
|
|
22
|
+
base: Linter.Config[];
|
|
23
|
+
betterTailwind: (opts: GaiaLintBetterTailwindOptions) => Linter.Config[];
|
|
24
|
+
guardrails: Linter.Config[];
|
|
25
|
+
ignores: GaiaLintIgnores;
|
|
26
|
+
playwright: Linter.Config[];
|
|
27
|
+
prettier: Linter.Config[];
|
|
28
|
+
react: Linter.Config[];
|
|
29
|
+
storybook: Linter.Config[];
|
|
30
|
+
styleHygiene: Linter.Config[];
|
|
31
|
+
testing: Linter.Config[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* GAIA lint configuration factory.
|
|
35
|
+
*
|
|
36
|
+
* Call once at the top of your `eslint.config.mjs` to bind a `sourceDir`,
|
|
37
|
+
* then spread the returned configs into `defineConfig`. Defaults to GAIA's
|
|
38
|
+
* `'app'` layout; pass `{sourceDir: 'src'}` (or any other value) for
|
|
39
|
+
* projects that store source elsewhere.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const lint = gaiaLint(); // GAIA / app/
|
|
43
|
+
* const lint = gaiaLint({sourceDir: 'src'}); // src/
|
|
44
|
+
*/
|
|
45
|
+
declare const gaiaLint: (opts?: GaiaLintOptions) => GaiaLintBundle;
|
|
33
46
|
export default gaiaLint;
|
|
34
47
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAU,KAAK,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AAQ1E,YAAY,EAAC,6BAA6B,EAAE,sBAAsB,EAAC,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAC7B,IAAI,CAAC,EAAE,sBAAsB,KAC1B,MAAM,CAAC,MAAM,EAAE,CAAC,GACnB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CAC1B,CAAC;AAWF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,QAAQ,GAAI,OAAO,eAAe,KAAG,cAc1C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|