@thymian/common-cli 0.1.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.
Files changed (111) hide show
  1. package/README.md +11 -0
  2. package/dist/base-cli-run-command.d.ts +81 -0
  3. package/dist/base-cli-run-command.d.ts.map +1 -0
  4. package/dist/base-cli-run-command.js +405 -0
  5. package/dist/base-cli-run-command.js.map +1 -0
  6. package/dist/default-config.d.ts +3 -0
  7. package/dist/default-config.d.ts.map +1 -0
  8. package/dist/default-config.js +27 -0
  9. package/dist/default-config.js.map +1 -0
  10. package/dist/error-cache.d.ts +31 -0
  11. package/dist/error-cache.d.ts.map +1 -0
  12. package/dist/error-cache.js +36 -0
  13. package/dist/error-cache.js.map +1 -0
  14. package/dist/feedback.d.ts +13 -0
  15. package/dist/feedback.d.ts.map +1 -0
  16. package/dist/feedback.js +30 -0
  17. package/dist/feedback.js.map +1 -0
  18. package/dist/flags/filter-flag.d.ts +20 -0
  19. package/dist/flags/filter-flag.d.ts.map +1 -0
  20. package/dist/flags/filter-flag.js +63 -0
  21. package/dist/flags/filter-flag.js.map +1 -0
  22. package/dist/flags/option-flag.d.ts +39 -0
  23. package/dist/flags/option-flag.d.ts.map +1 -0
  24. package/dist/flags/option-flag.js +144 -0
  25. package/dist/flags/option-flag.js.map +1 -0
  26. package/dist/flags/rule-set-flag.d.ts +5 -0
  27. package/dist/flags/rule-set-flag.d.ts.map +1 -0
  28. package/dist/flags/rule-set-flag.js +9 -0
  29. package/dist/flags/rule-set-flag.js.map +1 -0
  30. package/dist/flags/spec-flag.d.ts +11 -0
  31. package/dist/flags/spec-flag.d.ts.map +1 -0
  32. package/dist/flags/spec-flag.js +25 -0
  33. package/dist/flags/spec-flag.js.map +1 -0
  34. package/dist/flags/traffic-flag.d.ts +10 -0
  35. package/dist/flags/traffic-flag.d.ts.map +1 -0
  36. package/dist/flags/traffic-flag.js +24 -0
  37. package/dist/flags/traffic-flag.js.map +1 -0
  38. package/dist/get-config.d.ts +20 -0
  39. package/dist/get-config.d.ts.map +1 -0
  40. package/dist/get-config.js +82 -0
  41. package/dist/get-config.js.map +1 -0
  42. package/dist/hooks/feedback-hook.d.ts +9 -0
  43. package/dist/hooks/feedback-hook.d.ts.map +1 -0
  44. package/dist/hooks/feedback-hook.js +2 -0
  45. package/dist/hooks/feedback-hook.js.map +1 -0
  46. package/dist/hooks/plugin-init-hook.d.ts +20 -0
  47. package/dist/hooks/plugin-init-hook.d.ts.map +1 -0
  48. package/dist/hooks/plugin-init-hook.js +2 -0
  49. package/dist/hooks/plugin-init-hook.js.map +1 -0
  50. package/dist/hooks/spec-search-hook.d.ts +18 -0
  51. package/dist/hooks/spec-search-hook.d.ts.map +1 -0
  52. package/dist/hooks/spec-search-hook.js +2 -0
  53. package/dist/hooks/spec-search-hook.js.map +1 -0
  54. package/dist/hooks/traffic-search-hook.d.ts +18 -0
  55. package/dist/hooks/traffic-search-hook.d.ts.map +1 -0
  56. package/dist/hooks/traffic-search-hook.js +2 -0
  57. package/dist/hooks/traffic-search-hook.js.map +1 -0
  58. package/dist/index.d.ts +20 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +20 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/merge-inputs.d.ts +34 -0
  63. package/dist/merge-inputs.d.ts.map +1 -0
  64. package/dist/merge-inputs.js +50 -0
  65. package/dist/merge-inputs.js.map +1 -0
  66. package/dist/oclif.d.ts +2 -0
  67. package/dist/oclif.d.ts.map +1 -0
  68. package/dist/oclif.js +2 -0
  69. package/dist/oclif.js.map +1 -0
  70. package/dist/promise-queue.d.ts +7 -0
  71. package/dist/promise-queue.d.ts.map +1 -0
  72. package/dist/promise-queue.js +24 -0
  73. package/dist/promise-queue.js.map +1 -0
  74. package/dist/prompts.d.ts +5 -0
  75. package/dist/prompts.d.ts.map +1 -0
  76. package/dist/prompts.js +7 -0
  77. package/dist/prompts.js.map +1 -0
  78. package/dist/read-plugins.d.ts +2 -0
  79. package/dist/read-plugins.d.ts.map +1 -0
  80. package/dist/read-plugins.js +23 -0
  81. package/dist/read-plugins.js.map +1 -0
  82. package/dist/safe-parse.d.ts +2 -0
  83. package/dist/safe-parse.d.ts.map +1 -0
  84. package/dist/safe-parse.js +22 -0
  85. package/dist/safe-parse.js.map +1 -0
  86. package/dist/thymian-base-command.d.ts +21 -0
  87. package/dist/thymian-base-command.d.ts.map +1 -0
  88. package/dist/thymian-base-command.js +60 -0
  89. package/dist/thymian-base-command.js.map +1 -0
  90. package/dist/thymian-config-schema.d.ts +85 -0
  91. package/dist/thymian-config-schema.d.ts.map +1 -0
  92. package/dist/thymian-config-schema.js +79 -0
  93. package/dist/thymian-config-schema.js.map +1 -0
  94. package/dist/thymian-config-schema.json +116 -0
  95. package/dist/thymian-config.d.ts +19 -0
  96. package/dist/thymian-config.d.ts.map +1 -0
  97. package/dist/thymian-config.js +2 -0
  98. package/dist/thymian-config.js.map +1 -0
  99. package/dist/validate-config.d.ts +8 -0
  100. package/dist/validate-config.d.ts.map +1 -0
  101. package/dist/validate-config.js +18 -0
  102. package/dist/validate-config.js.map +1 -0
  103. package/dist/workflow-outcome.d.ts +5 -0
  104. package/dist/workflow-outcome.d.ts.map +1 -0
  105. package/dist/workflow-outcome.js +21 -0
  106. package/dist/workflow-outcome.js.map +1 -0
  107. package/dist/yaml.d.ts +2 -0
  108. package/dist/yaml.d.ts.map +1 -0
  109. package/dist/yaml.js +2 -0
  110. package/dist/yaml.js.map +1 -0
  111. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # Thymian
2
+
3
+ Add resilience and HTTP conformance to your API development workflow. Thymian is a lightweight, language-agnostic library that helps you build robust APIs.
4
+
5
+ ## @thymian/cli-common
6
+
7
+ Shared utilities and helpers for Thymian CLI tools.
8
+
9
+ ## Documentation
10
+
11
+ For comprehensive documentation, visit [Thymian Documentation](https://thymian.dev/).
@@ -0,0 +1,81 @@
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
+ "log-level": Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
27
+ config: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
28
+ autoload: Interfaces.BooleanFlag<boolean>;
29
+ plugin: Interfaces.OptionFlag<string[], Interfaces.CustomOptions>;
30
+ option: Interfaces.OptionFlag<import("./flags/option-flag.js").PluginOptionOverride[] | undefined, Interfaces.CustomOptions>;
31
+ spec: Interfaces.OptionFlag<SpecificationInput[] | undefined, Interfaces.CustomOptions>;
32
+ traffic: Interfaces.OptionFlag<TrafficInput[] | undefined, Interfaces.CustomOptions>;
33
+ "rule-set": Interfaces.OptionFlag<string[] | undefined, Interfaces.CustomOptions>;
34
+ "rule-severity": Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
35
+ timeout: Interfaces.OptionFlag<number, Interfaces.CustomOptions>;
36
+ "idle-timeout": Interfaces.OptionFlag<number, Interfaces.CustomOptions>;
37
+ cwd: Interfaces.OptionFlag<string, Interfaces.CustomOptions>;
38
+ "suppress-feedback": Interfaces.BooleanFlag<boolean>;
39
+ };
40
+ protected flags: CommandFlags<T>;
41
+ protected args: CommandArgs<T>;
42
+ protected logger: Logger;
43
+ protected thymianConfig: ThymianConfig;
44
+ protected thymian: Thymian;
45
+ protected feedback: Feedback;
46
+ protected errorCache: ErrorCache;
47
+ init(): Promise<void>;
48
+ protected catch(err: CommandError): Promise<void>;
49
+ protected printStackTraces(err: unknown): void;
50
+ protected shouldAutoload(): boolean;
51
+ /**
52
+ * Run the `thymian.spec-search` oclif hook to let plugins discover specification files.
53
+ * Returns results grouped by plugin, each containing typed SpecificationInput[].
54
+ */
55
+ private runSpecSearch;
56
+ /**
57
+ * Run the `thymian.traffic-search` oclif hook to let plugins discover traffic files.
58
+ * Returns results grouped by plugin, each containing typed TrafficInput[].
59
+ */
60
+ private runTrafficSearch;
61
+ /**
62
+ * Apply `-o` flag overrides to the loaded Thymian configuration.
63
+ *
64
+ * Each override targets a specific plugin by name and sets a deeply
65
+ * nested property on its `options` object. If the plugin entry does
66
+ * not yet exist in the config it will be created.
67
+ */
68
+ protected overridePluginOptions(): void;
69
+ /**
70
+ * Re-resolve log level considering the config file.
71
+ * Only applies config.logLevel if no explicit flag was set.
72
+ */
73
+ private resolveLogLevelWithConfig;
74
+ setThymian(thymian: Thymian): void;
75
+ protected loadPluginModule(nameOrPath: string, isRelativePath?: boolean): Promise<ThymianPlugin>;
76
+ protected registerPlugin(nameOrPath: string, isRelativePath?: boolean): Promise<void>;
77
+ protected addPluginsToThymianConfig(): Promise<void>;
78
+ protected registerPluginsFromConfig(): Promise<void>;
79
+ shouldSuppressFeedback(): boolean;
80
+ }
81
+ //# 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":"AAIA,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;;;;;;;;;;;;;;;;MAoEvB;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,EAAG,QAAQ,CAAC;IAC9B,SAAS,CAAC,UAAU,EAAG,UAAU,CAAC;IAEZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAiJlB,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;cA4BT,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;CAGzC"}
@@ -0,0 +1,405 @@
1
+ import { createRequire } from 'node:module';
2
+ import { isAbsolute, join } from 'node:path';
3
+ import { inspect } from 'node:util';
4
+ import { Command, Flags, Interfaces, settings, ux } from '@oclif/core';
5
+ import { CLIError } from '@oclif/core/errors';
6
+ import { isLogLevel, isPlugin, TextLogger, Thymian, ThymianBaseError, } from '@thymian/core';
7
+ import { ErrorCache } from './error-cache.js';
8
+ import { Feedback } from './feedback.js';
9
+ import { deepSet, optionFlag } from './flags/option-flag.js';
10
+ import { ruleSetFlag } from './flags/rule-set-flag.js';
11
+ import { specFlag } from './flags/spec-flag.js';
12
+ import { trafficFlag } from './flags/traffic-flag.js';
13
+ import { getConfig } from './get-config.js';
14
+ const require = createRequire(import.meta.url);
15
+ export class BaseCliRunCommand extends Command {
16
+ static enableJsonFlag = true;
17
+ /**
18
+ * Whether this command requires API specifications to run.
19
+ * Commands that operate independently of specs (e.g. `serve`, `http-linter:overview`)
20
+ * can set this to `false` to skip the spec resolution chain (Steps C–F).
21
+ */
22
+ static requiresSpecifications = true;
23
+ /**
24
+ * Whether this command requires traffic inputs to run.
25
+ * Only `analyze` sets this to `true`. When enabled, traffic is resolved
26
+ * via --traffic flag → config → thymian.traffic-search hook → guidance.
27
+ */
28
+ static requiresTraffic = false;
29
+ static baseFlags = {
30
+ verbose: Flags.boolean({
31
+ default: false,
32
+ description: 'Run thymian in verbose mode.',
33
+ helpGroup: 'BASE',
34
+ }),
35
+ debug: Flags.boolean({
36
+ default: false,
37
+ charAliases: ['d'],
38
+ description: 'Run thymian in debug mode.',
39
+ helpGroup: 'BASE',
40
+ }),
41
+ ['log-level']: Flags.string({
42
+ description: 'Set log level (trace, debug, info, warn, error, silent). When set to trace, all events are traced.',
43
+ helpGroup: 'BASE',
44
+ options: ['trace', 'debug', 'info', 'warn', 'error', 'silent'],
45
+ }),
46
+ config: Flags.file({
47
+ aliases: ['c'],
48
+ charAliases: ['c'],
49
+ description: 'Path to thymian configuration file.',
50
+ helpGroup: 'BASE',
51
+ }),
52
+ autoload: Flags.boolean({
53
+ allowNo: true,
54
+ description: 'Disable automatic loading and initialization of plugins based on configuration file.',
55
+ helpGroup: 'BASE',
56
+ }),
57
+ plugin: Flags.string({
58
+ multiple: true,
59
+ charAliases: ['p'],
60
+ default: [],
61
+ helpGroup: 'BASE',
62
+ }),
63
+ option: optionFlag(),
64
+ spec: specFlag(),
65
+ traffic: trafficFlag(),
66
+ ['rule-set']: ruleSetFlag(),
67
+ ['rule-severity']: Flags.string({
68
+ description: 'Set the minimum rule severity threshold for rule loading (off, error, warn, hint). Only rules at or above this severity are loaded.',
69
+ helpGroup: 'BASE',
70
+ options: ['off', 'error', 'warn', 'hint'],
71
+ }),
72
+ timeout: Flags.integer({
73
+ default: Thymian.DEFAULT_TIMEOUT,
74
+ charAliases: ['t'],
75
+ description: 'Set the duration in ms to wait for anything that happens in Thymian.',
76
+ helpGroup: 'BASE',
77
+ }),
78
+ ['idle-timeout']: Flags.integer({
79
+ description: 'Set the duration in ms to waited for events and actions when closing Thymian.',
80
+ helpGroup: 'BASE',
81
+ default: Thymian.DEFAULT_IDLE_TIMEOUT,
82
+ }),
83
+ cwd: Flags.string({
84
+ default: process.cwd(),
85
+ description: 'Set current working directory.',
86
+ }),
87
+ ['suppress-feedback']: Flags.boolean({
88
+ default: false,
89
+ description: 'Suppress feedback messages from Thymian.',
90
+ helpGroup: 'BASE',
91
+ }),
92
+ };
93
+ flags;
94
+ args;
95
+ logger;
96
+ thymianConfig;
97
+ thymian;
98
+ feedback;
99
+ errorCache;
100
+ async init() {
101
+ await super.init();
102
+ const { args, flags } = await this.parse({
103
+ flags: this.ctor.flags,
104
+ baseFlags: super.ctor.baseFlags,
105
+ enableJsonFlag: this.ctor.enableJsonFlag,
106
+ args: this.ctor.args,
107
+ strict: this.ctor.strict,
108
+ });
109
+ this.flags = flags;
110
+ this.args = args;
111
+ this.flags.debug = settings.debug || this.flags.debug;
112
+ this.feedback = Feedback.forCommand(this);
113
+ this.errorCache = ErrorCache.forCommand(this);
114
+ // --- Config Resolution Chain ---
115
+ // Step A+B: Load config from --config flag, well-known file, or defaultConfig
116
+ this.thymianConfig = await getConfig({
117
+ configPath: this.flags.config,
118
+ cwd: this.flags.cwd,
119
+ });
120
+ this.overridePluginOptions();
121
+ // Step C: --spec flag overrides config specifications
122
+ if (this.flags.spec && this.flags.spec.length > 0) {
123
+ this.thymianConfig = {
124
+ ...this.thymianConfig,
125
+ specifications: this.flags.spec,
126
+ };
127
+ }
128
+ // Step D+E+F: If no specifications at this point, ask plugins to search
129
+ // Only enforced for commands that require specifications.
130
+ const requiresSpecs = this.ctor
131
+ .requiresSpecifications;
132
+ if (requiresSpecs &&
133
+ (!this.thymianConfig.specifications ||
134
+ this.thymianConfig.specifications.length === 0)) {
135
+ const discovered = await this.runSpecSearch();
136
+ if (discovered.length > 0) {
137
+ // Step E: Specifications found — suggest user actions and exit
138
+ const fileList = discovered
139
+ .flatMap((d) => d.specifications.map((s) => ` - ${s.location}`))
140
+ .join('\n');
141
+ const firstSpec = discovered[0].specifications[0];
142
+ ux.stderr(`No specification configured. The following specification files were detected:\n\n${fileList}\n`);
143
+ ux.stderr('Rerun with --spec to use a detected file, for example:\n');
144
+ ux.stderr(` $ thymian ${this.id} --spec ${formatSpecInput(firstSpec)}\n`);
145
+ ux.stderr('Or generate a reusable config:\n');
146
+ ux.stderr(` $ thymian generate config --for-spec ${formatSpecInput(firstSpec)}\n`);
147
+ this.exit(2);
148
+ }
149
+ else {
150
+ // Step F: No specifications found anywhere
151
+ ux.stderr('No specification found. Provide a specification with --spec or create a configuration file.\n');
152
+ ux.stderr(' $ thymian generate config\n');
153
+ this.exit(2);
154
+ }
155
+ }
156
+ // --- Traffic Resolution Chain ---
157
+ // --traffic flag overrides config traffic
158
+ if (this.flags.traffic && this.flags.traffic.length > 0) {
159
+ this.thymianConfig = {
160
+ ...this.thymianConfig,
161
+ traffic: this.flags.traffic,
162
+ };
163
+ }
164
+ const requiresTraffic = this.ctor
165
+ .requiresTraffic;
166
+ if (requiresTraffic &&
167
+ (!this.thymianConfig.traffic || this.thymianConfig.traffic.length === 0)) {
168
+ const discovered = await this.runTrafficSearch();
169
+ if (discovered.length > 0) {
170
+ const fileList = discovered
171
+ .flatMap((d) => d.traffic.map((t) => ` * ${formatTrafficInput(t)}`))
172
+ .join('\n');
173
+ const firstTraffic = discovered[0].traffic[0];
174
+ ux.stderr(`No traffic configured. The following traffic files were detected:\n\n${fileList}\n`);
175
+ ux.stderr('Rerun with --traffic to use a detected file, for example:\n');
176
+ ux.stderr(` $ thymian ${this.id} --traffic ${formatTrafficInput(firstTraffic)}\n`);
177
+ this.exit(2);
178
+ }
179
+ else {
180
+ ux.stderr('No traffic found. Provide traffic with --traffic or add it to your configuration file.\n');
181
+ this.exit(2);
182
+ }
183
+ }
184
+ const logLevel = this.resolveLogLevelWithConfig();
185
+ this.logger = new TextLogger('thymian', logLevel);
186
+ this.logger.info('Configuration loaded.');
187
+ const specCount = this.thymianConfig.specifications?.length ?? 0;
188
+ if (specCount > 0) {
189
+ this.logger.info(`Resolved ${specCount} specification(s).`);
190
+ }
191
+ this.thymian = new Thymian(this.logger.child('@thymian/core'), {
192
+ timeout: this.flags.timeout,
193
+ cwd: this.flags.cwd,
194
+ idleTimeout: this.flags['idle-timeout'],
195
+ });
196
+ this.logger.info('Thymian instance created.');
197
+ if (this.shouldAutoload()) {
198
+ this.debug('Autoloading Thymian plugins.');
199
+ this.logger.info('Autoloading plugins from configuration...');
200
+ await this.addPluginsToThymianConfig();
201
+ await this.registerPluginsFromConfig();
202
+ }
203
+ await this.feedback.run();
204
+ }
205
+ async catch(err) {
206
+ await this.feedback.error();
207
+ const versionDetails = this.config.versionDetails;
208
+ const pluginVersions = Object.entries(versionDetails.pluginVersions ?? {})
209
+ .filter(([name]) => !name.startsWith('@oclif'))
210
+ .map(([name, version]) => ({ name, version: version.version }));
211
+ await this.errorCache.write({
212
+ name: err.name,
213
+ message: err.message,
214
+ commandName: this.id ?? 'unknown command',
215
+ timestamp: Date.now(),
216
+ cause: err.cause,
217
+ stack: err.stack,
218
+ argv: process.argv,
219
+ version: {
220
+ architecture: versionDetails.architecture,
221
+ cliVersion: versionDetails.cliVersion,
222
+ nodeVersion: versionDetails.nodeVersion,
223
+ osVersion: versionDetails.osVersion,
224
+ },
225
+ pluginVersions,
226
+ });
227
+ if (err instanceof ThymianBaseError) {
228
+ const cliError = new CLIError(err.message, {
229
+ suggestions: err.options.suggestions,
230
+ exit: err.options.exitCode,
231
+ code: err.options.code,
232
+ });
233
+ cliError.name = err.name;
234
+ Object.defineProperty(cliError, 'ref', { value: err.options.ref });
235
+ if (settings.debug) {
236
+ this.printStackTraces(err);
237
+ }
238
+ return super.catch(cliError);
239
+ }
240
+ return super.catch(err);
241
+ }
242
+ printStackTraces(err) {
243
+ if (err instanceof Error) {
244
+ if (this.jsonEnabled() && err.cause) {
245
+ this.logJson(this.toErrorJson(err.cause));
246
+ }
247
+ else if (err.cause) {
248
+ ux.stderr(err.cause instanceof Error
249
+ ? String(err.cause)
250
+ : inspect(err.cause, { depth: 3 }));
251
+ }
252
+ this.printStackTraces(err.cause);
253
+ }
254
+ }
255
+ shouldAutoload() {
256
+ if ('autoload' in this.flags) {
257
+ return this.flags.autoload;
258
+ }
259
+ return this.thymianConfig.autoload ?? true;
260
+ }
261
+ /**
262
+ * Run the `thymian.spec-search` oclif hook to let plugins discover specification files.
263
+ * Returns results grouped by plugin, each containing typed SpecificationInput[].
264
+ */
265
+ async runSpecSearch() {
266
+ const hookResults = await this.config.runHook('thymian.spec-search', {
267
+ cwd: this.flags.cwd,
268
+ });
269
+ const results = [];
270
+ for (const success of hookResults.successes) {
271
+ const result = success.result;
272
+ if (result.specifications.length > 0) {
273
+ results.push(result);
274
+ }
275
+ }
276
+ return results;
277
+ }
278
+ /**
279
+ * Run the `thymian.traffic-search` oclif hook to let plugins discover traffic files.
280
+ * Returns results grouped by plugin, each containing typed TrafficInput[].
281
+ */
282
+ async runTrafficSearch() {
283
+ const hookResults = await this.config.runHook('thymian.traffic-search', {
284
+ cwd: this.flags.cwd,
285
+ });
286
+ const results = [];
287
+ for (const success of hookResults.successes) {
288
+ const result = success.result;
289
+ if (result.traffic.length > 0) {
290
+ results.push(result);
291
+ }
292
+ }
293
+ return results;
294
+ }
295
+ /**
296
+ * Apply `-o` flag overrides to the loaded Thymian configuration.
297
+ *
298
+ * Each override targets a specific plugin by name and sets a deeply
299
+ * nested property on its `options` object. If the plugin entry does
300
+ * not yet exist in the config it will be created.
301
+ */
302
+ overridePluginOptions() {
303
+ if (!this.flags.option?.length) {
304
+ return;
305
+ }
306
+ for (const override of this.flags.option) {
307
+ this.thymianConfig.plugins[override.pluginName] ??= {};
308
+ const pluginConfig = this.thymianConfig.plugins[override.pluginName];
309
+ pluginConfig.options ??= {};
310
+ deepSet(pluginConfig.options, override.path, override.value);
311
+ }
312
+ }
313
+ /**
314
+ * Re-resolve log level considering the config file.
315
+ * Only applies config.logLevel if no explicit flag was set.
316
+ */
317
+ resolveLogLevelWithConfig() {
318
+ const flagLevel = this.flags['log-level'];
319
+ if (flagLevel && isLogLevel(flagLevel)) {
320
+ return flagLevel;
321
+ }
322
+ if (this.flags.debug) {
323
+ return 'debug';
324
+ }
325
+ if (this.flags.verbose) {
326
+ return 'info';
327
+ }
328
+ if (this.thymianConfig.logLevel &&
329
+ isLogLevel(this.thymianConfig.logLevel)) {
330
+ return this.thymianConfig.logLevel;
331
+ }
332
+ return 'warn';
333
+ }
334
+ setThymian(thymian) {
335
+ this.thymian = thymian;
336
+ }
337
+ async loadPluginModule(nameOrPath, isRelativePath = false) {
338
+ const options = this.thymianConfig.plugins[nameOrPath] ?? {};
339
+ const location = isRelativePath || typeof options.path === 'string'
340
+ ? join(this.flags.cwd, options.path ?? nameOrPath)
341
+ : nameOrPath;
342
+ let pluginModule;
343
+ this.debug('Load plugin module from location "%s".', location);
344
+ try {
345
+ pluginModule = (await import(require.resolve(location))).default;
346
+ }
347
+ catch (e) {
348
+ pluginModule = {};
349
+ }
350
+ if (!isPlugin(pluginModule)) {
351
+ throw new CLIError(`"${options.path ?? nameOrPath}" does not default export a valid Thymian plugin.`);
352
+ }
353
+ return pluginModule;
354
+ }
355
+ async registerPlugin(nameOrPath, isRelativePath = false) {
356
+ const pluginModule = await this.loadPluginModule(nameOrPath, isRelativePath);
357
+ const config = this.thymianConfig.plugins[pluginModule.name] ?? {};
358
+ if (typeof config.autoload === 'boolean' && !config.autoload) {
359
+ return;
360
+ }
361
+ this.thymian.register(pluginModule, config.options);
362
+ }
363
+ async addPluginsToThymianConfig() {
364
+ for (const plugin of this.flags.plugin) {
365
+ this.debug('Adding plugin from flag "%s" to Thymian config.', plugin);
366
+ const isPathPlugin = isAbsolute(plugin) ||
367
+ plugin.startsWith('./') ||
368
+ plugin.startsWith('../');
369
+ if (!isPathPlugin) {
370
+ this.debug('Load plugin "%s" as npm package or absolute path.', plugin);
371
+ const pluginModule = await this.loadPluginModule(plugin, false);
372
+ this.thymianConfig.plugins[pluginModule.name] ??= {};
373
+ }
374
+ else {
375
+ this.debug(`Load plugin %s from relative path.`, plugin);
376
+ const pluginModule = await this.loadPluginModule(plugin, true);
377
+ this.thymianConfig.plugins[pluginModule.name] = {
378
+ ...(this.thymianConfig.plugins[pluginModule.name] ?? {}),
379
+ path: plugin,
380
+ };
381
+ }
382
+ }
383
+ }
384
+ async registerPluginsFromConfig() {
385
+ for (const name of Object.keys(this.thymianConfig.plugins)) {
386
+ await this.registerPlugin(name);
387
+ }
388
+ }
389
+ shouldSuppressFeedback() {
390
+ return this.flags['suppress-feedback'];
391
+ }
392
+ }
393
+ /**
394
+ * Format a SpecificationInput as `type:location` for display and --spec flag suggestions.
395
+ */
396
+ function formatSpecInput(spec) {
397
+ return `${spec.type}:${spec.location}`;
398
+ }
399
+ /**
400
+ * Format a TrafficInput as `type:location` for display and --traffic flag suggestions.
401
+ */
402
+ function formatTrafficInput(traffic) {
403
+ return `${traffic.type}:${traffic.location}`;
404
+ }
405
+ //# 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,3 @@
1
+ import type { ThymianConfig } from './thymian-config.js';
2
+ export declare const defaultConfig: ThymianConfig;
3
+ //# sourceMappingURL=default-config.d.ts.map
@@ -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"}
@@ -0,0 +1,31 @@
1
+ import type { Command } from '@oclif/core';
2
+ import type { BaseCliRunCommand } from './base-cli-run-command.js';
3
+ import type { ThymianBaseCommand } from './thymian-base-command.js';
4
+ export type CachedError = {
5
+ name: string;
6
+ message: string;
7
+ stack?: string | undefined;
8
+ cause?: unknown | undefined;
9
+ commandName: string;
10
+ timestamp: number;
11
+ argv: string[];
12
+ version: {
13
+ architecture: string;
14
+ cliVersion: string;
15
+ nodeVersion: string;
16
+ osVersion?: string;
17
+ };
18
+ pluginVersions: {
19
+ name: string;
20
+ version: string;
21
+ }[];
22
+ };
23
+ export declare class ErrorCache {
24
+ private readonly dir;
25
+ constructor(dir: string);
26
+ write(error: CachedError): Promise<void>;
27
+ read(): Promise<CachedError | undefined>;
28
+ reset(): Promise<void>;
29
+ static forCommand(command: ThymianBaseCommand<typeof Command> | BaseCliRunCommand<typeof Command>): ErrorCache;
30
+ }
31
+ //# sourceMappingURL=error-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-cache.d.ts","sourceRoot":"","sources":["../src/error-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;CACL,CAAC;AAEF,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAElC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxC,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAYxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,MAAM,CAAC,UAAU,CACf,OAAO,EACH,kBAAkB,CAAC,OAAO,OAAO,CAAC,GAClC,iBAAiB,CAAC,OAAO,OAAO,CAAC,GACpC,UAAU;CAGd"}
@@ -0,0 +1,36 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ export class ErrorCache {
4
+ dir;
5
+ constructor(dir) {
6
+ this.dir = dir;
7
+ }
8
+ async write(error) {
9
+ const cacheFile = path.join(this.dir, 'last_error.json');
10
+ try {
11
+ await fs.mkdir(this.dir, { recursive: true });
12
+ await fs.writeFile(cacheFile, JSON.stringify(error));
13
+ }
14
+ catch (err) {
15
+ /* empty */
16
+ }
17
+ }
18
+ async read() {
19
+ const cacheFile = path.join(this.dir, 'last_error.json');
20
+ try {
21
+ const error = await fs.readFile(cacheFile, 'utf-8');
22
+ return JSON.parse(error);
23
+ }
24
+ catch (e) {
25
+ return undefined;
26
+ }
27
+ }
28
+ async reset() {
29
+ const cacheFile = path.join(this.dir, 'last_error.json');
30
+ await fs.unlink(cacheFile);
31
+ }
32
+ static forCommand(command) {
33
+ return new ErrorCache(command.config.cacheDir);
34
+ }
35
+ }
36
+ //# sourceMappingURL=error-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-cache.js","sourceRoot":"","sources":["../src/error-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AA2BlC,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAE5C,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAEzD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,UAAU,CACf,OAEqC;QAErC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Command } from '@oclif/core';
2
+ import type { BaseCliRunCommand } from './base-cli-run-command.js';
3
+ import type { ThymianBaseCommand } from './thymian-base-command.js';
4
+ export declare class Feedback {
5
+ private readonly onRun;
6
+ private wasRun;
7
+ constructor(initial: boolean, onRun: () => Promise<unknown>);
8
+ run(): Promise<void>;
9
+ error(): Promise<void>;
10
+ shouldPrintFeedback(): boolean;
11
+ static forCommand(command: ThymianBaseCommand<typeof Command> | BaseCliRunCommand<typeof Command>): Feedback;
12
+ }
13
+ //# sourceMappingURL=feedback.d.ts.map