@jsse/eslint-config 0.1.0 → 0.1.2
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/dist/cli.cjs +8 -3
- package/dist/cli.js +8 -3
- package/dist/index.cjs +338 -280
- package/dist/index.d.cts +43 -33
- package/dist/index.d.ts +43 -33
- package/dist/index.js +292 -235
- package/package.json +37 -34
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MergeIntersection,
|
|
1
|
+
import { MergeIntersection, TypeScriptRules, VitestRules, YmlRules, NRules, ImportRules, EslintRules, JsoncRules, UnicornRules, EslintCommentsRules, RuleConfig, FlatESLintConfigItem } from '@antfu/eslint-define-config';
|
|
2
2
|
import { ParserOptions } from '@typescript-eslint/parser';
|
|
3
3
|
import * as parser from '@typescript-eslint/parser';
|
|
4
4
|
export { parser as parserTs };
|
|
@@ -11,7 +11,7 @@ export { eslintPluginI as pluginImport };
|
|
|
11
11
|
export { default as pluginJsdoc } from 'eslint-plugin-jsdoc';
|
|
12
12
|
import * as eslintPluginJsonc from 'eslint-plugin-jsonc';
|
|
13
13
|
export { eslintPluginJsonc as pluginJsonc };
|
|
14
|
-
export { default as
|
|
14
|
+
export { default as pluginN } from 'eslint-plugin-n';
|
|
15
15
|
export { default as pluginNoOnlyTests } from 'eslint-plugin-no-only-tests';
|
|
16
16
|
export { default as pluginReact } from 'eslint-plugin-react';
|
|
17
17
|
export { default as pluginReactHooks } from 'eslint-plugin-react-hooks';
|
|
@@ -27,10 +27,11 @@ export { default as parserJsonc } from 'jsonc-eslint-parser';
|
|
|
27
27
|
export { default as pluginMarkdown } from 'eslint-plugin-markdown';
|
|
28
28
|
export { default as pluginPerfectionist } from 'eslint-plugin-perfectionist';
|
|
29
29
|
|
|
30
|
-
type
|
|
31
|
-
|
|
30
|
+
type Awaitable<T> = T | Promise<T>;
|
|
31
|
+
type Rules = MergeIntersection<TypeScriptRules & VitestRules & YmlRules & NRules & ImportRules & EslintRules & JsoncRules & UnicornRules & EslintCommentsRules & {
|
|
32
|
+
"no-only-tests/no-only-tests": RuleConfig;
|
|
32
33
|
}>;
|
|
33
|
-
type
|
|
34
|
+
type FlatConfigItem = Omit<FlatESLintConfigItem<Rules, false>, "plugins"> & {
|
|
34
35
|
/**
|
|
35
36
|
* Custom name of each config item
|
|
36
37
|
*/
|
|
@@ -60,6 +61,12 @@ type OptionsComponentExts = {
|
|
|
60
61
|
*/
|
|
61
62
|
componentExts?: string[];
|
|
62
63
|
};
|
|
64
|
+
type OptionsFiles = {
|
|
65
|
+
/**
|
|
66
|
+
* Override the `files` option to provide custom globs.
|
|
67
|
+
*/
|
|
68
|
+
files?: string[];
|
|
69
|
+
};
|
|
63
70
|
type OptionsTypeScriptParserOptions = {
|
|
64
71
|
/**
|
|
65
72
|
* Additional parser options for TypeScript.
|
|
@@ -92,7 +99,7 @@ type OptionsPrefix = {
|
|
|
92
99
|
};
|
|
93
100
|
};
|
|
94
101
|
type OptionsOverrides = {
|
|
95
|
-
overrides?:
|
|
102
|
+
overrides?: FlatConfigItem["rules"];
|
|
96
103
|
};
|
|
97
104
|
type OptionsIsInEditor = {
|
|
98
105
|
isInEditor?: boolean;
|
|
@@ -179,37 +186,37 @@ type OptionsConfig = {
|
|
|
179
186
|
* Provide overrides for rules for each integration.
|
|
180
187
|
*/
|
|
181
188
|
overrides?: {
|
|
182
|
-
javascript?:
|
|
183
|
-
typescript?:
|
|
184
|
-
test?:
|
|
185
|
-
jsonc?:
|
|
186
|
-
markdown?:
|
|
187
|
-
yaml?:
|
|
189
|
+
javascript?: FlatConfigItem["rules"];
|
|
190
|
+
typescript?: FlatConfigItem["rules"];
|
|
191
|
+
test?: FlatConfigItem["rules"];
|
|
192
|
+
jsonc?: FlatConfigItem["rules"];
|
|
193
|
+
markdown?: FlatConfigItem["rules"];
|
|
194
|
+
yaml?: FlatConfigItem["rules"];
|
|
188
195
|
};
|
|
189
196
|
} & OptionsComponentExts;
|
|
190
197
|
|
|
191
|
-
declare function comments():
|
|
198
|
+
declare function comments(): FlatConfigItem[];
|
|
192
199
|
|
|
193
|
-
declare function ignores():
|
|
200
|
+
declare function ignores(): FlatConfigItem[];
|
|
194
201
|
|
|
195
|
-
declare function imports(options?: OptionsStylistic):
|
|
202
|
+
declare function imports(options?: OptionsStylistic): FlatConfigItem[];
|
|
196
203
|
|
|
197
204
|
declare function javascript(options?: OptionsIsInEditor & OptionsOverrides & {
|
|
198
205
|
reportUnusedDisableDirectives?: boolean;
|
|
199
|
-
}):
|
|
206
|
+
}): FlatConfigItem[];
|
|
200
207
|
|
|
201
|
-
declare function jsdoc(
|
|
208
|
+
declare function jsdoc(): FlatConfigItem[];
|
|
202
209
|
|
|
203
|
-
declare function jsonc(options?: OptionsStylistic & OptionsOverrides):
|
|
210
|
+
declare function jsonc(options?: OptionsStylistic & OptionsOverrides): FlatConfigItem[];
|
|
204
211
|
|
|
205
|
-
declare function node():
|
|
212
|
+
declare function node(): FlatConfigItem[];
|
|
206
213
|
|
|
207
214
|
/**
|
|
208
215
|
* Copied from https://raw.githubusercontent.com/prettier/eslint-config-prettier/main/index.js
|
|
209
216
|
* Main difference is we exclude rules we don't care about.... (flow/babel/etc)
|
|
210
217
|
*/
|
|
211
|
-
declare function eslintConfigPrettierRules():
|
|
212
|
-
declare function prettier():
|
|
218
|
+
declare function eslintConfigPrettierRules(): FlatConfigItem["rules"];
|
|
219
|
+
declare function prettier(): FlatConfigItem[];
|
|
213
220
|
|
|
214
221
|
declare function reactRules(): {
|
|
215
222
|
"react-hooks/exhaustive-deps": string;
|
|
@@ -339,38 +346,38 @@ declare function reactHooks(): {
|
|
|
339
346
|
"react-hooks/rules-of-hooks": string;
|
|
340
347
|
};
|
|
341
348
|
}[];
|
|
342
|
-
declare function react(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact):
|
|
349
|
+
declare function react(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact): FlatConfigItem[];
|
|
343
350
|
|
|
344
351
|
/**
|
|
345
352
|
* Sort package.json
|
|
346
353
|
*
|
|
347
354
|
* Requires `jsonc` config
|
|
348
355
|
*/
|
|
349
|
-
declare function sortPackageJson():
|
|
356
|
+
declare function sortPackageJson(): FlatConfigItem[];
|
|
350
357
|
/**
|
|
351
358
|
* Sort tsconfig.json
|
|
352
359
|
*
|
|
353
360
|
* Requires `jsonc` config
|
|
354
361
|
*/
|
|
355
|
-
declare function sortTsconfig():
|
|
362
|
+
declare function sortTsconfig(): FlatConfigItem[];
|
|
356
363
|
|
|
357
|
-
declare function test(options?: OptionsIsInEditor & OptionsOverrides):
|
|
364
|
+
declare function test(options?: OptionsIsInEditor & OptionsOverrides): FlatConfigItem[];
|
|
358
365
|
|
|
359
|
-
declare function typescript(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact & OptionsPrefix):
|
|
366
|
+
declare function typescript(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact & OptionsPrefix): Promise<FlatConfigItem[]>;
|
|
360
367
|
|
|
361
|
-
declare function unicorn():
|
|
368
|
+
declare function unicorn(): FlatConfigItem[];
|
|
362
369
|
|
|
363
370
|
/**
|
|
364
371
|
* Optional perfectionist plugin for props and items sorting.
|
|
365
372
|
*
|
|
366
373
|
* @see https://github.com/azat-io/eslint-plugin-perfectionist
|
|
367
374
|
*/
|
|
368
|
-
declare function perfectionist():
|
|
375
|
+
declare function perfectionist(): FlatConfigItem[];
|
|
369
376
|
|
|
370
377
|
/**
|
|
371
378
|
* Construct an array of ESLint flat config items.
|
|
372
379
|
*/
|
|
373
|
-
declare function jsse(options?: OptionsConfig &
|
|
380
|
+
declare function jsse(options?: OptionsConfig & FlatConfigItem, ...userConfigs: (FlatConfigItem | FlatConfigItem[])[]): Promise<FlatConfigItem[]>;
|
|
374
381
|
|
|
375
382
|
declare const GLOB_SRC_EXT = "?([cm])[jt]s?(x)";
|
|
376
383
|
declare const GLOB_SRC = "**/*.?([cm])[jt]s?(x)";
|
|
@@ -396,12 +403,15 @@ declare const GLOB_EXCLUDE: string[];
|
|
|
396
403
|
/**
|
|
397
404
|
* Combine array and non-array configs into a single array.
|
|
398
405
|
*/
|
|
399
|
-
declare function combine(...configs: (
|
|
406
|
+
declare function combine(...configs: (FlatConfigItem | FlatConfigItem[])[]): FlatConfigItem[];
|
|
400
407
|
declare function renameRules<TRule = unknown>(rules: Record<string, TRule>, from: string, to: string): Record<string, TRule>;
|
|
408
|
+
declare function interopDefault<T>(m: Awaitable<T>): Promise<T extends {
|
|
409
|
+
default: infer U;
|
|
410
|
+
} ? U : T>;
|
|
401
411
|
declare function isCI(): boolean;
|
|
402
412
|
declare function isInEditor(): boolean;
|
|
403
413
|
|
|
404
|
-
declare function jssestd():
|
|
405
|
-
declare function jsseReact():
|
|
414
|
+
declare function jssestd(): Promise<FlatConfigItem[]>;
|
|
415
|
+
declare function jsseReact(): Promise<FlatConfigItem[]>;
|
|
406
416
|
|
|
407
|
-
export { type
|
|
417
|
+
export { type Awaitable, type FlatConfigItem, GLOB_ALL_SRC, GLOB_CSS, GLOB_EXCLUDE, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_MARKDOWN, GLOB_MARKDOWN_CODE, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_STYLE, GLOB_TESTS, GLOB_TS, GLOB_TSX, GLOB_YAML, type OptionsCommon, type OptionsComponentExts, type OptionsConfig, type OptionsFiles, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsOverrides, type OptionsPrefix, type OptionsReact, type OptionsStylistic, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type Rules, type StylisticConfig, combine, comments, jsse as default, eslintConfigPrettierRules, ignores, imports, interopDefault, isCI, isInEditor, javascript, jsdoc, jsonc, jsse, jsseReact, jssestd, node, perfectionist, prettier, react, reactHooks, reactRules, renameRules, sortPackageJson, sortTsconfig, test, typescript, unicorn };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MergeIntersection,
|
|
1
|
+
import { MergeIntersection, TypeScriptRules, VitestRules, YmlRules, NRules, ImportRules, EslintRules, JsoncRules, UnicornRules, EslintCommentsRules, RuleConfig, FlatESLintConfigItem } from '@antfu/eslint-define-config';
|
|
2
2
|
import { ParserOptions } from '@typescript-eslint/parser';
|
|
3
3
|
import * as parser from '@typescript-eslint/parser';
|
|
4
4
|
export { parser as parserTs };
|
|
@@ -11,7 +11,7 @@ export { eslintPluginI as pluginImport };
|
|
|
11
11
|
export { default as pluginJsdoc } from 'eslint-plugin-jsdoc';
|
|
12
12
|
import * as eslintPluginJsonc from 'eslint-plugin-jsonc';
|
|
13
13
|
export { eslintPluginJsonc as pluginJsonc };
|
|
14
|
-
export { default as
|
|
14
|
+
export { default as pluginN } from 'eslint-plugin-n';
|
|
15
15
|
export { default as pluginNoOnlyTests } from 'eslint-plugin-no-only-tests';
|
|
16
16
|
export { default as pluginReact } from 'eslint-plugin-react';
|
|
17
17
|
export { default as pluginReactHooks } from 'eslint-plugin-react-hooks';
|
|
@@ -27,10 +27,11 @@ export { default as parserJsonc } from 'jsonc-eslint-parser';
|
|
|
27
27
|
export { default as pluginMarkdown } from 'eslint-plugin-markdown';
|
|
28
28
|
export { default as pluginPerfectionist } from 'eslint-plugin-perfectionist';
|
|
29
29
|
|
|
30
|
-
type
|
|
31
|
-
|
|
30
|
+
type Awaitable<T> = T | Promise<T>;
|
|
31
|
+
type Rules = MergeIntersection<TypeScriptRules & VitestRules & YmlRules & NRules & ImportRules & EslintRules & JsoncRules & UnicornRules & EslintCommentsRules & {
|
|
32
|
+
"no-only-tests/no-only-tests": RuleConfig;
|
|
32
33
|
}>;
|
|
33
|
-
type
|
|
34
|
+
type FlatConfigItem = Omit<FlatESLintConfigItem<Rules, false>, "plugins"> & {
|
|
34
35
|
/**
|
|
35
36
|
* Custom name of each config item
|
|
36
37
|
*/
|
|
@@ -60,6 +61,12 @@ type OptionsComponentExts = {
|
|
|
60
61
|
*/
|
|
61
62
|
componentExts?: string[];
|
|
62
63
|
};
|
|
64
|
+
type OptionsFiles = {
|
|
65
|
+
/**
|
|
66
|
+
* Override the `files` option to provide custom globs.
|
|
67
|
+
*/
|
|
68
|
+
files?: string[];
|
|
69
|
+
};
|
|
63
70
|
type OptionsTypeScriptParserOptions = {
|
|
64
71
|
/**
|
|
65
72
|
* Additional parser options for TypeScript.
|
|
@@ -92,7 +99,7 @@ type OptionsPrefix = {
|
|
|
92
99
|
};
|
|
93
100
|
};
|
|
94
101
|
type OptionsOverrides = {
|
|
95
|
-
overrides?:
|
|
102
|
+
overrides?: FlatConfigItem["rules"];
|
|
96
103
|
};
|
|
97
104
|
type OptionsIsInEditor = {
|
|
98
105
|
isInEditor?: boolean;
|
|
@@ -179,37 +186,37 @@ type OptionsConfig = {
|
|
|
179
186
|
* Provide overrides for rules for each integration.
|
|
180
187
|
*/
|
|
181
188
|
overrides?: {
|
|
182
|
-
javascript?:
|
|
183
|
-
typescript?:
|
|
184
|
-
test?:
|
|
185
|
-
jsonc?:
|
|
186
|
-
markdown?:
|
|
187
|
-
yaml?:
|
|
189
|
+
javascript?: FlatConfigItem["rules"];
|
|
190
|
+
typescript?: FlatConfigItem["rules"];
|
|
191
|
+
test?: FlatConfigItem["rules"];
|
|
192
|
+
jsonc?: FlatConfigItem["rules"];
|
|
193
|
+
markdown?: FlatConfigItem["rules"];
|
|
194
|
+
yaml?: FlatConfigItem["rules"];
|
|
188
195
|
};
|
|
189
196
|
} & OptionsComponentExts;
|
|
190
197
|
|
|
191
|
-
declare function comments():
|
|
198
|
+
declare function comments(): FlatConfigItem[];
|
|
192
199
|
|
|
193
|
-
declare function ignores():
|
|
200
|
+
declare function ignores(): FlatConfigItem[];
|
|
194
201
|
|
|
195
|
-
declare function imports(options?: OptionsStylistic):
|
|
202
|
+
declare function imports(options?: OptionsStylistic): FlatConfigItem[];
|
|
196
203
|
|
|
197
204
|
declare function javascript(options?: OptionsIsInEditor & OptionsOverrides & {
|
|
198
205
|
reportUnusedDisableDirectives?: boolean;
|
|
199
|
-
}):
|
|
206
|
+
}): FlatConfigItem[];
|
|
200
207
|
|
|
201
|
-
declare function jsdoc(
|
|
208
|
+
declare function jsdoc(): FlatConfigItem[];
|
|
202
209
|
|
|
203
|
-
declare function jsonc(options?: OptionsStylistic & OptionsOverrides):
|
|
210
|
+
declare function jsonc(options?: OptionsStylistic & OptionsOverrides): FlatConfigItem[];
|
|
204
211
|
|
|
205
|
-
declare function node():
|
|
212
|
+
declare function node(): FlatConfigItem[];
|
|
206
213
|
|
|
207
214
|
/**
|
|
208
215
|
* Copied from https://raw.githubusercontent.com/prettier/eslint-config-prettier/main/index.js
|
|
209
216
|
* Main difference is we exclude rules we don't care about.... (flow/babel/etc)
|
|
210
217
|
*/
|
|
211
|
-
declare function eslintConfigPrettierRules():
|
|
212
|
-
declare function prettier():
|
|
218
|
+
declare function eslintConfigPrettierRules(): FlatConfigItem["rules"];
|
|
219
|
+
declare function prettier(): FlatConfigItem[];
|
|
213
220
|
|
|
214
221
|
declare function reactRules(): {
|
|
215
222
|
"react-hooks/exhaustive-deps": string;
|
|
@@ -339,38 +346,38 @@ declare function reactHooks(): {
|
|
|
339
346
|
"react-hooks/rules-of-hooks": string;
|
|
340
347
|
};
|
|
341
348
|
}[];
|
|
342
|
-
declare function react(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact):
|
|
349
|
+
declare function react(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact): FlatConfigItem[];
|
|
343
350
|
|
|
344
351
|
/**
|
|
345
352
|
* Sort package.json
|
|
346
353
|
*
|
|
347
354
|
* Requires `jsonc` config
|
|
348
355
|
*/
|
|
349
|
-
declare function sortPackageJson():
|
|
356
|
+
declare function sortPackageJson(): FlatConfigItem[];
|
|
350
357
|
/**
|
|
351
358
|
* Sort tsconfig.json
|
|
352
359
|
*
|
|
353
360
|
* Requires `jsonc` config
|
|
354
361
|
*/
|
|
355
|
-
declare function sortTsconfig():
|
|
362
|
+
declare function sortTsconfig(): FlatConfigItem[];
|
|
356
363
|
|
|
357
|
-
declare function test(options?: OptionsIsInEditor & OptionsOverrides):
|
|
364
|
+
declare function test(options?: OptionsIsInEditor & OptionsOverrides): FlatConfigItem[];
|
|
358
365
|
|
|
359
|
-
declare function typescript(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact & OptionsPrefix):
|
|
366
|
+
declare function typescript(options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions & OptionsReact & OptionsPrefix): Promise<FlatConfigItem[]>;
|
|
360
367
|
|
|
361
|
-
declare function unicorn():
|
|
368
|
+
declare function unicorn(): FlatConfigItem[];
|
|
362
369
|
|
|
363
370
|
/**
|
|
364
371
|
* Optional perfectionist plugin for props and items sorting.
|
|
365
372
|
*
|
|
366
373
|
* @see https://github.com/azat-io/eslint-plugin-perfectionist
|
|
367
374
|
*/
|
|
368
|
-
declare function perfectionist():
|
|
375
|
+
declare function perfectionist(): FlatConfigItem[];
|
|
369
376
|
|
|
370
377
|
/**
|
|
371
378
|
* Construct an array of ESLint flat config items.
|
|
372
379
|
*/
|
|
373
|
-
declare function jsse(options?: OptionsConfig &
|
|
380
|
+
declare function jsse(options?: OptionsConfig & FlatConfigItem, ...userConfigs: (FlatConfigItem | FlatConfigItem[])[]): Promise<FlatConfigItem[]>;
|
|
374
381
|
|
|
375
382
|
declare const GLOB_SRC_EXT = "?([cm])[jt]s?(x)";
|
|
376
383
|
declare const GLOB_SRC = "**/*.?([cm])[jt]s?(x)";
|
|
@@ -396,12 +403,15 @@ declare const GLOB_EXCLUDE: string[];
|
|
|
396
403
|
/**
|
|
397
404
|
* Combine array and non-array configs into a single array.
|
|
398
405
|
*/
|
|
399
|
-
declare function combine(...configs: (
|
|
406
|
+
declare function combine(...configs: (FlatConfigItem | FlatConfigItem[])[]): FlatConfigItem[];
|
|
400
407
|
declare function renameRules<TRule = unknown>(rules: Record<string, TRule>, from: string, to: string): Record<string, TRule>;
|
|
408
|
+
declare function interopDefault<T>(m: Awaitable<T>): Promise<T extends {
|
|
409
|
+
default: infer U;
|
|
410
|
+
} ? U : T>;
|
|
401
411
|
declare function isCI(): boolean;
|
|
402
412
|
declare function isInEditor(): boolean;
|
|
403
413
|
|
|
404
|
-
declare function jssestd():
|
|
405
|
-
declare function jsseReact():
|
|
414
|
+
declare function jssestd(): Promise<FlatConfigItem[]>;
|
|
415
|
+
declare function jsseReact(): Promise<FlatConfigItem[]>;
|
|
406
416
|
|
|
407
|
-
export { type
|
|
417
|
+
export { type Awaitable, type FlatConfigItem, GLOB_ALL_SRC, GLOB_CSS, GLOB_EXCLUDE, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_MARKDOWN, GLOB_MARKDOWN_CODE, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_STYLE, GLOB_TESTS, GLOB_TS, GLOB_TSX, GLOB_YAML, type OptionsCommon, type OptionsComponentExts, type OptionsConfig, type OptionsFiles, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsOverrides, type OptionsPrefix, type OptionsReact, type OptionsStylistic, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type Rules, type StylisticConfig, combine, comments, jsse as default, eslintConfigPrettierRules, ignores, imports, interopDefault, isCI, isInEditor, javascript, jsdoc, jsonc, jsse, jsseReact, jssestd, node, perfectionist, prettier, react, reactHooks, reactRules, renameRules, sortPackageJson, sortTsconfig, test, typescript, unicorn };
|