@hapergg/harness-comet-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 (38) hide show
  1. package/bin/harness-comet.js +7 -0
  2. package/dist/commands/comet.d.ts +8 -0
  3. package/dist/commands/comet.d.ts.map +1 -0
  4. package/dist/commands/comet.js +500 -0
  5. package/dist/commands/comet.js.map +1 -0
  6. package/dist/commands/create.d.ts +16 -0
  7. package/dist/commands/create.d.ts.map +1 -0
  8. package/dist/commands/create.js +69 -0
  9. package/dist/commands/create.js.map +1 -0
  10. package/dist/commands/impact.d.ts +8 -0
  11. package/dist/commands/impact.d.ts.map +1 -0
  12. package/dist/commands/impact.js +108 -0
  13. package/dist/commands/impact.js.map +1 -0
  14. package/dist/commands/init.d.ts +19 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +249 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/dev-bin.d.ts +2 -0
  19. package/dist/dev-bin.d.ts.map +1 -0
  20. package/dist/dev-bin.js +6 -0
  21. package/dist/dev-bin.js.map +1 -0
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +393 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/package-info.d.ts +6 -0
  27. package/dist/package-info.d.ts.map +1 -0
  28. package/dist/package-info.js +6 -0
  29. package/dist/package-info.js.map +1 -0
  30. package/dist/templates/incident.d.ts +3 -0
  31. package/dist/templates/incident.d.ts.map +1 -0
  32. package/dist/templates/incident.js +26 -0
  33. package/dist/templates/incident.js.map +1 -0
  34. package/dist/templates/playwright-mode.d.ts +12 -0
  35. package/dist/templates/playwright-mode.d.ts.map +1 -0
  36. package/dist/templates/playwright-mode.js +225 -0
  37. package/dist/templates/playwright-mode.js.map +1 -0
  38. package/package.json +58 -0
package/dist/index.js ADDED
@@ -0,0 +1,393 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Command } from "commander";
4
+ import pc from "picocolors";
5
+ import { HarnessError, discoverHarnessAssets, listPlaywrightTests, loadHarnessCometConfig, loadHarnessConfig, mapErrorToExitCode, runPlaywrightHarness, runHarness, validatePlaywrightHarnessProject, validateHarnessProject } from "@hapergg/harness-comet-core";
6
+ import { registerCometCommands } from "./commands/comet.js";
7
+ import { registerImpactCommands } from "./commands/impact.js";
8
+ import { createPlaywrightIncident } from "./commands/create.js";
9
+ import { initHarnessProject, scenarioTemplate } from "./commands/init.js";
10
+ export async function main(argv = process.argv) {
11
+ if (Number(process.versions.node.split(".")[0]) < 20) {
12
+ process.stderr.write("Node.js >=20 is required\n");
13
+ process.exitCode = 3;
14
+ return;
15
+ }
16
+ const { commandArgv, passthroughArgs } = splitArgv(argv);
17
+ const program = buildProgram({ playwrightPassthroughArgs: passthroughArgs });
18
+ await program.parseAsync(commandArgv);
19
+ }
20
+ export function buildProgram(options = {}) {
21
+ const program = new Command();
22
+ program
23
+ .name("harness-comet")
24
+ .description("Independent Harness Runtime for scenario validation")
25
+ .version("0.1.0")
26
+ .option("--root <path>", "project root")
27
+ .option("--config <path>", "config path")
28
+ .option("--json", "write machine-readable JSON to stdout")
29
+ .option("--quiet", "suppress non-error logs")
30
+ .option("--verbose", "show verbose errors")
31
+ .option("--no-color", "disable color");
32
+ program
33
+ .command("init")
34
+ .option("--mode <runtime|playwright>", "project mode", "runtime")
35
+ .option("--adapter <memory|playwright|custom>", "adapter template", "memory")
36
+ .option("--test-dir <path>", "Playwright test directory", "tests")
37
+ .option("--skip-install", "write Playwright project files without running dependency install")
38
+ .option("--skip-browsers", "skip Playwright browser installation")
39
+ .option("--yes", "accept defaults")
40
+ .option("--force", "create missing files even when some exist")
41
+ .option("--overwrite-config", "overwrite harness-comet.config.ts")
42
+ .action(withErrors(program, async (options) => initCommand(rootOptions(program), options)));
43
+ program
44
+ .command("validate")
45
+ .option("--scenario <id>", "scenario id")
46
+ .option("--static-only", "skip adapter import")
47
+ .option("--strict", "strict validation")
48
+ .action(withErrors(program, async (options) => validateCommand(rootOptions(program), options)));
49
+ program
50
+ .command("doctor")
51
+ .action(withErrors(program, async () => doctorCommand(rootOptions(program))));
52
+ const tests = program.command("tests");
53
+ tests
54
+ .command("list")
55
+ .option("--tag <tag>", "filter by tag")
56
+ .action(withErrors(program, async (commandOptions) => testsListCommand(rootOptions(program), commandOptions)));
57
+ const create = program.command("create");
58
+ create
59
+ .command("incident")
60
+ .argument("<id>")
61
+ .option("--title <text>", "incident title")
62
+ .option("--issue-url <url>", "linked issue URL")
63
+ .option("--force", "overwrite generated incident files when safe")
64
+ .action(withErrors(program, async (id, commandOptions) => createIncidentCommand(rootOptions(program), id, commandOptions)));
65
+ const scenario = program.command("scenario");
66
+ scenario
67
+ .command("list")
68
+ .action(withErrors(program, async () => scenarioListCommand(rootOptions(program))));
69
+ scenario
70
+ .command("create")
71
+ .argument("<id>")
72
+ .option("--adapter <name>", "adapter name", "memory")
73
+ .action(withErrors(program, async (id, options) => scenarioCreateCommand(rootOptions(program), id, options)));
74
+ scenario
75
+ .command("validate")
76
+ .argument("<id>")
77
+ .action(withErrors(program, async (id) => validateCommand(rootOptions(program), { scenario: id })));
78
+ scenario
79
+ .command("explain")
80
+ .argument("<id>")
81
+ .action(withErrors(program, async (id) => scenarioExplainCommand(rootOptions(program), id)));
82
+ program
83
+ .command("run")
84
+ .option("--scenario <id>", "scenario id", collect, [])
85
+ .option("--tag <tag>", "tag", collect, [])
86
+ .option("--all", "run all scenarios")
87
+ .option("--adapter <name>", "override adapter")
88
+ .option("--workers <n>", "worker count", parseInt)
89
+ .option("--timeout <ms>", "timeout", parseInt)
90
+ .option("--fail-fast", "stop after first failure")
91
+ .option("--headed", "run browser headed")
92
+ .option("--dry-run", "show selected scenarios without execution")
93
+ .action(withErrors(program, async (commandOptions) => runCommand(rootOptions(program), commandOptions, options.playwrightPassthroughArgs ?? [])));
94
+ registerCometCommands(program, (action) => withErrors(program, action), () => rootOptions(program));
95
+ registerImpactCommands(program, (action) => withErrors(program, action), () => rootOptions(program));
96
+ return program;
97
+ }
98
+ function collect(value, previous) {
99
+ previous.push(value);
100
+ return previous;
101
+ }
102
+ function rootOptions(program) {
103
+ return program.opts();
104
+ }
105
+ function withErrors(program, action) {
106
+ return async (...args) => {
107
+ const options = rootOptions(program);
108
+ try {
109
+ await action(...args);
110
+ }
111
+ catch (error) {
112
+ const exitCode = mapErrorToExitCode(error);
113
+ process.exitCode = exitCode;
114
+ if (options.json) {
115
+ process.stdout.write(`${JSON.stringify({ ok: false, error: serializeError(error), exitCode })}\n`);
116
+ }
117
+ else {
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ process.stderr.write(`${pc.red("error")} ${message}\n`);
120
+ if (options.verbose && error instanceof Error && error.stack)
121
+ process.stderr.write(`${error.stack}\n`);
122
+ }
123
+ }
124
+ };
125
+ }
126
+ async function initCommand(global, options) {
127
+ const root = path.resolve(global.root ?? process.cwd());
128
+ const result = await initHarnessProject({
129
+ root,
130
+ mode: options.mode,
131
+ adapter: options.adapter,
132
+ testDir: options.testDir,
133
+ install: options.skipInstall ? false : true,
134
+ installBrowsers: options.skipBrowsers ? false : true,
135
+ overwriteConfig: options.overwriteConfig
136
+ });
137
+ output(global, result, "Initialized harness assets");
138
+ }
139
+ async function validateCommand(global, options) {
140
+ const project = await loadHarnessCometConfig({ root: global.root, config: global.config });
141
+ if (project.config.mode === "playwright") {
142
+ const result = await validatePlaywrightHarnessProject({
143
+ root: project.root,
144
+ playwright: project.config.playwright,
145
+ incidents: project.config.incidents
146
+ });
147
+ if (!result.ok)
148
+ throw result.errors[0];
149
+ output(global, {
150
+ ok: true,
151
+ mode: "playwright",
152
+ tests: result.assets.tests.length,
153
+ harnessTagged: result.assets.tests.filter((test) => test.tags.includes("@harness")).length,
154
+ warnings: result.warnings.map((warning) => warning.code)
155
+ }, "Playwright harness assets are valid");
156
+ return;
157
+ }
158
+ const config = await loadHarnessConfig({ root: global.root, config: global.config });
159
+ const result = await validateHarnessProject(config, {
160
+ staticOnly: options.staticOnly,
161
+ scenarioIds: options.scenario ? [options.scenario] : undefined
162
+ });
163
+ if (!result.ok)
164
+ throw result.errors[0];
165
+ output(global, {
166
+ ok: true,
167
+ scenarios: result.assets.scenarios.length,
168
+ fixtures: result.assets.fixtures.length
169
+ }, "Harness assets are valid");
170
+ }
171
+ async function doctorCommand(global) {
172
+ const checks = [
173
+ { name: "node", ok: Number(process.versions.node.split(".")[0]) >= 20, detail: process.version }
174
+ ];
175
+ try {
176
+ const config = await loadHarnessConfig({ root: global.root, config: global.config });
177
+ checks.push({ name: "config", ok: true, detail: config.configPath });
178
+ const assets = await discoverHarnessAssets(config);
179
+ if (usesPlaywright(config, assets.scenarios.map((item) => item.scenario.adapter))) {
180
+ try {
181
+ const { getPlaywrightBrowserDiagnostics } = await import("@hapergg/harness-comet-adapter-playwright");
182
+ const browser = config.config.playwright?.browser ?? "chromium";
183
+ const diagnostics = await getPlaywrightBrowserDiagnostics(browser);
184
+ checks.push({
185
+ name: `playwright-browser:${diagnostics.browser}`,
186
+ ok: diagnostics.installed,
187
+ detail: diagnostics.installed
188
+ ? diagnostics.executablePath
189
+ : `${diagnostics.issues.join("; ")} (install with: ${diagnostics.installCommand})`
190
+ });
191
+ }
192
+ catch (error) {
193
+ checks.push({
194
+ name: "playwright-browser",
195
+ ok: false,
196
+ detail: error instanceof Error ? error.message : String(error)
197
+ });
198
+ }
199
+ }
200
+ }
201
+ catch (error) {
202
+ checks.push({
203
+ name: "config",
204
+ ok: false,
205
+ detail: error instanceof Error ? error.message : String(error)
206
+ });
207
+ }
208
+ output(global, { ok: checks.every((check) => check.ok), checks }, checks.map((check) => `${check.ok ? "PASS" : "FAIL"} ${check.name} ${check.detail}`).join("\n"));
209
+ }
210
+ async function testsListCommand(global, options) {
211
+ const project = await loadHarnessCometConfig({ root: global.root, config: global.config });
212
+ if (project.config.mode !== "playwright") {
213
+ throw new HarnessError({
214
+ code: "PLAYWRIGHT_MODE_REQUIRED",
215
+ category: "selection",
216
+ message: "tests list is only available in playwright mode"
217
+ });
218
+ }
219
+ const tests = await listPlaywrightTests({
220
+ root: project.root,
221
+ configFile: project.config.playwright.configFile
222
+ });
223
+ const filtered = options.tag ? tests.filter((test) => test.tags.includes(options.tag)) : tests;
224
+ output(global, filtered, filtered.map((test) => `${test.file}\t${test.title}\t${test.tags.join(",")}`).join("\n"));
225
+ }
226
+ async function createIncidentCommand(global, id, options) {
227
+ const project = await loadHarnessCometConfig({ root: global.root, config: global.config });
228
+ if (project.config.mode !== "playwright") {
229
+ throw new HarnessError({
230
+ code: "PLAYWRIGHT_MODE_REQUIRED",
231
+ category: "selection",
232
+ message: "create incident is only available in playwright mode"
233
+ });
234
+ }
235
+ const result = await createPlaywrightIncident({
236
+ root: project.root,
237
+ testDir: project.config.playwright.testDir,
238
+ id,
239
+ title: options.title,
240
+ issueUrl: options.issueUrl,
241
+ force: options.force
242
+ });
243
+ output(global, result, `Created incident ${result.id}`);
244
+ }
245
+ function usesPlaywright(config, scenarioAdapters) {
246
+ if (config.config.adapter.default === "playwright")
247
+ return true;
248
+ return scenarioAdapters.some((adapter) => adapter === "playwright");
249
+ }
250
+ async function scenarioListCommand(global) {
251
+ const config = await loadHarnessConfig({ root: global.root, config: global.config });
252
+ const assets = await discoverHarnessAssets(config);
253
+ output(global, { scenarios: assets.scenarios.map(({ scenario }) => scenario) }, assets.scenarios
254
+ .map(({ scenario }) => `${scenario.id}\t${scenario.title}\t${scenario.adapter ?? config.config.adapter.default}\t${(scenario.tags ?? []).join(",")}`)
255
+ .join("\n"));
256
+ }
257
+ async function scenarioCreateCommand(global, id, options) {
258
+ const config = await loadHarnessConfig({ root: global.root, config: global.config });
259
+ const file = path.join(config.paths.scenarios, `${id}.scenario.yaml`);
260
+ await writeScenarioFileSafe(file, scenarioTemplate(options.adapter).replace("example-smoke", id));
261
+ output(global, { ok: true, file }, `Created ${file}`);
262
+ }
263
+ async function writeScenarioFileSafe(file, content) {
264
+ try {
265
+ await fs.access(file);
266
+ throw new HarnessError({
267
+ code: "SCENARIO_ALREADY_EXISTS",
268
+ category: "config",
269
+ message: `Scenario already exists: ${file}`
270
+ });
271
+ }
272
+ catch (error) {
273
+ if (error instanceof HarnessError)
274
+ throw error;
275
+ if (error.code !== "ENOENT")
276
+ throw error;
277
+ }
278
+ await fs.writeFile(file, content, "utf8");
279
+ }
280
+ async function scenarioExplainCommand(global, id) {
281
+ const config = await loadHarnessConfig({ root: global.root, config: global.config });
282
+ const assets = await discoverHarnessAssets(config);
283
+ const asset = assets.scenarios.find((item) => item.scenario.id === id);
284
+ if (!asset)
285
+ throw new HarnessError({
286
+ code: "SCENARIO_NOT_FOUND",
287
+ category: "selection",
288
+ message: `Scenario not found: ${id}`
289
+ });
290
+ output(global, asset, [
291
+ `Scenario: ${asset.scenario.id}`,
292
+ `File: ${asset.file}`,
293
+ `Fixtures: ${(asset.scenario.fixtureRefs ?? []).join(", ") || "-"}`,
294
+ `Steps: ${asset.scenario.steps.map((step) => step.action).join(", ") || "-"}`,
295
+ `Assertions: ${asset.scenario.assertions.map((assertion) => `${assertion.inspect} -> ${assertion.oracle}`).join(", ") || "-"}`,
296
+ `Run: harness-comet run --scenario ${asset.scenario.id}`
297
+ ].join("\n"));
298
+ }
299
+ async function runCommand(global, options, playwrightPassthroughArgs) {
300
+ const project = await loadHarnessCometConfig({ root: global.root, config: global.config });
301
+ if (project.config.mode === "playwright") {
302
+ if (options.scenario.length) {
303
+ throw new HarnessError({
304
+ code: "PLAYWRIGHT_RUNTIME_FLAG",
305
+ category: "selection",
306
+ message: "--scenario is only supported in runtime mode; pass Playwright file filters after -- in playwright mode"
307
+ });
308
+ }
309
+ const args = [...playwrightPassthroughArgs];
310
+ if (options.headed && !args.includes("--headed"))
311
+ args.push("--headed");
312
+ const resultsPath = path.join(project.root, project.config.playwright.resultsFile);
313
+ const code = await runPlaywrightHarness({
314
+ root: project.root,
315
+ configFile: project.config.playwright.configFile,
316
+ args,
317
+ env: {
318
+ HARNESS_COMET_PLAYWRIGHT_RESULTS_OUTPUT_FILE: resultsPath,
319
+ HARNESS_COMET_PLAYWRIGHT_PROJECT_ROOT: project.root
320
+ }
321
+ });
322
+ process.exitCode = code;
323
+ return;
324
+ }
325
+ const result = await runHarness({
326
+ root: global.root,
327
+ config: global.config,
328
+ scenarioIds: options.scenario,
329
+ tags: options.tag,
330
+ all: options.all,
331
+ adapter: options.adapter,
332
+ workers: options.workers,
333
+ timeoutMs: options.timeout,
334
+ failFast: options.failFast,
335
+ dryRun: options.dryRun,
336
+ json: global.json,
337
+ quiet: global.quiet,
338
+ verbose: global.verbose
339
+ });
340
+ if ("dryRun" in result) {
341
+ output(global, result, formatDryRun(result));
342
+ return;
343
+ }
344
+ process.exitCode = mapErrorToExitCode(result);
345
+ output(global, result, formatRunResult(result));
346
+ }
347
+ function formatDryRun(result) {
348
+ return result.scenarios
349
+ .map((scenario) => `${scenario.id}: adapter=${scenario.adapter} fixtures=${scenario.fixtures.join(",") || "-"} actions=${scenario.actions.join(",")}`)
350
+ .join("\n");
351
+ }
352
+ function formatRunResult(result) {
353
+ if ("dryRun" in result)
354
+ return formatDryRun(result);
355
+ const lines = [
356
+ "Scenario Status Duration",
357
+ "------------------------------------------------"
358
+ ];
359
+ for (const scenario of result.scenarios) {
360
+ lines.push(`${scenario.id.padEnd(25)} ${scenario.status.toUpperCase().padEnd(8)} ${scenario.durationMs}ms`);
361
+ for (const error of scenario.errors ?? []) {
362
+ lines.push(` ${error.code}: ${error.message}`);
363
+ }
364
+ for (const assertion of scenario.assertions) {
365
+ if (assertion.status === "failed") {
366
+ lines.push(` ${assertion.id}: ${JSON.stringify(assertion.differences ?? [])}`);
367
+ }
368
+ }
369
+ }
370
+ lines.push(`${result.summary.passed} passed, ${result.summary.failed} failed, ${result.summary.error} error`);
371
+ return lines.join("\n");
372
+ }
373
+ function output(global, json, text) {
374
+ process.stdout.write(`${global.json ? JSON.stringify(json, null, 2) : text}\n`);
375
+ }
376
+ function serializeError(error) {
377
+ if (error instanceof HarnessError)
378
+ return error.toJSON();
379
+ if (error instanceof Error)
380
+ return { message: error.message };
381
+ return { message: String(error) };
382
+ }
383
+ function splitArgv(argv) {
384
+ const separatorIndex = argv.indexOf("--");
385
+ if (separatorIndex === -1) {
386
+ return { commandArgv: argv, passthroughArgs: [] };
387
+ }
388
+ return {
389
+ commandArgv: argv.slice(0, separatorIndex),
390
+ passthroughArgs: argv.slice(separatorIndex + 1)
391
+ };
392
+ }
393
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,YAAY,EAEZ,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,UAAU,EACV,gCAAgC,EAChC,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAW1E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC5C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,yBAAyB,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7E,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAoD,EAAE;IACjF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,eAAe,CAAC;SACrB,WAAW,CAAC,qDAAqD,CAAC;SAClE,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC;SACzD,MAAM,CAAC,SAAS,EAAE,yBAAyB,CAAC;SAC5C,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAEzC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,6BAA6B,EAAE,cAAc,EAAE,SAAS,CAAC;SAChE,MAAM,CAAC,sCAAsC,EAAE,kBAAkB,EAAE,QAAQ,CAAC;SAC5E,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,OAAO,CAAC;SACjE,MAAM,CAAC,gBAAgB,EAAE,mEAAmE,CAAC;SAC7F,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC;SAClC,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,oBAAoB,EAAE,mCAAmC,CAAC;SACjE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAE9F,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;SAC9C,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAElG,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;SACtC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAEjH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM;SACH,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,MAAM,CAAC;SAChB,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;SAC/C,MAAM,CAAC,SAAS,EAAE,8CAA8C,CAAC;SACjE,MAAM,CACL,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,CAC/C,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAChE,CACF,CAAC;IAEJ,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,MAAM,CAAC;SAChB,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC;SACpD,MAAM,CACL,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CACxC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CACzD,CACF,CAAC;IACJ,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,MAAM,CAAC;SAChB,MAAM,CACL,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAC3F,CAAC;IACJ,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,MAAM,CAAC;SAChB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,EAAc,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAc,CAAC;SACrD,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC;SACpC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;SAC9C,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,QAAQ,CAAC;SACjD,MAAM,CAAC,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC;SAC7C,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC;SACxC,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAChE,MAAM,CACL,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAC3C,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAC1F,CACF,CAAC;IAEJ,qBAAqB,CACnB,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EACvC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAC3B,CAAC;IACF,sBAAsB,CACpB,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EACvC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAC3B,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO,OAAO,CAAC,IAAI,EAAiB,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB,EAAE,MAAyC;IAC7E,OAAO,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAC7E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;gBACxD,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK;oBAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAqB,EACrB,OAOC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC3C,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACpD,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC;IAEH,MAAM,CACJ,MAAM,EACN,MAAM,EACN,4BAA4B,CAC7B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,OAAoD;IAEpD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,gCAAgC,CAAC;YACpD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU;YACrC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CACJ,MAAM,EACN;YACE,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;YACjC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;YAC1F,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SACzD,EACD,qCAAqC,CACtC,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,CACJ,MAAM,EACN;QACE,EAAE,EAAE,IAAI;QACR,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;QACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;KACxC,EACD,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAqB;IAChD,MAAM,MAAM,GAAG;QACb,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE;KACjG,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,IACE,cAAc,CACZ,MAAM,EACN,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CACtD,EACD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,+BAA+B,EAAE,GAAG,MAAM,MAAM,CACtD,2CAA2C,CAC5C,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC;gBAChE,MAAM,WAAW,GAAG,MAAM,+BAA+B,CAAC,OAAO,CAAC,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,sBAAsB,WAAW,CAAC,OAAO,EAAE;oBACjD,EAAE,EAAE,WAAW,CAAC,SAAS;oBACzB,MAAM,EAAE,WAAW,CAAC,SAAS;wBAC3B,CAAC,CAAC,WAAW,CAAC,cAAc;wBAC5B,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,cAAc,GAAG;iBACrF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,oBAAoB;oBAC1B,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC/D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,CACJ,MAAM,EACN,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EACjD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAqB,EACrB,OAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACzC,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,WAAW;YACrB,OAAO,EAAE,iDAAiD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC;QACtC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU;KACjD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChG,MAAM,CACJ,MAAM,EACN,QAAQ,EACR,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACzF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAAqB,EACrB,EAAU,EACV,OAA+D;IAE/D,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACzC,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,WAAW;YACrB,OAAO,EAAE,sDAAsD;SAChE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO;QAC1C,EAAE;QACF,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CACrB,MAAqD,EACrD,gBAA2C;IAE3C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,MAAqB;IACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,CACJ,MAAM,EACN,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAC/D,MAAM,CAAC,SAAS;SACb,GAAG,CACF,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACf,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAChI;SACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAAqB,EACrB,EAAU,EACV,OAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACtE,MAAM,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAe;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,4BAA4B,IAAI,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY;YAAE,MAAM,KAAK,CAAC;QAC/C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACtE,CAAC;IACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,MAAqB,EAAE,EAAU;IACrE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK;QACR,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,WAAW;YACrB,OAAO,EAAE,uBAAuB,EAAE,EAAE;SACrC,CAAC,CAAC;IACL,MAAM,CACJ,MAAM,EACN,KAAK,EACL;QACE,aAAa,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE;QAChC,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE;QACnE,UAAU,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE;QAC7E,eAAe,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE;QAC9H,qCAAqC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAqB,EACrB,OAUC,EACD,yBAAmC;IAEnC,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CAAC;gBACrB,IAAI,EAAE,yBAAyB;gBAC/B,QAAQ,EAAE,WAAW;gBACrB,OAAO,EACL,wGAAwG;aAC3G,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU;YAChD,IAAI;YACJ,GAAG,EAAE;gBACH,4CAA4C,EAAE,WAAW;gBACzD,qCAAqC,EAAE,OAAO,CAAC,IAAI;aACpD;SACF,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,OAAO,CAAC,QAAQ;QAC7B,IAAI,EAAE,OAAO,CAAC,GAAG;QACjB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,OAAO;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,MAAoB;IACxC,OAAO,MAAM,CAAC,SAAS;SACpB,GAAG,CACF,CAAC,QAAQ,EAAE,EAAE,CACX,GAAG,QAAQ,CAAC,EAAE,aAAa,QAAQ,CAAC,OAAO,aAAa,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACrI;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,MAA8C;IACrE,IAAI,QAAQ,IAAI,MAAM;QAAE,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG;QACZ,6CAA6C;QAC7C,kDAAkD;KACnD,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CACR,GAAG,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,IAAI,CAChG,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAClG,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,MAAM,CAAC,MAAqB,EAAE,IAAa,EAAE,IAAY;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACzD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IACD,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QAC1C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const HARNESS_COMET_VERSION = "0.1.0";
2
+ export declare const HARNESS_COMET_ADAPTER_MEMORY_PACKAGE = "@hapergg/harness-comet-adapter-memory";
3
+ export declare const HARNESS_COMET_ADAPTER_PLAYWRIGHT_PACKAGE = "@hapergg/harness-comet-adapter-playwright";
4
+ export declare const HARNESS_COMET_PLAYWRIGHT_PACKAGE = "@hapergg/harness-comet-playwright";
5
+ export declare const HARNESS_COMET_PLAYWRIGHT_DEPENDENCY = "^0.1.0";
6
+ //# sourceMappingURL=package-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,eAAO,MAAM,oCAAoC,0CACR,CAAC;AAC1C,eAAO,MAAM,wCAAwC,8CACR,CAAC;AAC9C,eAAO,MAAM,gCAAgC,sCAAsC,CAAC;AACpF,eAAO,MAAM,mCAAmC,WAA8B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const HARNESS_COMET_VERSION = "0.1.0";
2
+ export const HARNESS_COMET_ADAPTER_MEMORY_PACKAGE = "@hapergg/harness-comet-adapter-memory";
3
+ export const HARNESS_COMET_ADAPTER_PLAYWRIGHT_PACKAGE = "@hapergg/harness-comet-adapter-playwright";
4
+ export const HARNESS_COMET_PLAYWRIGHT_PACKAGE = "@hapergg/harness-comet-playwright";
5
+ export const HARNESS_COMET_PLAYWRIGHT_DEPENDENCY = `^${HARNESS_COMET_VERSION}`;
6
+ //# sourceMappingURL=package-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.js","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAE7C,MAAM,CAAC,MAAM,oCAAoC,GAC/C,uCAAuC,CAAC;AAC1C,MAAM,CAAC,MAAM,wCAAwC,GACnD,2CAA2C,CAAC;AAC9C,MAAM,CAAC,MAAM,gCAAgC,GAAG,mCAAmC,CAAC;AACpF,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function incidentSpecTemplate(id: string, title?: string, issueUrl?: string): string;
2
+ export declare function incidentReadmeTemplate(id: string, title?: string): string;
3
+ //# sourceMappingURL=incident.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident.d.ts","sourceRoot":"","sources":["../../src/templates/incident.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB1F;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzE"}
@@ -0,0 +1,26 @@
1
+ export function incidentSpecTemplate(id, title, issueUrl) {
2
+ const renderedTitle = title ?? id;
3
+ const annotationLines = issueUrl
4
+ ? ` { type: "issue-url", description: "${issueUrl}" }\n`
5
+ : "";
6
+ return `import { test } from "@playwright/test";
7
+
8
+ test("${id}: ${renderedTitle}", {
9
+ tag: ["@harness", "@incident"],
10
+ annotation: [
11
+ { type: "incident", description: "${id}" },
12
+ ${annotationLines} ]
13
+ }, async () => {
14
+ // Arrange
15
+ // Act
16
+ // Assert
17
+ });
18
+ `;
19
+ }
20
+ export function incidentReadmeTemplate(id, title) {
21
+ return `# ${id}
22
+
23
+ ${title ?? id}
24
+ `;
25
+ }
26
+ //# sourceMappingURL=incident.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident.js","sourceRoot":"","sources":["../../src/templates/incident.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,KAAc,EAAE,QAAiB;IAChF,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,QAAQ;QAC9B,CAAC,CAAC,0CAA0C,QAAQ,OAAO;QAC3D,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;;QAED,EAAE,KAAK,aAAa;;;wCAGY,EAAE;EACxC,eAAe;;;;;;CAMhB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAU,EAAE,KAAc;IAC/D,OAAO,KAAK,EAAE;;EAEd,KAAK,IAAI,EAAE;CACZ,CAAC;AACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function playwrightHarnessCometConfigTemplate(testDir?: string): string;
2
+ export declare function playwrightConfigTemplate(testDir?: string): string;
3
+ export declare function playwrightExampleSpecTemplate(): string;
4
+ export declare function playwrightFixturesTemplate(): string;
5
+ export declare function playwrightMockApiTemplate(): string;
6
+ export declare function playwrightAttachmentsTemplate(): string;
7
+ export declare function playwrightIncidentReadmeTemplate(): string;
8
+ export declare function playwrightAuthoringGuideTemplate(): string;
9
+ export declare function playwrightIncidentGuideTemplate(): string;
10
+ export declare function playwrightAcceptanceCriteriaTemplate(): string;
11
+ export declare function testingReadmeTemplate(): string;
12
+ //# sourceMappingURL=playwright-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-mode.d.ts","sourceRoot":"","sources":["../../src/templates/playwright-mode.ts"],"names":[],"mappings":"AAAA,wBAAgB,oCAAoC,CAAC,OAAO,SAAU,GAAG,MAAM,CAyB9E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,SAAU,GAAG,MAAM,CAgClE;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CA8EtD;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAGnD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAkBlD;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAUtD;AAED,wBAAgB,gCAAgC,IAAI,MAAM,CAUzD;AAED,wBAAgB,gCAAgC,IAAI,MAAM,CAWzD;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAKxD;AAED,wBAAgB,oCAAoC,IAAI,MAAM,CAW7D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C"}