@thymian/common-cli 0.0.0-PLACEHOLDER
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 +59 -0
- package/dist/base-cli-run-command.d.ts +94 -0
- package/dist/base-cli-run-command.d.ts.map +1 -0
- package/dist/base-cli-run-command.js +440 -0
- package/dist/base-cli-run-command.js.map +1 -0
- package/dist/default-config.d.ts +3 -0
- package/dist/default-config.d.ts.map +1 -0
- package/dist/default-config.js +27 -0
- package/dist/default-config.js.map +1 -0
- package/dist/error-cache.d.ts +31 -0
- package/dist/error-cache.d.ts.map +1 -0
- package/dist/error-cache.js +36 -0
- package/dist/error-cache.js.map +1 -0
- package/dist/feedback.d.ts +13 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +30 -0
- package/dist/feedback.js.map +1 -0
- package/dist/flags/filter-flag.d.ts +20 -0
- package/dist/flags/filter-flag.d.ts.map +1 -0
- package/dist/flags/filter-flag.js +63 -0
- package/dist/flags/filter-flag.js.map +1 -0
- package/dist/flags/option-flag.d.ts +39 -0
- package/dist/flags/option-flag.d.ts.map +1 -0
- package/dist/flags/option-flag.js +144 -0
- package/dist/flags/option-flag.js.map +1 -0
- package/dist/flags/rule-set-flag.d.ts +5 -0
- package/dist/flags/rule-set-flag.d.ts.map +1 -0
- package/dist/flags/rule-set-flag.js +9 -0
- package/dist/flags/rule-set-flag.js.map +1 -0
- package/dist/flags/spec-flag.d.ts +11 -0
- package/dist/flags/spec-flag.d.ts.map +1 -0
- package/dist/flags/spec-flag.js +25 -0
- package/dist/flags/spec-flag.js.map +1 -0
- package/dist/flags/traffic-flag.d.ts +10 -0
- package/dist/flags/traffic-flag.d.ts.map +1 -0
- package/dist/flags/traffic-flag.js +24 -0
- package/dist/flags/traffic-flag.js.map +1 -0
- package/dist/get-config.d.ts +20 -0
- package/dist/get-config.d.ts.map +1 -0
- package/dist/get-config.js +82 -0
- package/dist/get-config.js.map +1 -0
- package/dist/hooks/feedback-hook.d.ts +9 -0
- package/dist/hooks/feedback-hook.d.ts.map +1 -0
- package/dist/hooks/feedback-hook.js +2 -0
- package/dist/hooks/feedback-hook.js.map +1 -0
- package/dist/hooks/plugin-init-hook.d.ts +20 -0
- package/dist/hooks/plugin-init-hook.d.ts.map +1 -0
- package/dist/hooks/plugin-init-hook.js +2 -0
- package/dist/hooks/plugin-init-hook.js.map +1 -0
- package/dist/hooks/spec-search-hook.d.ts +18 -0
- package/dist/hooks/spec-search-hook.d.ts.map +1 -0
- package/dist/hooks/spec-search-hook.js +2 -0
- package/dist/hooks/spec-search-hook.js.map +1 -0
- package/dist/hooks/traffic-search-hook.d.ts +18 -0
- package/dist/hooks/traffic-search-hook.d.ts.map +1 -0
- package/dist/hooks/traffic-search-hook.js +2 -0
- package/dist/hooks/traffic-search-hook.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/merge-inputs.d.ts +34 -0
- package/dist/merge-inputs.d.ts.map +1 -0
- package/dist/merge-inputs.js +50 -0
- package/dist/merge-inputs.js.map +1 -0
- package/dist/oclif.d.ts +2 -0
- package/dist/oclif.d.ts.map +1 -0
- package/dist/oclif.js +2 -0
- package/dist/oclif.js.map +1 -0
- package/dist/promise-queue.d.ts +7 -0
- package/dist/promise-queue.d.ts.map +1 -0
- package/dist/promise-queue.js +24 -0
- package/dist/promise-queue.js.map +1 -0
- package/dist/prompts.d.ts +5 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +7 -0
- package/dist/prompts.js.map +1 -0
- package/dist/read-plugins.d.ts +2 -0
- package/dist/read-plugins.d.ts.map +1 -0
- package/dist/read-plugins.js +23 -0
- package/dist/read-plugins.js.map +1 -0
- package/dist/safe-parse.d.ts +2 -0
- package/dist/safe-parse.d.ts.map +1 -0
- package/dist/safe-parse.js +22 -0
- package/dist/safe-parse.js.map +1 -0
- package/dist/thymian-base-command.d.ts +21 -0
- package/dist/thymian-base-command.d.ts.map +1 -0
- package/dist/thymian-base-command.js +60 -0
- package/dist/thymian-base-command.js.map +1 -0
- package/dist/thymian-config-schema.d.ts +85 -0
- package/dist/thymian-config-schema.d.ts.map +1 -0
- package/dist/thymian-config-schema.js +79 -0
- package/dist/thymian-config-schema.js.map +1 -0
- package/dist/thymian-config-schema.json +116 -0
- package/dist/thymian-config.d.ts +19 -0
- package/dist/thymian-config.d.ts.map +1 -0
- package/dist/thymian-config.js +2 -0
- package/dist/thymian-config.js.map +1 -0
- package/dist/validate-config.d.ts +8 -0
- package/dist/validate-config.d.ts.map +1 -0
- package/dist/validate-config.js +18 -0
- package/dist/validate-config.js.map +1 -0
- package/dist/workflow-outcome.d.ts +21 -0
- package/dist/workflow-outcome.d.ts.map +1 -0
- package/dist/workflow-outcome.js +51 -0
- package/dist/workflow-outcome.js.map +1 -0
- package/dist/yaml.d.ts +2 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +2 -0
- package/dist/yaml.js.map +1 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!-- HEADER:START - Do not remove or modify this section -->
|
|
2
|
+
<div align="center">
|
|
3
|
+
<img src="https://raw.githubusercontent.com/thymianofficial/thymian/main/astro-docs/src/assets/logo.svg" alt="Thymian Logo" width="200"/>
|
|
4
|
+
|
|
5
|
+
# Thymian
|
|
6
|
+
|
|
7
|
+
**Add resilience and HTTP conformance to your API development workflow**
|
|
8
|
+
|
|
9
|
+
[](https://github.com/thymianofficial/thymian/blob/main/LICENSE)
|
|
10
|
+
[](https://github.com/thymianofficial/thymian/actions/workflows/ci.yaml)
|
|
11
|
+
[](https://thymian.dev)
|
|
12
|
+
[](https://discord.gg/TRSwCxbz9f)
|
|
13
|
+
[](https://www.reddit.com/r/ThymianOfficial/)
|
|
14
|
+
[](https://x.com/thymiandev)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
<!-- HEADER:END -->
|
|
18
|
+
|
|
19
|
+
## @thymian/common-cli
|
|
20
|
+
|
|
21
|
+
Shared CLI infrastructure used by the Thymian command-line tool. Provides common command patterns, output formatting, and configuration loading utilities that are shared across all Thymian CLI commands.
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @thymian/common-cli
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> **Getting started with Thymian?** See the [main Thymian package](https://www.npmjs.com/package/thymian) for quick installation and first-run instructions.
|
|
30
|
+
|
|
31
|
+
<!-- FOOTER:START - Do not remove or modify this section -->
|
|
32
|
+
|
|
33
|
+
## 📚 Documentation
|
|
34
|
+
|
|
35
|
+
- **[Getting Started](https://thymian.dev/introduction/getting-started)** - Set up Thymian in minutes
|
|
36
|
+
- **[Documentation](https://thymian.dev)** - Comprehensive guides and API reference
|
|
37
|
+
- **[CLI Reference](https://thymian.dev/references/cli)** - Complete CLI command documentation
|
|
38
|
+
- **[HTTP Rules](https://thymian.dev/guides/http-rules/how-to-use-rules)** - Learn about HTTP conformance validation
|
|
39
|
+
|
|
40
|
+
## 🏢 Enterprise Support
|
|
41
|
+
|
|
42
|
+
Get professional consulting and dedicated support from the creators of Thymian. We offer:
|
|
43
|
+
|
|
44
|
+
- API design and governance strategies
|
|
45
|
+
- HTTP standards compliance auditing
|
|
46
|
+
- Custom plugin development
|
|
47
|
+
- Custom rule development
|
|
48
|
+
- Team training and workshops
|
|
49
|
+
|
|
50
|
+
**[Learn more about Enterprise Support](https://thymian.dev/enterprise)** | **Email: [support@thymian.dev](mailto:support@thymian.dev)**
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
<div align="center">
|
|
55
|
+
|
|
56
|
+
**Shipped with 🌱 by [qupaya](https://qupaya.com)**
|
|
57
|
+
|
|
58
|
+
</div>
|
|
59
|
+
<!-- FOOTER:END -->
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Command, Interfaces } from '@oclif/core';
|
|
2
|
+
import type { CommandError } from '@oclif/core/interfaces';
|
|
3
|
+
import { type Logger, type SpecificationInput, Thymian, type ThymianPlugin, type TrafficInput } from '@thymian/core';
|
|
4
|
+
import { ErrorCache } from './error-cache.js';
|
|
5
|
+
import { Feedback } from './feedback.js';
|
|
6
|
+
import type { ThymianConfig } from './thymian-config.js';
|
|
7
|
+
export type CommandFlags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCliRunCommand)['baseFlags'] & T['flags']>;
|
|
8
|
+
export type CommandArgs<T extends typeof Command> = Interfaces.InferredArgs<T['args']>;
|
|
9
|
+
export declare abstract class BaseCliRunCommand<T extends typeof Command> extends Command {
|
|
10
|
+
static enableJsonFlag: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Whether this command requires API specifications to run.
|
|
13
|
+
* Commands that operate independently of specs (e.g. `serve`, `http-linter:overview`)
|
|
14
|
+
* can set this to `false` to skip the spec resolution chain (Steps C–F).
|
|
15
|
+
*/
|
|
16
|
+
static requiresSpecifications: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Whether this command requires traffic inputs to run.
|
|
19
|
+
* Only `analyze` sets this to `true`. When enabled, traffic is resolved
|
|
20
|
+
* via --traffic flag → config → thymian.traffic-search hook → guidance.
|
|
21
|
+
*/
|
|
22
|
+
static requiresTraffic: boolean;
|
|
23
|
+
static baseFlags: {
|
|
24
|
+
verbose: Interfaces.BooleanFlag<boolean>;
|
|
25
|
+
debug: Interfaces.BooleanFlag<boolean>;
|
|
26
|
+
guidance: Interfaces.BooleanFlag<boolean>;
|
|
27
|
+
"sort-reports-by": Interfaces.OptionFlag<string, Interfaces.CustomOptions>;
|
|
28
|
+
"log-level": Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
29
|
+
config: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
30
|
+
autoload: Interfaces.BooleanFlag<boolean>;
|
|
31
|
+
plugin: Interfaces.OptionFlag<string[], Interfaces.CustomOptions>;
|
|
32
|
+
option: Interfaces.OptionFlag<import("./flags/option-flag.js").PluginOptionOverride[] | undefined, Interfaces.CustomOptions>;
|
|
33
|
+
spec: Interfaces.OptionFlag<SpecificationInput[] | undefined, Interfaces.CustomOptions>;
|
|
34
|
+
traffic: Interfaces.OptionFlag<TrafficInput[] | undefined, Interfaces.CustomOptions>;
|
|
35
|
+
"rule-set": Interfaces.OptionFlag<string[] | undefined, Interfaces.CustomOptions>;
|
|
36
|
+
"rule-severity": Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
37
|
+
timeout: Interfaces.OptionFlag<number, Interfaces.CustomOptions>;
|
|
38
|
+
"idle-timeout": Interfaces.OptionFlag<number, Interfaces.CustomOptions>;
|
|
39
|
+
cwd: Interfaces.OptionFlag<string, Interfaces.CustomOptions>;
|
|
40
|
+
"suppress-feedback": Interfaces.BooleanFlag<boolean>;
|
|
41
|
+
};
|
|
42
|
+
protected flags: CommandFlags<T>;
|
|
43
|
+
protected args: CommandArgs<T>;
|
|
44
|
+
protected logger: Logger;
|
|
45
|
+
protected thymianConfig: ThymianConfig;
|
|
46
|
+
protected thymian: Thymian;
|
|
47
|
+
protected feedback?: Feedback;
|
|
48
|
+
protected errorCache?: ErrorCache;
|
|
49
|
+
/**
|
|
50
|
+
* Whether guidance output is enabled for this command run.
|
|
51
|
+
* Resolved from `--guidance`/`--no-guidance` flag with TTY auto-detection fallback.
|
|
52
|
+
*/
|
|
53
|
+
protected guidanceEnabled: boolean;
|
|
54
|
+
init(): Promise<void>;
|
|
55
|
+
protected catch(err: CommandError): Promise<void>;
|
|
56
|
+
protected printStackTraces(err: unknown): void;
|
|
57
|
+
protected shouldAutoload(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Run the `thymian.spec-search` oclif hook to let plugins discover specification files.
|
|
60
|
+
* Returns results grouped by plugin, each containing typed SpecificationInput[].
|
|
61
|
+
*/
|
|
62
|
+
private runSpecSearch;
|
|
63
|
+
/**
|
|
64
|
+
* Run the `thymian.traffic-search` oclif hook to let plugins discover traffic files.
|
|
65
|
+
* Returns results grouped by plugin, each containing typed TrafficInput[].
|
|
66
|
+
*/
|
|
67
|
+
private runTrafficSearch;
|
|
68
|
+
/**
|
|
69
|
+
* Apply `-o` flag overrides to the loaded Thymian configuration.
|
|
70
|
+
*
|
|
71
|
+
* Each override targets a specific plugin by name and sets a deeply
|
|
72
|
+
* nested property on its `options` object. If the plugin entry does
|
|
73
|
+
* not yet exist in the config it will be created.
|
|
74
|
+
*/
|
|
75
|
+
protected overridePluginOptions(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Re-resolve log level considering the config file.
|
|
78
|
+
* Only applies config.logLevel if no explicit flag was set.
|
|
79
|
+
*/
|
|
80
|
+
private resolveLogLevelWithConfig;
|
|
81
|
+
setThymian(thymian: Thymian): void;
|
|
82
|
+
protected loadPluginModule(nameOrPath: string, isRelativePath?: boolean): Promise<ThymianPlugin>;
|
|
83
|
+
protected registerPlugin(nameOrPath: string, isRelativePath?: boolean): Promise<void>;
|
|
84
|
+
protected addPluginsToThymianConfig(): Promise<void>;
|
|
85
|
+
protected registerPluginsFromConfig(): Promise<void>;
|
|
86
|
+
shouldSuppressFeedback(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Write a guidance message to stderr when guidance is enabled.
|
|
89
|
+
* This is the single choke-point for all guidance output — if
|
|
90
|
+
* `this.guidanceEnabled` is false, the method is a no-op.
|
|
91
|
+
*/
|
|
92
|
+
guidance(message: string): void;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=base-cli-run-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cli-run-command.d.ts","sourceRoot":"","sources":["../src/base-cli-run-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAS,UAAU,EAAgB,MAAM,aAAa,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAGL,KAAK,MAAM,EAEX,KAAK,kBAAkB,EAEvB,OAAO,EAEP,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,OAAO,IAAI,UAAU,CAAC,aAAa,CAC3E,CAAC,OAAO,iBAAiB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CACrD,CAAC;AACF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,OAAO,IAAI,UAAU,CAAC,YAAY,CACzE,CAAC,CAAC,MAAM,CAAC,CACV,CAAC;AAEF,8BAAsB,iBAAiB,CACrC,CAAC,SAAS,OAAO,OAAO,CACxB,SAAQ,OAAO;IACf,OAAgB,cAAc,UAAQ;IAEtC;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,UAAQ;IAErC;;;;OAIG;IACH,MAAM,CAAC,eAAe,UAAS;IAE/B,OAAgB,SAAS;;;;;;;;;;;;;;;;;;MAgFvB;IAEF,SAAS,CAAC,KAAK,EAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,IAAI,EAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,EAAG,aAAa,CAAC;IACxC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC9B,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAElC;;;OAGG;IACH,SAAS,CAAC,eAAe,UAAS;IAEZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAyJlB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA6ChE,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAe9C,SAAS,CAAC,cAAc,IAAI,OAAO;IAQnC;;;OAGG;YACW,aAAa;IAgB3B;;;OAGG;YACW,gBAAgB;IAgB9B;;;;;;OAMG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAiBvC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAyB1B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;cAIzB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,cAAc,UAAQ,GACrB,OAAO,CAAC,aAAa,CAAC;cAwCT,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC;cAeA,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;cA4B1C,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnD,sBAAsB,IAAI,OAAO;IAIxC;;;;OAIG;IACI,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOvC"}
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { inspect } from 'node:util';
|
|
5
|
+
import { Command, Flags, Interfaces, settings, ux } from '@oclif/core';
|
|
6
|
+
import { CLIError } from '@oclif/core/errors';
|
|
7
|
+
import { isLogLevel, isPlugin, TextLogger, Thymian, ThymianBaseError, } from '@thymian/core';
|
|
8
|
+
import { ErrorCache } from './error-cache.js';
|
|
9
|
+
import { Feedback } from './feedback.js';
|
|
10
|
+
import { deepSet, optionFlag } from './flags/option-flag.js';
|
|
11
|
+
import { ruleSetFlag } from './flags/rule-set-flag.js';
|
|
12
|
+
import { specFlag } from './flags/spec-flag.js';
|
|
13
|
+
import { trafficFlag } from './flags/traffic-flag.js';
|
|
14
|
+
import { getConfig } from './get-config.js';
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
export class BaseCliRunCommand extends Command {
|
|
17
|
+
static enableJsonFlag = true;
|
|
18
|
+
/**
|
|
19
|
+
* Whether this command requires API specifications to run.
|
|
20
|
+
* Commands that operate independently of specs (e.g. `serve`, `http-linter:overview`)
|
|
21
|
+
* can set this to `false` to skip the spec resolution chain (Steps C–F).
|
|
22
|
+
*/
|
|
23
|
+
static requiresSpecifications = true;
|
|
24
|
+
/**
|
|
25
|
+
* Whether this command requires traffic inputs to run.
|
|
26
|
+
* Only `analyze` sets this to `true`. When enabled, traffic is resolved
|
|
27
|
+
* via --traffic flag → config → thymian.traffic-search hook → guidance.
|
|
28
|
+
*/
|
|
29
|
+
static requiresTraffic = false;
|
|
30
|
+
static baseFlags = {
|
|
31
|
+
verbose: Flags.boolean({
|
|
32
|
+
default: false,
|
|
33
|
+
description: 'Run thymian in verbose mode.',
|
|
34
|
+
helpGroup: 'BASE',
|
|
35
|
+
}),
|
|
36
|
+
debug: Flags.boolean({
|
|
37
|
+
default: false,
|
|
38
|
+
charAliases: ['d'],
|
|
39
|
+
description: 'Run thymian in debug mode.',
|
|
40
|
+
helpGroup: 'BASE',
|
|
41
|
+
}),
|
|
42
|
+
guidance: Flags.boolean({
|
|
43
|
+
allowNo: true,
|
|
44
|
+
description: 'Show guidance hints on stderr. Defaults to true for TTY, false for non-TTY.',
|
|
45
|
+
helpGroup: 'BASE',
|
|
46
|
+
}),
|
|
47
|
+
['sort-reports-by']: Flags.string({
|
|
48
|
+
description: 'Control how validation findings are grouped in the report.',
|
|
49
|
+
helpGroup: 'BASE',
|
|
50
|
+
options: ['rule', 'endpoint', 'severity'],
|
|
51
|
+
default: 'endpoint',
|
|
52
|
+
}),
|
|
53
|
+
['log-level']: Flags.string({
|
|
54
|
+
description: 'Set log level (trace, debug, info, warn, error, silent). When set to trace, all events are traced.',
|
|
55
|
+
helpGroup: 'BASE',
|
|
56
|
+
options: ['trace', 'debug', 'info', 'warn', 'error', 'silent'],
|
|
57
|
+
}),
|
|
58
|
+
config: Flags.file({
|
|
59
|
+
aliases: ['c'],
|
|
60
|
+
charAliases: ['c'],
|
|
61
|
+
description: 'Path to thymian configuration file.',
|
|
62
|
+
helpGroup: 'BASE',
|
|
63
|
+
}),
|
|
64
|
+
autoload: Flags.boolean({
|
|
65
|
+
allowNo: true,
|
|
66
|
+
description: 'Disable automatic loading and initialization of plugins based on configuration file.',
|
|
67
|
+
helpGroup: 'BASE',
|
|
68
|
+
}),
|
|
69
|
+
plugin: Flags.string({
|
|
70
|
+
multiple: true,
|
|
71
|
+
charAliases: ['p'],
|
|
72
|
+
default: [],
|
|
73
|
+
helpGroup: 'BASE',
|
|
74
|
+
}),
|
|
75
|
+
option: optionFlag(),
|
|
76
|
+
spec: specFlag(),
|
|
77
|
+
traffic: trafficFlag(),
|
|
78
|
+
['rule-set']: ruleSetFlag(),
|
|
79
|
+
['rule-severity']: Flags.string({
|
|
80
|
+
description: 'Set the minimum rule severity threshold for rule loading (off, error, warn, hint). Only rules at or above this severity are loaded.',
|
|
81
|
+
helpGroup: 'BASE',
|
|
82
|
+
options: ['off', 'error', 'warn', 'hint'],
|
|
83
|
+
}),
|
|
84
|
+
timeout: Flags.integer({
|
|
85
|
+
default: Thymian.DEFAULT_TIMEOUT,
|
|
86
|
+
charAliases: ['t'],
|
|
87
|
+
description: 'Set the duration in ms to wait for anything that happens in Thymian.',
|
|
88
|
+
helpGroup: 'BASE',
|
|
89
|
+
}),
|
|
90
|
+
['idle-timeout']: Flags.integer({
|
|
91
|
+
description: 'Set the duration in ms to waited for events and actions when closing Thymian.',
|
|
92
|
+
helpGroup: 'BASE',
|
|
93
|
+
default: Thymian.DEFAULT_IDLE_TIMEOUT,
|
|
94
|
+
}),
|
|
95
|
+
cwd: Flags.string({
|
|
96
|
+
default: process.cwd(),
|
|
97
|
+
description: 'Set current working directory.',
|
|
98
|
+
}),
|
|
99
|
+
['suppress-feedback']: Flags.boolean({
|
|
100
|
+
default: false,
|
|
101
|
+
description: 'Suppress feedback messages from Thymian.',
|
|
102
|
+
helpGroup: 'BASE',
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
flags;
|
|
106
|
+
args;
|
|
107
|
+
logger;
|
|
108
|
+
thymianConfig;
|
|
109
|
+
thymian;
|
|
110
|
+
feedback;
|
|
111
|
+
errorCache;
|
|
112
|
+
/**
|
|
113
|
+
* Whether guidance output is enabled for this command run.
|
|
114
|
+
* Resolved from `--guidance`/`--no-guidance` flag with TTY auto-detection fallback.
|
|
115
|
+
*/
|
|
116
|
+
guidanceEnabled = false;
|
|
117
|
+
async init() {
|
|
118
|
+
await super.init();
|
|
119
|
+
this.errorCache = ErrorCache.forCommand(this);
|
|
120
|
+
const { args, flags } = await this.parse({
|
|
121
|
+
flags: this.ctor.flags,
|
|
122
|
+
baseFlags: super.ctor.baseFlags,
|
|
123
|
+
enableJsonFlag: this.ctor.enableJsonFlag,
|
|
124
|
+
args: this.ctor.args,
|
|
125
|
+
strict: this.ctor.strict,
|
|
126
|
+
});
|
|
127
|
+
this.flags = flags;
|
|
128
|
+
this.args = args;
|
|
129
|
+
this.flags.debug = settings.debug || this.flags.debug;
|
|
130
|
+
this.guidanceEnabled = this.flags.guidance ?? Boolean(process.stderr.isTTY);
|
|
131
|
+
this.feedback = Feedback.forCommand(this);
|
|
132
|
+
// --- Config Resolution Chain ---
|
|
133
|
+
// Step A+B: Load config from --config flag, well-known file, or defaultConfig
|
|
134
|
+
this.thymianConfig = await getConfig({
|
|
135
|
+
configPath: this.flags.config,
|
|
136
|
+
cwd: this.flags.cwd,
|
|
137
|
+
});
|
|
138
|
+
this.overridePluginOptions();
|
|
139
|
+
// Step C: --spec flag overrides config specifications
|
|
140
|
+
if (this.flags.spec && this.flags.spec.length > 0) {
|
|
141
|
+
this.thymianConfig = {
|
|
142
|
+
...this.thymianConfig,
|
|
143
|
+
specifications: this.flags.spec,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Step D+E+F: If no specifications at this point, ask plugins to search
|
|
147
|
+
// Only enforced for commands that require specifications.
|
|
148
|
+
const requiresSpecs = this.ctor
|
|
149
|
+
.requiresSpecifications;
|
|
150
|
+
if (requiresSpecs &&
|
|
151
|
+
(!this.thymianConfig.specifications ||
|
|
152
|
+
this.thymianConfig.specifications.length === 0)) {
|
|
153
|
+
const discovered = await this.runSpecSearch();
|
|
154
|
+
if (discovered.length > 0) {
|
|
155
|
+
// Step E: Specifications found — suggest user actions and exit
|
|
156
|
+
const fileList = discovered
|
|
157
|
+
.flatMap((d) => d.specifications.map((s) => ` - ${s.location}`))
|
|
158
|
+
.join('\n');
|
|
159
|
+
const firstSpec = discovered[0].specifications[0];
|
|
160
|
+
ux.stderr(`No specification configured. The following specification files were detected:\n\n${fileList}\n`);
|
|
161
|
+
ux.stderr('Rerun with --spec to use a detected file, for example:\n');
|
|
162
|
+
ux.stderr(` $ thymian ${this.id} --spec ${formatSpecInput(firstSpec)}\n`);
|
|
163
|
+
ux.stderr('Or generate a reusable config:\n');
|
|
164
|
+
ux.stderr(` $ thymian generate config --for-spec ${formatSpecInput(firstSpec)}\n`);
|
|
165
|
+
this.exit(2);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Step F: No specifications found anywhere
|
|
169
|
+
ux.stderr('No specification found. Provide a specification with --spec or create a configuration file.\n');
|
|
170
|
+
ux.stderr(' $ thymian generate config\n');
|
|
171
|
+
this.exit(2);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// --- Traffic Resolution Chain ---
|
|
175
|
+
// --traffic flag overrides config traffic
|
|
176
|
+
if (this.flags.traffic && this.flags.traffic.length > 0) {
|
|
177
|
+
this.thymianConfig = {
|
|
178
|
+
...this.thymianConfig,
|
|
179
|
+
traffic: this.flags.traffic,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const requiresTraffic = this.ctor
|
|
183
|
+
.requiresTraffic;
|
|
184
|
+
if (requiresTraffic &&
|
|
185
|
+
(!this.thymianConfig.traffic || this.thymianConfig.traffic.length === 0)) {
|
|
186
|
+
const discovered = await this.runTrafficSearch();
|
|
187
|
+
if (discovered.length > 0) {
|
|
188
|
+
const fileList = discovered
|
|
189
|
+
.flatMap((d) => d.traffic.map((t) => ` * ${formatTrafficInput(t)}`))
|
|
190
|
+
.join('\n');
|
|
191
|
+
const firstTraffic = discovered[0].traffic[0];
|
|
192
|
+
ux.stderr(`No traffic configured. The following traffic files were detected:\n\n${fileList}\n`);
|
|
193
|
+
ux.stderr('Rerun with --traffic to use a detected file, for example:\n');
|
|
194
|
+
ux.stderr(` $ thymian ${this.id} --traffic ${formatTrafficInput(firstTraffic)}\n`);
|
|
195
|
+
this.exit(2);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
ux.stderr('No traffic found. Provide traffic with --traffic or add it to your configuration file.\n');
|
|
199
|
+
this.exit(2);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const logLevel = this.resolveLogLevelWithConfig();
|
|
203
|
+
this.logger = new TextLogger('thymian', logLevel);
|
|
204
|
+
this.logger.info('Configuration loaded.');
|
|
205
|
+
const specCount = this.thymianConfig.specifications?.length ?? 0;
|
|
206
|
+
if (specCount > 0) {
|
|
207
|
+
this.logger.info(`Resolved ${specCount} specification(s).`);
|
|
208
|
+
}
|
|
209
|
+
this.thymian = new Thymian(this.logger.child('@thymian/core'), {
|
|
210
|
+
timeout: this.flags.timeout,
|
|
211
|
+
cwd: this.flags.cwd,
|
|
212
|
+
idleTimeout: this.flags['idle-timeout'],
|
|
213
|
+
sortReportsBy: this.flags['sort-reports-by'],
|
|
214
|
+
});
|
|
215
|
+
this.logger.info('Thymian instance created.');
|
|
216
|
+
if (this.shouldAutoload()) {
|
|
217
|
+
this.debug('Autoloading Thymian plugins.');
|
|
218
|
+
this.logger.info('Autoloading plugins from configuration...');
|
|
219
|
+
await this.addPluginsToThymianConfig();
|
|
220
|
+
await this.registerPluginsFromConfig();
|
|
221
|
+
}
|
|
222
|
+
await this.feedback?.run();
|
|
223
|
+
}
|
|
224
|
+
async catch(err) {
|
|
225
|
+
await this.feedback?.error();
|
|
226
|
+
const versionDetails = this.config.versionDetails;
|
|
227
|
+
const pluginVersions = Object.entries(versionDetails.pluginVersions ?? {})
|
|
228
|
+
.filter(([name]) => !name.startsWith('@oclif'))
|
|
229
|
+
.map(([name, version]) => ({ name, version: version.version }));
|
|
230
|
+
await this.errorCache?.write({
|
|
231
|
+
name: err.name,
|
|
232
|
+
message: err.message,
|
|
233
|
+
commandName: this.id ?? 'unknown command',
|
|
234
|
+
timestamp: Date.now(),
|
|
235
|
+
cause: err.cause,
|
|
236
|
+
stack: err.stack,
|
|
237
|
+
argv: process.argv,
|
|
238
|
+
version: {
|
|
239
|
+
architecture: versionDetails.architecture,
|
|
240
|
+
cliVersion: versionDetails.cliVersion,
|
|
241
|
+
nodeVersion: versionDetails.nodeVersion,
|
|
242
|
+
osVersion: versionDetails.osVersion,
|
|
243
|
+
},
|
|
244
|
+
pluginVersions,
|
|
245
|
+
});
|
|
246
|
+
if (err instanceof ThymianBaseError) {
|
|
247
|
+
const cliError = new CLIError(err.message, {
|
|
248
|
+
suggestions: err.options.suggestions,
|
|
249
|
+
exit: err.options.exitCode,
|
|
250
|
+
code: err.options.code,
|
|
251
|
+
});
|
|
252
|
+
cliError.name = err.name;
|
|
253
|
+
Object.defineProperty(cliError, 'ref', { value: err.options.ref });
|
|
254
|
+
if (settings.debug) {
|
|
255
|
+
this.printStackTraces(err);
|
|
256
|
+
}
|
|
257
|
+
return super.catch(cliError);
|
|
258
|
+
}
|
|
259
|
+
return super.catch(err);
|
|
260
|
+
}
|
|
261
|
+
printStackTraces(err) {
|
|
262
|
+
if (err instanceof Error) {
|
|
263
|
+
if (this.jsonEnabled() && err.cause) {
|
|
264
|
+
this.logJson(this.toErrorJson(err.cause));
|
|
265
|
+
}
|
|
266
|
+
else if (err.cause) {
|
|
267
|
+
ux.stderr(err.cause instanceof Error
|
|
268
|
+
? String(err.cause)
|
|
269
|
+
: inspect(err.cause, { depth: 3 }));
|
|
270
|
+
}
|
|
271
|
+
this.printStackTraces(err.cause);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
shouldAutoload() {
|
|
275
|
+
if ('autoload' in this.flags) {
|
|
276
|
+
return this.flags.autoload;
|
|
277
|
+
}
|
|
278
|
+
return this.thymianConfig.autoload ?? true;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Run the `thymian.spec-search` oclif hook to let plugins discover specification files.
|
|
282
|
+
* Returns results grouped by plugin, each containing typed SpecificationInput[].
|
|
283
|
+
*/
|
|
284
|
+
async runSpecSearch() {
|
|
285
|
+
const hookResults = await this.config.runHook('thymian.spec-search', {
|
|
286
|
+
cwd: this.flags.cwd,
|
|
287
|
+
});
|
|
288
|
+
const results = [];
|
|
289
|
+
for (const success of hookResults.successes) {
|
|
290
|
+
const result = success.result;
|
|
291
|
+
if (result.specifications.length > 0) {
|
|
292
|
+
results.push(result);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return results;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Run the `thymian.traffic-search` oclif hook to let plugins discover traffic files.
|
|
299
|
+
* Returns results grouped by plugin, each containing typed TrafficInput[].
|
|
300
|
+
*/
|
|
301
|
+
async runTrafficSearch() {
|
|
302
|
+
const hookResults = await this.config.runHook('thymian.traffic-search', {
|
|
303
|
+
cwd: this.flags.cwd,
|
|
304
|
+
});
|
|
305
|
+
const results = [];
|
|
306
|
+
for (const success of hookResults.successes) {
|
|
307
|
+
const result = success.result;
|
|
308
|
+
if (result.traffic.length > 0) {
|
|
309
|
+
results.push(result);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return results;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Apply `-o` flag overrides to the loaded Thymian configuration.
|
|
316
|
+
*
|
|
317
|
+
* Each override targets a specific plugin by name and sets a deeply
|
|
318
|
+
* nested property on its `options` object. If the plugin entry does
|
|
319
|
+
* not yet exist in the config it will be created.
|
|
320
|
+
*/
|
|
321
|
+
overridePluginOptions() {
|
|
322
|
+
if (!this.flags.option?.length) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
for (const override of this.flags.option) {
|
|
326
|
+
this.thymianConfig.plugins[override.pluginName] ??= {};
|
|
327
|
+
const pluginConfig = this.thymianConfig.plugins[override.pluginName];
|
|
328
|
+
pluginConfig.options ??= {};
|
|
329
|
+
deepSet(pluginConfig.options, override.path, override.value);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Re-resolve log level considering the config file.
|
|
334
|
+
* Only applies config.logLevel if no explicit flag was set.
|
|
335
|
+
*/
|
|
336
|
+
resolveLogLevelWithConfig() {
|
|
337
|
+
const flagLevel = this.flags['log-level'];
|
|
338
|
+
if (flagLevel && isLogLevel(flagLevel)) {
|
|
339
|
+
return flagLevel;
|
|
340
|
+
}
|
|
341
|
+
if (this.flags.debug) {
|
|
342
|
+
return 'debug';
|
|
343
|
+
}
|
|
344
|
+
if (this.flags.verbose) {
|
|
345
|
+
return 'info';
|
|
346
|
+
}
|
|
347
|
+
if (this.thymianConfig.logLevel &&
|
|
348
|
+
isLogLevel(this.thymianConfig.logLevel)) {
|
|
349
|
+
return this.thymianConfig.logLevel;
|
|
350
|
+
}
|
|
351
|
+
return 'warn';
|
|
352
|
+
}
|
|
353
|
+
setThymian(thymian) {
|
|
354
|
+
this.thymian = thymian;
|
|
355
|
+
}
|
|
356
|
+
async loadPluginModule(nameOrPath, isRelativePath = false) {
|
|
357
|
+
const options = this.thymianConfig.plugins[nameOrPath] ?? {};
|
|
358
|
+
const location = isRelativePath || typeof options.path === 'string'
|
|
359
|
+
? resolve(this.flags.cwd, options.path ?? nameOrPath)
|
|
360
|
+
: nameOrPath;
|
|
361
|
+
let pluginModule;
|
|
362
|
+
this.debug('Load plugin module from location "%s".', location);
|
|
363
|
+
try {
|
|
364
|
+
const resolvedPath = require.resolve(location);
|
|
365
|
+
pluginModule = (await import(pathToFileURL(resolvedPath).href)).default;
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
this.logger.debug('Failed to load plugin module from "%s": %s', location, inspect(e));
|
|
369
|
+
throw new ThymianBaseError(`Failed to load plugin module "${options.path ?? nameOrPath}".`, {
|
|
370
|
+
name: 'PluginLoadError',
|
|
371
|
+
cause: e,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
if (!isPlugin(pluginModule)) {
|
|
375
|
+
throw new CLIError(`"${options.path ?? nameOrPath}" does not default export a valid Thymian plugin.`);
|
|
376
|
+
}
|
|
377
|
+
return pluginModule;
|
|
378
|
+
}
|
|
379
|
+
async registerPlugin(nameOrPath, isRelativePath = false) {
|
|
380
|
+
const pluginModule = await this.loadPluginModule(nameOrPath, isRelativePath);
|
|
381
|
+
const config = this.thymianConfig.plugins[pluginModule.name] ?? {};
|
|
382
|
+
if (typeof config.autoload === 'boolean' && !config.autoload) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
this.thymian.register(pluginModule, config.options);
|
|
386
|
+
}
|
|
387
|
+
async addPluginsToThymianConfig() {
|
|
388
|
+
for (const plugin of this.flags.plugin) {
|
|
389
|
+
this.debug('Adding plugin from flag "%s" to Thymian config.', plugin);
|
|
390
|
+
const isPathPlugin = isAbsolute(plugin) ||
|
|
391
|
+
plugin.startsWith('./') ||
|
|
392
|
+
plugin.startsWith('../');
|
|
393
|
+
if (!isPathPlugin) {
|
|
394
|
+
this.debug('Load plugin "%s" as npm package or absolute path.', plugin);
|
|
395
|
+
const pluginModule = await this.loadPluginModule(plugin, false);
|
|
396
|
+
this.thymianConfig.plugins[pluginModule.name] ??= {};
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
this.debug(`Load plugin %s from relative path.`, plugin);
|
|
400
|
+
const pluginModule = await this.loadPluginModule(plugin, true);
|
|
401
|
+
this.thymianConfig.plugins[pluginModule.name] = {
|
|
402
|
+
...(this.thymianConfig.plugins[pluginModule.name] ?? {}),
|
|
403
|
+
path: plugin,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
async registerPluginsFromConfig() {
|
|
409
|
+
for (const name of Object.keys(this.thymianConfig.plugins)) {
|
|
410
|
+
await this.registerPlugin(name);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
shouldSuppressFeedback() {
|
|
414
|
+
return this.flags['suppress-feedback'];
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Write a guidance message to stderr when guidance is enabled.
|
|
418
|
+
* This is the single choke-point for all guidance output — if
|
|
419
|
+
* `this.guidanceEnabled` is false, the method is a no-op.
|
|
420
|
+
*/
|
|
421
|
+
guidance(message) {
|
|
422
|
+
if (!this.guidanceEnabled) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
ux.stderr(message);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Format a SpecificationInput as `type:location` for display and --spec flag suggestions.
|
|
430
|
+
*/
|
|
431
|
+
function formatSpecInput(spec) {
|
|
432
|
+
return `${spec.type}:${spec.location}`;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Format a TrafficInput as `type:location` for display and --traffic flag suggestions.
|
|
436
|
+
*/
|
|
437
|
+
function formatTrafficInput(traffic) {
|
|
438
|
+
return `${traffic.type}:${traffic.location}`;
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=base-cli-run-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cli-run-command.js","sourceRoot":"","sources":["../src/base-cli-run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-config.d.ts","sourceRoot":"","sources":["../src/default-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,aAAa,EAAE,aAyB3B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const defaultConfig = {
|
|
2
|
+
specifications: [],
|
|
3
|
+
traffic: [],
|
|
4
|
+
ruleSets: ['@thymian/rules-rfc-9110'],
|
|
5
|
+
ruleSeverity: 'error',
|
|
6
|
+
rules: {},
|
|
7
|
+
plugins: {
|
|
8
|
+
'@thymian/plugin-http-linter': {},
|
|
9
|
+
'@thymian/plugin-openapi': {
|
|
10
|
+
options: {
|
|
11
|
+
descriptions: [],
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
'@thymian/plugin-request-dispatcher': {},
|
|
15
|
+
'@thymian/plugin-sampler': {},
|
|
16
|
+
'@thymian/plugin-reporter': {
|
|
17
|
+
options: {
|
|
18
|
+
formatters: {
|
|
19
|
+
text: {},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
'@thymian/plugin-http-tester': {},
|
|
24
|
+
'@thymian/plugin-http-analyzer': {},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=default-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-config.js","sourceRoot":"","sources":["../src/default-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,CAAC,yBAAyB,CAAC;IACrC,YAAY,EAAE,OAAO;IACrB,KAAK,EAAE,EAAE;IACT,OAAO,EAAE;QACP,6BAA6B,EAAE,EAAE;QACjC,yBAAyB,EAAE;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,EAAE;aACjB;SACF;QACD,oCAAoC,EAAE,EAAE;QACxC,yBAAyB,EAAE,EAAE;QAC7B,0BAA0B,EAAE;YAC1B,OAAO,EAAE;gBACP,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE;iBACT;aACF;SACF;QACD,6BAA6B,EAAE,EAAE;QACjC,+BAA+B,EAAE,EAAE;KACpC;CACF,CAAC"}
|