@archdoc/cli 0.0.0-stage → 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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +6 -0
  5. package/dist/bin.js.map +1 -0
  6. package/dist/commands/check.d.ts +23 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +58 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/commands/code.d.ts +24 -0
  11. package/dist/commands/code.d.ts.map +1 -0
  12. package/dist/commands/code.js +92 -0
  13. package/dist/commands/code.js.map +1 -0
  14. package/dist/commands/context.d.ts +26 -0
  15. package/dist/commands/context.d.ts.map +1 -0
  16. package/dist/commands/context.js +117 -0
  17. package/dist/commands/context.js.map +1 -0
  18. package/dist/commands/data.d.ts +12 -0
  19. package/dist/commands/data.d.ts.map +1 -0
  20. package/dist/commands/data.js +63 -0
  21. package/dist/commands/data.js.map +1 -0
  22. package/dist/commands/diff.d.ts +17 -0
  23. package/dist/commands/diff.d.ts.map +1 -0
  24. package/dist/commands/diff.js +79 -0
  25. package/dist/commands/diff.js.map +1 -0
  26. package/dist/commands/federation.d.ts +20 -0
  27. package/dist/commands/federation.d.ts.map +1 -0
  28. package/dist/commands/federation.js +96 -0
  29. package/dist/commands/federation.js.map +1 -0
  30. package/dist/commands/init.d.ts +13 -0
  31. package/dist/commands/init.d.ts.map +1 -0
  32. package/dist/commands/init.js +24 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/landscape.d.ts +14 -0
  35. package/dist/commands/landscape.d.ts.map +1 -0
  36. package/dist/commands/landscape.js +52 -0
  37. package/dist/commands/landscape.js.map +1 -0
  38. package/dist/commands/migrate.d.ts +8 -0
  39. package/dist/commands/migrate.d.ts.map +1 -0
  40. package/dist/commands/migrate.js +38 -0
  41. package/dist/commands/migrate.js.map +1 -0
  42. package/dist/commands/report.d.ts +16 -0
  43. package/dist/commands/report.d.ts.map +1 -0
  44. package/dist/commands/report.js +77 -0
  45. package/dist/commands/report.js.map +1 -0
  46. package/dist/commands/schema.d.ts +5 -0
  47. package/dist/commands/schema.d.ts.map +1 -0
  48. package/dist/commands/schema.js +15 -0
  49. package/dist/commands/schema.js.map +1 -0
  50. package/dist/commands/seal.d.ts +25 -0
  51. package/dist/commands/seal.d.ts.map +1 -0
  52. package/dist/commands/seal.js +64 -0
  53. package/dist/commands/seal.js.map +1 -0
  54. package/dist/commands/site.d.ts +14 -0
  55. package/dist/commands/site.d.ts.map +1 -0
  56. package/dist/commands/site.js +42 -0
  57. package/dist/commands/site.js.map +1 -0
  58. package/dist/commands/trace.d.ts +5 -0
  59. package/dist/commands/trace.d.ts.map +1 -0
  60. package/dist/commands/trace.js +39 -0
  61. package/dist/commands/trace.js.map +1 -0
  62. package/dist/commands/validate.d.ts +8 -0
  63. package/dist/commands/validate.d.ts.map +1 -0
  64. package/dist/commands/validate.js +49 -0
  65. package/dist/commands/validate.js.map +1 -0
  66. package/dist/commands/view.d.ts +17 -0
  67. package/dist/commands/view.d.ts.map +1 -0
  68. package/dist/commands/view.js +50 -0
  69. package/dist/commands/view.js.map +1 -0
  70. package/dist/index.d.ts +4 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/io.d.ts +7 -0
  75. package/dist/io.d.ts.map +1 -0
  76. package/dist/io.js +6 -0
  77. package/dist/io.js.map +1 -0
  78. package/dist/landscape.d.ts +28 -0
  79. package/dist/landscape.d.ts.map +1 -0
  80. package/dist/landscape.js +34 -0
  81. package/dist/landscape.js.map +1 -0
  82. package/dist/model-path.d.ts +7 -0
  83. package/dist/model-path.d.ts.map +1 -0
  84. package/dist/model-path.js +17 -0
  85. package/dist/model-path.js.map +1 -0
  86. package/dist/program.d.ts +7 -0
  87. package/dist/program.d.ts.map +1 -0
  88. package/dist/program.js +197 -0
  89. package/dist/program.js.map +1 -0
  90. package/dist/server.d.ts +297 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +348 -0
  93. package/dist/server.js.map +1 -0
  94. package/package.json +35 -3
  95. package/web/assets/index-CDAgYSBW.js +210 -0
  96. package/web/assets/index-k7lSjazl.css +1 -0
  97. package/web/favicon.svg +1 -0
  98. package/web/index.html +14 -0
  99. package/README.md +0 -3
@@ -0,0 +1,20 @@
1
+ import type { Io } from "../io.js";
2
+ export interface SyncCommandOptions {
3
+ model?: string;
4
+ /** true for every import, or a list of namespaces. */
5
+ update?: boolean | string[];
6
+ frozen?: boolean;
7
+ }
8
+ /**
9
+ * `archdoc sync`: pin the model's imports in archdoc.lock and vendor their
10
+ * models, then report references into them that don't resolve.
11
+ */
12
+ export declare function sync(options: SyncCommandOptions, io: Io): Promise<number>;
13
+ export interface PublishCommandOptions {
14
+ model?: string;
15
+ version?: string;
16
+ out?: string;
17
+ }
18
+ /** `archdoc publish`: write a versioned, validated bundle of the model for other repos. */
19
+ export declare function publish(options: PublishCommandOptions, io: Io): Promise<number>;
20
+ //# sourceMappingURL=federation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/commands/federation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0D/E;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCrF"}
@@ -0,0 +1,96 @@
1
+ import { formatDiagnostic, loadModel } from "@archdoc/core";
2
+ import { publish as publishModel, sync as syncModel } from "@archdoc/federation";
3
+ /**
4
+ * `archdoc sync`: pin the model's imports in archdoc.lock and vendor their
5
+ * models, then report references into them that don't resolve.
6
+ */
7
+ export async function sync(options, io) {
8
+ try {
9
+ const result = await syncModel({
10
+ model: options.model,
11
+ cwd: io.cwd,
12
+ update: options.update,
13
+ frozen: options.frozen,
14
+ });
15
+ if (options.frozen) {
16
+ if (result.problems.length) {
17
+ for (const p of result.problems)
18
+ io.err(`✗ ${p}`);
19
+ io.err("\nRun archdoc sync and commit archdoc.lock and .archdoc/vendor/.");
20
+ return 1;
21
+ }
22
+ io.out(`✓ ${result.lockPath} matches imports.`);
23
+ return 0;
24
+ }
25
+ if (result.changes.length === 0) {
26
+ io.out("Nothing to sync: the model has no imports.");
27
+ return 0;
28
+ }
29
+ for (const c of result.changes) {
30
+ const at = c.version ? `@${c.version}` : c.ref ? ` at ${c.ref}` : "";
31
+ const what = c.landscape ? "landscape " : "";
32
+ const line = {
33
+ kept: ` ${what}${c.namespace}${at}`,
34
+ added: `+ ${what}${c.namespace}${at} (${c.source})`,
35
+ updated: `↑ ${what}${c.namespace}${c.previous && c.version ? ` ${c.previous} → ${c.version}` : at}`,
36
+ removed: `- ${what}${c.namespace}${at}`,
37
+ }[c.action];
38
+ io.out(line);
39
+ }
40
+ const changed = result.changes.filter((c) => c.action !== "kept").length;
41
+ io.out(changed
42
+ ? `\nWrote ${result.lockPath}. Commit it with .archdoc/vendor/.`
43
+ : `\n${result.lockPath} is up to date.`);
44
+ // What the pinned versions mean for this model.
45
+ const model = await loadModel(options.model ?? ".", { cwd: io.cwd });
46
+ const crossRepo = model.diagnostics.filter((d) => d.severity !== "info" &&
47
+ /^(import|ref\/unknown-in-import|ref\/deprecated|ref\/unknown-contract|journey\/broken-step)/.test(d.code));
48
+ if (crossRepo.length) {
49
+ io.err("");
50
+ for (const d of crossRepo)
51
+ io.err(formatDiagnostic(d));
52
+ return crossRepo.some((d) => d.severity === "error") ? 1 : 0;
53
+ }
54
+ return 0;
55
+ }
56
+ catch (err) {
57
+ io.err(err instanceof Error ? err.message : String(err));
58
+ return 2;
59
+ }
60
+ }
61
+ /** `archdoc publish`: write a versioned, validated bundle of the model for other repos. */
62
+ export async function publish(options, io) {
63
+ try {
64
+ const result = await publishModel({
65
+ model: options.model,
66
+ cwd: io.cwd,
67
+ version: options.version,
68
+ out: options.out === "-" ? undefined : options.out,
69
+ dryRun: options.out === "-",
70
+ });
71
+ if (result.errors.length) {
72
+ for (const d of result.errors)
73
+ io.err(formatDiagnostic(d));
74
+ io.err(`\n✗ Not published: the model has ${result.errors.length} error${result.errors.length === 1 ? "" : "s"}.`);
75
+ return 1;
76
+ }
77
+ if (options.out === "-") {
78
+ io.out(result.text?.trimEnd() ?? "");
79
+ return 0;
80
+ }
81
+ const b = result.bundle;
82
+ io.out(`✓ Wrote ${result.path} (${b?.namespace}${b?.version ? `@${b.version}` : ""}, ${b?.sources.length} file${b?.sources.length === 1 ? "" : "s"}).`);
83
+ if (!b?.version) {
84
+ io.err(" It has no version. Tag the commit (such as v1.0.0) or pass one (archdoc publish 1.0.0), so other repos can pin it.");
85
+ }
86
+ else {
87
+ io.out(` Other repos import it with git: (the tag is enough) or url: (attach ${result.path} to the release).`);
88
+ }
89
+ return 0;
90
+ }
91
+ catch (err) {
92
+ io.err(err instanceof Error ? err.message : String(err));
93
+ return 2;
94
+ }
95
+ }
96
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/commands/federation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Io } from "../io.js";
2
+ export interface InitOptions {
3
+ name?: string;
4
+ dryRun?: boolean;
5
+ json?: boolean;
6
+ }
7
+ /**
8
+ * `archdoc init [path]`: a starting model for a repository without one, from
9
+ * its manifests, compose files, imports, and schema files, every fact marked
10
+ * inferred. Never writes over a model.
11
+ */
12
+ export declare function init(path: string, options: InitOptions, io: Io): Promise<number>;
13
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAatF"}
@@ -0,0 +1,24 @@
1
+ import { resolve } from "node:path";
2
+ import { formatInit, initModel } from "@archdoc/analyzers";
3
+ /**
4
+ * `archdoc init [path]`: a starting model for a repository without one, from
5
+ * its manifests, compose files, imports, and schema files, every fact marked
6
+ * inferred. Never writes over a model.
7
+ */
8
+ export async function init(path, options, io) {
9
+ try {
10
+ const r = await initModel(resolve(io.cwd, path), options);
11
+ if (options.json) {
12
+ io.out(JSON.stringify(r, null, 2));
13
+ }
14
+ else {
15
+ (r.refused ? io.err : io.out)(formatInit(r));
16
+ }
17
+ return r.refused || r.problems.length ? 1 : 0;
18
+ }
19
+ catch (err) {
20
+ io.err(err instanceof Error ? err.message : String(err));
21
+ return 2;
22
+ }
23
+ }
24
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAS3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,OAAoB,EAAE,EAAM;IACnE,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Io } from "../io.js";
2
+ export interface LandscapeBuildOptions {
3
+ out?: string;
4
+ /** Write the site even when the composed model has errors. */
5
+ force?: boolean;
6
+ }
7
+ /**
8
+ * `archdoc landscape build`: composes the landscape repo's model with every
9
+ * model it imports, checks the whole (journeys across repos, owners, org
10
+ * rules on declared relationships), and writes a static explorer site for
11
+ * GitHub Pages or any static host.
12
+ */
13
+ export declare function landscapeBuild(target: string, options: LandscapeBuildOptions, io: Io): Promise<number>;
14
+ //# sourceMappingURL=landscape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landscape.d.ts","sourceRoot":"","sources":["../../src/commands/landscape.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,EAAE,EAAE,EAAE,GACL,OAAO,CAAC,MAAM,CAAC,CAkDjB"}
@@ -0,0 +1,52 @@
1
+ import { cp, mkdir, rm, writeFile } from "node:fs/promises";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { check, formatDiagnostic } from "@archdoc/core";
4
+ import { landscapePayload, loadLandscape } from "../landscape.js";
5
+ import { findWebDir } from "../server.js";
6
+ /**
7
+ * `archdoc landscape build`: composes the landscape repo's model with every
8
+ * model it imports, checks the whole (journeys across repos, owners, org
9
+ * rules on declared relationships), and writes a static explorer site for
10
+ * GitHub Pages or any static host.
11
+ */
12
+ export async function landscapeBuild(target, options, io) {
13
+ try {
14
+ const { model, composed } = await loadLandscape(target, io.cwd);
15
+ const findings = check(composed.model).findings.filter((f) => f.code !== "model/orphan-element");
16
+ for (const f of findings) {
17
+ io.err(formatDiagnostic({
18
+ severity: f.severity,
19
+ code: f.code,
20
+ message: f.message,
21
+ location: f.location,
22
+ }));
23
+ }
24
+ const errors = findings.filter((f) => f.severity === "error").length;
25
+ if (errors && !options.force) {
26
+ io.err(`\n✗ Not built: the landscape has ${errors} error${errors === 1 ? "" : "s"}. Fix them, or pass --force.`);
27
+ return 1;
28
+ }
29
+ const webDir = findWebDir();
30
+ if (!webDir) {
31
+ io.err("The explorer isn't built. In the ArchDoc repo, run `pnpm build`, or set ARCHDOC_WEB_DIR.");
32
+ return 2;
33
+ }
34
+ const out = resolve(io.cwd, options.out ?? "site");
35
+ await rm(out, { recursive: true, force: true });
36
+ await mkdir(join(out, "api"), { recursive: true });
37
+ await cp(webDir, out, { recursive: true });
38
+ const payload = await landscapePayload(model, composed, false);
39
+ await writeFile(join(out, "api", "model"), JSON.stringify(payload));
40
+ // GitHub Pages serves files and folders as they are.
41
+ await writeFile(join(out, ".nojekyll"), "");
42
+ const m = composed.model;
43
+ io.out(`✓ Wrote ${relative(io.cwd, out) || "."}/: ${model.name ?? model.namespace}, ${composed.repos.length} repos (${composed.repos.map((r) => `${r.namespace}@${r.version ?? "?"}`).join(", ")}), ${m.elements.size} elements, ${m.actors.size} actors, ${m.journeys.size} journeys${composed.domains.length ? `, ${composed.domains.length} domains` : ""}.`);
44
+ io.out(" Publish the folder with GitHub Pages or any static host.");
45
+ return 0;
46
+ }
47
+ catch (err) {
48
+ io.err(err instanceof Error ? err.message : String(err));
49
+ return 2;
50
+ }
51
+ }
52
+ //# sourceMappingURL=landscape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landscape.js","sourceRoot":"","sources":["../../src/commands/landscape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Io } from "../io.js";
2
+ export interface MigrateOptions {
3
+ namespace?: string;
4
+ name?: string;
5
+ out?: string;
6
+ }
7
+ export declare function migrate(file: string, options: MigrateOptions, io: Io): Promise<number>;
8
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB5F"}
@@ -0,0 +1,38 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { basename, extname, resolve } from "node:path";
3
+ import { isV1Model, migrateV1 } from "@archdoc/spec";
4
+ import { parse, stringify } from "yaml";
5
+ export async function migrate(file, options, io) {
6
+ const path = resolve(io.cwd, file);
7
+ const text = await readFile(path, "utf8").catch(() => undefined);
8
+ if (text === undefined) {
9
+ io.err(`Can't read ${file}.`);
10
+ return 1;
11
+ }
12
+ const doc = parse(text);
13
+ if (!isV1Model(doc)) {
14
+ io.err(`${file} is not a v1 model (no users or components). Nothing to migrate.`);
15
+ return 1;
16
+ }
17
+ const namespace = options.namespace ?? slug(basename(file, extname(file)));
18
+ const { model, notes } = migrateV1(doc, { namespace, name: options.name });
19
+ const yaml = `# Migrated from v1 by "archdoc migrate".\n${stringify(model, { lineWidth: 100 })}`;
20
+ if (options.out) {
21
+ await writeFile(resolve(io.cwd, options.out), yaml);
22
+ io.err(`Wrote ${options.out}.`);
23
+ }
24
+ else {
25
+ io.out(yaml.trimEnd());
26
+ }
27
+ for (const note of notes)
28
+ io.err(`note: ${note}`);
29
+ return 0;
30
+ }
31
+ function slug(s) {
32
+ const out = s
33
+ .toLowerCase()
34
+ .replace(/[^a-z0-9]+/g, "-")
35
+ .replace(/^[^a-z]+|-+$/g, "");
36
+ return out || "model";
37
+ }
38
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AASxC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAM;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,6CAA6C,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAEjG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,MAAM,GAAG,GAAG,CAAC;SACV,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Io } from "../io.js";
2
+ export interface ReportOptions {
3
+ model?: string;
4
+ base?: string;
5
+ format?: string;
6
+ /** False leaves out the Mermaid diagrams. */
7
+ diagrams?: boolean;
8
+ /** A page that shows the change in the explorer, linked from the comment. */
9
+ explorerUrl?: string;
10
+ }
11
+ /**
12
+ * `archdoc report --base <ref>`: the architectural impact of the change since
13
+ * the merge base with <ref>, as markdown for a pull request comment.
14
+ */
15
+ export declare function report(options: ReportOptions, io: Io): Promise<number>;
16
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC5E"}
@@ -0,0 +1,77 @@
1
+ import { resealedSince } from "@archdoc/analyzers";
2
+ import { check, diffModels, loadModel, loadTraces, prReport, readTraceSources, tracesInChange, } from "@archdoc/core";
3
+ import { isModelPath } from "../model-path.js";
4
+ import { runCheck } from "./check.js";
5
+ /**
6
+ * `archdoc report --base <ref>`: the architectural impact of the change since
7
+ * the merge base with <ref>, as markdown for a pull request comment.
8
+ */
9
+ export async function report(options, io) {
10
+ if (!options.base) {
11
+ io.err("--base is required, such as --base main or --base origin/main.");
12
+ return 2;
13
+ }
14
+ const format = options.format ?? "markdown";
15
+ try {
16
+ if (isModelPath(io.cwd, options.base))
17
+ return await reportFiles(options.base, options, io);
18
+ const { model, findings, base } = await runCheck({ model: options.model, base: options.base }, io.cwd);
19
+ if (!base)
20
+ throw new Error(`Couldn't read the model at ${options.base}.`);
21
+ const baseModel = base.model;
22
+ const changed = base.changedFiles;
23
+ // Bug traces the change adds or edits: the comment says which bug it fixes.
24
+ const { traces } = loadTraces(await readTraceSources(options.model ?? ".", { cwd: io.cwd }));
25
+ const r = prReport({
26
+ model,
27
+ base: baseModel,
28
+ changedFiles: changed,
29
+ diff: diffModels(baseModel, model),
30
+ findings,
31
+ diagrams: options.diagrams !== false,
32
+ explorerUrl: options.explorerUrl,
33
+ fixes: tracesInChange(changed, traces),
34
+ resealed: await resealedSince(options.model ?? ".", io.cwd, base.commit),
35
+ // A commit hash, as the Action passes, reads better short.
36
+ label: `${/^[0-9a-f]{40}$/.test(options.base) ? options.base.slice(0, 7) : options.base}...HEAD`,
37
+ });
38
+ io.out(format === "json" ? JSON.stringify({ ...r, markdown: undefined }, null, 2) : r.markdown);
39
+ return 0;
40
+ }
41
+ catch (err) {
42
+ io.err(err instanceof Error ? err.message : String(err));
43
+ return 2;
44
+ }
45
+ }
46
+ /**
47
+ * The report for two models on disk, such as an example and its variant: the
48
+ * model checked on its own (there's no code to compare it with), with what the
49
+ * base didn't already have marked as introduced.
50
+ */
51
+ async function reportFiles(base, options, io) {
52
+ const target = options.model ?? ".";
53
+ const [baseModel, model] = await Promise.all([
54
+ loadModel(base, { cwd: io.cwd }),
55
+ loadModel(target, { cwd: io.cwd }),
56
+ ]);
57
+ const key = (f) => `${f.code} ${f.message}`;
58
+ const before = new Set(check(baseModel).findings.map(key));
59
+ const findings = check(model).findings.map((f) => ({
60
+ ...f,
61
+ introduced: !before.has(key(f)),
62
+ }));
63
+ const r = prReport({
64
+ model,
65
+ base: baseModel,
66
+ changedFiles: [],
67
+ diff: diffModels(baseModel, model),
68
+ findings,
69
+ diagrams: options.diagrams !== false,
70
+ label: `${base} → ${target}`,
71
+ });
72
+ io.out((options.format ?? "markdown") === "json"
73
+ ? JSON.stringify({ ...r, markdown: undefined }, null, 2)
74
+ : r.markdown);
75
+ return 0;
76
+ }
77
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Io } from "../io.js";
2
+ export declare function schema(options: {
3
+ out?: string;
4
+ }, io: Io): Promise<number>;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/E"}
@@ -0,0 +1,15 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { archdocJsonSchema } from "@archdoc/spec";
4
+ export async function schema(options, io) {
5
+ const json = `${JSON.stringify(archdocJsonSchema(), null, 2)}\n`;
6
+ if (options.out) {
7
+ await writeFile(resolve(io.cwd, options.out), json);
8
+ io.err(`Wrote ${options.out}.`);
9
+ }
10
+ else {
11
+ io.out(json.trimEnd());
12
+ }
13
+ return 0;
14
+ }
15
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAyB,EAAE,EAAM;IAC5D,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACjE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Io } from "../io.js";
2
+ export interface CheckSealsOptions {
3
+ model?: string;
4
+ format?: string;
5
+ }
6
+ /**
7
+ * `archdoc check --seals`: the model facts whose code changed since they were sealed
8
+ * (and what changed), and the facts no one has sealed. Exits 1 when there are
9
+ * any, so an agent or CI knows the model needs a look.
10
+ */
11
+ export declare function checkSeals(options: CheckSealsOptions, io: Io): Promise<number>;
12
+ export interface SealCommandOptions {
13
+ model?: string;
14
+ all?: boolean;
15
+ by?: string;
16
+ dryRun?: boolean;
17
+ }
18
+ /**
19
+ * `archdoc seal [facts…]`: records that the model still describes the code
20
+ * these facts point at. Without facts, seals the ones no one has sealed and
21
+ * drops the ones that left the model; changed facts stay flagged until named,
22
+ * or until --all. Says what's still to check.
23
+ */
24
+ export declare function seal(facts: string[], options: SealCommandOptions, io: Io): Promise<number>;
25
+ //# sourceMappingURL=seal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../src/commands/seal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCpF;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAahG"}
@@ -0,0 +1,64 @@
1
+ import { sealAnswer, sealReport } from "@archdoc/analyzers";
2
+ import { formatSealStatus } from "@archdoc/core";
3
+ /**
4
+ * `archdoc check --seals`: the model facts whose code changed since they were sealed
5
+ * (and what changed), and the facts no one has sealed. Exits 1 when there are
6
+ * any, so an agent or CI knows the model needs a look.
7
+ */
8
+ export async function checkSeals(options, io) {
9
+ try {
10
+ const r = await sealReport(options.model ?? ".", io.cwd);
11
+ if (!r) {
12
+ io.err(`No ArchDoc model at ${options.model ?? "."}. Expected .archdoc/archdoc.yaml. Run archdoc init to start one.`);
13
+ return 2;
14
+ }
15
+ if (options.format === "json") {
16
+ io.out(JSON.stringify({
17
+ file: r.file,
18
+ sealed: r.recorded !== undefined,
19
+ error: r.error,
20
+ facts: r.statuses.map((s) => ({
21
+ key: s.fact.key,
22
+ label: s.fact.label,
23
+ state: s.state,
24
+ refs: s.fact.refs,
25
+ location: s.fact.location,
26
+ changes: s.changes,
27
+ problems: s.problems,
28
+ })),
29
+ }, null, 2));
30
+ }
31
+ else {
32
+ io.out(formatSealStatus(r.statuses, { file: r.file, hasSum: !!r.recorded, error: r.error }));
33
+ }
34
+ if (r.error)
35
+ return 2;
36
+ return r.recorded && r.statuses.some((s) => s.state !== "sealed") ? 1 : 0;
37
+ }
38
+ catch (err) {
39
+ io.err(err instanceof Error ? err.message : String(err));
40
+ return 2;
41
+ }
42
+ }
43
+ /**
44
+ * `archdoc seal [facts…]`: records that the model still describes the code
45
+ * these facts point at. Without facts, seals the ones no one has sealed and
46
+ * drops the ones that left the model; changed facts stay flagged until named,
47
+ * or until --all. Says what's still to check.
48
+ */
49
+ export async function seal(facts, options, io) {
50
+ try {
51
+ const r = await sealAnswer({ model: options.model, cwd: io.cwd }, { ...options, facts });
52
+ if (!r.ok) {
53
+ io.err(r.text);
54
+ return r.text.startsWith("No ArchDoc model") ? 2 : 1;
55
+ }
56
+ io.out(r.text);
57
+ return 0;
58
+ }
59
+ catch (err) {
60
+ io.err(err instanceof Error ? err.message : String(err));
61
+ return 2;
62
+ }
63
+ }
64
+ //# sourceMappingURL=seal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.js","sourceRoot":"","sources":["../../src/commands/seal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Io } from "../io.js";
2
+ export interface SiteOptions {
3
+ out?: string;
4
+ /** Compare with this branch or commit, as `archdoc view --base` does. */
5
+ base?: string;
6
+ }
7
+ /**
8
+ * `archdoc site`: the explorer as a static site for this repository, for any
9
+ * static host. With --base, it opens on the change since the merge base with
10
+ * that ref, with the same verdict and findings as the PR comment, so a pull
11
+ * request can link to it.
12
+ */
13
+ export declare function site(target: string, options: SiteOptions, io: Io): Promise<number>;
14
+ //# sourceMappingURL=site.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../src/commands/site.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGnC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCxF"}
@@ -0,0 +1,42 @@
1
+ import { cp, mkdir, rm, writeFile } from "node:fs/promises";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { findWebDir, modelResponse } from "../server.js";
4
+ /**
5
+ * `archdoc site`: the explorer as a static site for this repository, for any
6
+ * static host. With --base, it opens on the change since the merge base with
7
+ * that ref, with the same verdict and findings as the PR comment, so a pull
8
+ * request can link to it.
9
+ */
10
+ export async function site(target, options, io) {
11
+ try {
12
+ const webDir = findWebDir();
13
+ if (!webDir) {
14
+ io.err("The explorer isn't built. In the ArchDoc repo, run `pnpm build`, or set ARCHDOC_WEB_DIR.");
15
+ return 2;
16
+ }
17
+ const body = await modelResponse({ target, cwd: io.cwd, base: options.base });
18
+ if (!body) {
19
+ io.err(`No ArchDoc model at ${target}. Expected .archdoc/archdoc.yaml. Run archdoc init to start one.`);
20
+ return 1;
21
+ }
22
+ const out = resolve(io.cwd, options.out ?? "site");
23
+ await rm(out, { recursive: true, force: true });
24
+ await mkdir(out, { recursive: true });
25
+ await cp(webDir, out, { recursive: true });
26
+ await mkdir(join(out, "api"), { recursive: true });
27
+ await writeFile(join(out, "api", "model"), JSON.stringify({ ...body, watch: false }));
28
+ // GitHub Pages serves files and folders as they are.
29
+ await writeFile(join(out, ".nojekyll"), "");
30
+ const where = relative(io.cwd, out) || ".";
31
+ io.out(`✓ Wrote ${where}/.`);
32
+ io.out(options.base
33
+ ? ` Publish the folder with any static host, and link to it with #changes to open the change since ${options.base}.`
34
+ : " Publish the folder with any static host.");
35
+ return 0;
36
+ }
37
+ catch (err) {
38
+ io.err(err instanceof Error ? err.message : String(err));
39
+ return 2;
40
+ }
41
+ }
42
+ //# sourceMappingURL=site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../../src/commands/site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQzD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAc,EAAE,OAAoB,EAAE,EAAM;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,GAAG,CACJ,0FAA0F,CAC3F,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,EAAE,CAAC,GAAG,CACJ,uBAAuB,MAAM,kEAAkE,CAChG,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACtF,qDAAqD;QACrD,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;QAC3C,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;QAC7B,EAAE,CAAC,GAAG,CACJ,OAAO,CAAC,IAAI;YACV,CAAC,CAAC,oGAAoG,OAAO,CAAC,IAAI,GAAG;YACrH,CAAC,CAAC,4CAA4C,CACjD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}