@goodbones/browser 0.1.0-beta.1

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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/build/dts/index.d.ts +12 -0
  3. package/build/dts/index.d.ts.map +1 -0
  4. package/build/dts/main.d.ts +3 -0
  5. package/build/dts/main.d.ts.map +1 -0
  6. package/build/dts/model/atlas.d.ts +157 -0
  7. package/build/dts/model/atlas.d.ts.map +1 -0
  8. package/build/dts/model/campaigns.d.ts +141 -0
  9. package/build/dts/model/campaigns.d.ts.map +1 -0
  10. package/build/dts/server/collect.d.ts +16 -0
  11. package/build/dts/server/collect.d.ts.map +1 -0
  12. package/build/dts/server/compose.d.ts +13 -0
  13. package/build/dts/server/compose.d.ts.map +1 -0
  14. package/build/dts/server/export.d.ts +3 -0
  15. package/build/dts/server/export.d.ts.map +1 -0
  16. package/build/dts/server/handler.d.ts +6 -0
  17. package/build/dts/server/handler.d.ts.map +1 -0
  18. package/build/dts/server/serve.d.ts +15 -0
  19. package/build/dts/server/serve.d.ts.map +1 -0
  20. package/build/dts/server/site.d.ts +2 -0
  21. package/build/dts/server/site.d.ts.map +1 -0
  22. package/build/dts/server/source.d.ts +19 -0
  23. package/build/dts/server/source.d.ts.map +1 -0
  24. package/build/dts/server/vite-plugin.d.ts +8 -0
  25. package/build/dts/server/vite-plugin.d.ts.map +1 -0
  26. package/build/dts/server/watch.d.ts +10 -0
  27. package/build/dts/server/watch.d.ts.map +1 -0
  28. package/build/esm/index.js +14 -0
  29. package/build/esm/index.js.map +1 -0
  30. package/build/esm/main.js +134 -0
  31. package/build/esm/main.js.map +1 -0
  32. package/build/esm/model/atlas.js +431 -0
  33. package/build/esm/model/atlas.js.map +1 -0
  34. package/build/esm/model/campaigns.js +181 -0
  35. package/build/esm/model/campaigns.js.map +1 -0
  36. package/build/esm/server/collect.js +83 -0
  37. package/build/esm/server/collect.js.map +1 -0
  38. package/build/esm/server/compose.js +50 -0
  39. package/build/esm/server/compose.js.map +1 -0
  40. package/build/esm/server/export.js +19 -0
  41. package/build/esm/server/export.js.map +1 -0
  42. package/build/esm/server/handler.js +67 -0
  43. package/build/esm/server/handler.js.map +1 -0
  44. package/build/esm/server/serve.js +80 -0
  45. package/build/esm/server/serve.js.map +1 -0
  46. package/build/esm/server/site.js +6 -0
  47. package/build/esm/server/site.js.map +1 -0
  48. package/build/esm/server/source.js +67 -0
  49. package/build/esm/server/source.js.map +1 -0
  50. package/build/esm/server/vite-plugin.js +21 -0
  51. package/build/esm/server/vite-plugin.js.map +1 -0
  52. package/build/esm/server/watch.js +56 -0
  53. package/build/esm/server/watch.js.map +1 -0
  54. package/build/site/_astro/Browser.yxldcnQ3.js +3 -0
  55. package/build/site/_astro/client.Buyw3Q1S.js +9 -0
  56. package/build/site/_astro/index.DQrWs1cb.css +1 -0
  57. package/build/site/_astro/react.DJY1zw8Z.js +1 -0
  58. package/build/site/favicon.svg +1 -0
  59. package/build/site/index.html +8 -0
  60. package/package.json +78 -0
  61. package/src/app/components/Browser.tsx +153 -0
  62. package/src/app/components/architecture/ArchitectureBrowser.tsx +240 -0
  63. package/src/app/components/architecture/Detail.tsx +655 -0
  64. package/src/app/components/architecture/ManifestPane.tsx +178 -0
  65. package/src/app/components/architecture/Tree.tsx +205 -0
  66. package/src/app/components/architecture/rows.ts +181 -0
  67. package/src/app/components/architecture/selection.ts +6 -0
  68. package/src/app/components/campaigns/CampaignBrowser.tsx +146 -0
  69. package/src/app/components/campaigns/Detail.tsx +653 -0
  70. package/src/app/components/campaigns/Ladder.tsx +326 -0
  71. package/src/app/components/campaigns/pick.ts +7 -0
  72. package/src/app/components/lib/data.ts +132 -0
  73. package/src/app/pages/index.astro +34 -0
  74. package/src/app/public/favicon.svg +1 -0
  75. package/src/app/styles/theme.css +993 -0
  76. package/src/index.ts +37 -0
  77. package/src/main.ts +155 -0
  78. package/src/model/atlas.ts +751 -0
  79. package/src/model/campaigns.ts +376 -0
  80. package/src/server/collect.ts +132 -0
  81. package/src/server/compose.ts +79 -0
  82. package/src/server/export.ts +24 -0
  83. package/src/server/handler.ts +77 -0
  84. package/src/server/serve.ts +100 -0
  85. package/src/server/site.ts +6 -0
  86. package/src/server/source.ts +89 -0
  87. package/src/server/vite-plugin.ts +32 -0
  88. package/src/server/watch.ts +65 -0
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import * as path from "node:path";
5
+ import { collect } from "./server/collect.js";
6
+ import { exportSite } from "./server/export.js";
7
+ import { makeHandler } from "./server/handler.js";
8
+ import { serve } from "./server/serve.js";
9
+ import { SITE_DIR } from "./server/site.js";
10
+ import { makeSource } from "./server/source.js";
11
+ // goodbones-browser [serve] [<root>...] [--port N] [--host H] [--open] [--no-nudge]
12
+ // goodbones-browser build --out <dir> [<root>...] [--no-nudge]
13
+ //
14
+ // Run from the repository's root, as `architecture` is. `serve` (the
15
+ // default) opens the Architecture Browser and the Campaign Browser over the
16
+ // repository and redraws them as it changes; `build` writes the same page
17
+ // with the models as of now, for a static host.
18
+ const USAGE = [
19
+ "goodbones-browser [serve] [<root>...] [--port <n>] [--host <h>] [--open] [--no-nudge]",
20
+ "goodbones-browser build --out <dir> [<root>...] [--no-nudge]",
21
+ "",
22
+ "Roots default to `packages`, as the architecture CLI's do. ARCHITECTURE_CONFIG names",
23
+ "the manifest when it is not architecture.yaml at the root.",
24
+ ].join("\n");
25
+ const parse = (argv) => {
26
+ let command = "serve";
27
+ const roots = [];
28
+ let port = 4321;
29
+ let host = "127.0.0.1";
30
+ let open = false;
31
+ let out = null;
32
+ let nudge = true;
33
+ const rest = [...argv];
34
+ if (rest[0] === "serve" || rest[0] === "build")
35
+ command = rest.shift();
36
+ while (rest.length > 0) {
37
+ const argument = rest.shift();
38
+ switch (argument) {
39
+ case "--port": {
40
+ const value = Number(rest.shift());
41
+ if (!Number.isInteger(value) || value < 0)
42
+ throw new Error("--port needs a number");
43
+ port = value;
44
+ break;
45
+ }
46
+ case "--host":
47
+ host = rest.shift() ?? host;
48
+ break;
49
+ case "--open":
50
+ open = true;
51
+ break;
52
+ case "--out":
53
+ out = rest.shift() ?? null;
54
+ break;
55
+ case "--no-nudge":
56
+ nudge = false;
57
+ break;
58
+ case "--help":
59
+ case "-h":
60
+ process.stdout.write(`${USAGE}\n`);
61
+ process.exit(0);
62
+ break;
63
+ default:
64
+ if (argument.startsWith("--"))
65
+ throw new Error(`unknown flag ${argument}\n\n${USAGE}`);
66
+ roots.push(argument);
67
+ }
68
+ }
69
+ if (command === "build" && out === null)
70
+ throw new Error(`build needs --out <dir>\n\n${USAGE}`);
71
+ return { command, roots: roots.length > 0 ? roots : ["packages"], port, host, open, out, nudge };
72
+ };
73
+ // Relative when it reads well, absolute when it would climb out of the repo.
74
+ const describePath = (repoRoot, target) => {
75
+ const relative = path.relative(repoRoot, target);
76
+ if (relative === "")
77
+ return ".";
78
+ return relative.startsWith("..") ? target : relative;
79
+ };
80
+ const openBrowser = (url) => {
81
+ const [bin, args] = process.platform === "darwin"
82
+ ? ["open", [url]]
83
+ : process.platform === "win32"
84
+ ? ["cmd", ["/c", "start", "", url]]
85
+ : ["xdg-open", [url]];
86
+ spawn(bin, args, { stdio: "ignore", detached: true })
87
+ .on("error", () => undefined)
88
+ .unref();
89
+ };
90
+ const main = async () => {
91
+ const args = parse(process.argv.slice(2));
92
+ const repoRoot = process.cwd();
93
+ const configFilename = process.env.ARCHITECTURE_CONFIG;
94
+ if (!existsSync(SITE_DIR)) {
95
+ throw new Error(`the page is not built: ${SITE_DIR} is missing. In this repository, run \`pnpm exec nx build @goodbones/browser\`.`);
96
+ }
97
+ if (args.command === "build") {
98
+ const out = path.resolve(repoRoot, args.out ?? "");
99
+ const collected = await collect({ repoRoot, roots: args.roots, configFilename, nudge: false });
100
+ exportSite(SITE_DIR, out, collected);
101
+ process.stdout.write(`wrote ${describePath(repoRoot, out)}: ${String(collected.atlas.files.length)} files, ${String(collected.campaigns.campaigns.length)} campaigns. Serve it from the root of a host.\n`);
102
+ return;
103
+ }
104
+ const source = makeSource({
105
+ repoRoot,
106
+ roots: args.roots,
107
+ configFilename,
108
+ nudge: args.nudge,
109
+ watch: true,
110
+ });
111
+ const served = await serve({
112
+ siteDir: SITE_DIR,
113
+ handler: makeHandler(source),
114
+ port: args.port,
115
+ host: args.host,
116
+ });
117
+ process.stdout.write(`goodbones-browser: ${served.url} over ${path.basename(repoRoot)} (${args.roots.join(", ")}); watching for changes.\n`);
118
+ if (args.open)
119
+ openBrowser(served.url);
120
+ const stop = () => {
121
+ source.close();
122
+ void served.close().then(() => process.exit(0));
123
+ };
124
+ process.once("SIGINT", stop);
125
+ process.once("SIGTERM", stop);
126
+ };
127
+ main().catch((cause) => {
128
+ const message = typeof cause === "object" && cause !== null && "message" in cause
129
+ ? String(cause.message)
130
+ : String(cause);
131
+ process.stderr.write(`\n${message}\n`);
132
+ process.exitCode = 1;
133
+ });
134
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,431 @@
1
+ import { anchored, cyclesIn, evaluateGraph, evaluateMemberSite, evaluateResolvedEdge, evaluateSelectedBindings, evaluateStructure, evaluateSurface, expandAliases, exportRulesSelecting, fingerprintOf, firstFromMatch, formatMessage, globToRegexSource, hasGraphRules, matchesAny, memberRulesSelecting, prefixed, requiredSiblingsOf, rulesSelecting, slackOf, surfaceRulesSelecting, } from "@goodbones/core";
2
+ import * as Result from "effect/Result";
3
+ const FOLDER_KEY = /\/$/;
4
+ const ALTERNATIVE = /\s*\|\s*/;
5
+ const WILDCARD = /[*{]/;
6
+ const stripSlash = (key) => key.replace(FOLDER_KEY, "");
7
+ const alternativesOf = (key) => key
8
+ .split(ALTERNATIVE)
9
+ .map(stripSlash)
10
+ .filter((one) => one !== "");
11
+ const escapeRegExp = (literal) => literal.replace(/[.+^$()|[\]\\*?{}]/g, "\\$&");
12
+ const dirnameOf = (file) => {
13
+ const at = file.lastIndexOf("/");
14
+ return at === -1 ? "" : file.slice(0, at);
15
+ };
16
+ const basenameOf = (file) => file.slice(file.lastIndexOf("/") + 1);
17
+ const positionAt = (locate, manifestPath, path) => {
18
+ const found = locate?.(path);
19
+ if (found === null || found === undefined)
20
+ return null;
21
+ const directory = dirnameOf(manifestPath);
22
+ const file = found.file === undefined
23
+ ? manifestPath
24
+ : directory === ""
25
+ ? found.file
26
+ : `${directory}/${found.file}`;
27
+ return { file, line: found.line, column: found.column };
28
+ };
29
+ const walkTree = (policy, locate, manifestPath, unusedKeys) => {
30
+ const aliases = policy.config.aliases ?? {};
31
+ const walked = [];
32
+ const allowlistOf = (id) => policy.importRules.find((rule) => rule.name === `${id}/imports`);
33
+ const ruleNames = [
34
+ ...policy.importRules.map((rule) => rule.name),
35
+ ...policy.memberRules.map((rule) => rule.name),
36
+ ...policy.surfaceRules.map((rule) => rule.name),
37
+ ...policy.structure.roots.map((rule) => rule.name),
38
+ ...policy.structure.folders.map((rule) => rule.name),
39
+ ...policy.structure.parity.map((rule) => rule.name),
40
+ ...policy.structure.naming.map((rule) => rule.name),
41
+ ];
42
+ const walk = (key, node, parent, id, parentId, path, depth, siblings, nodePath) => {
43
+ const literalSiblings = siblings
44
+ .filter((sibling) => sibling !== key)
45
+ .flatMap(alternativesOf)
46
+ .filter((sibling) => !WILDCARD.test(sibling));
47
+ const alternatives = alternativesOf(key).map((one) => expandAliases(one, aliases));
48
+ const [first = ""] = alternatives;
49
+ const compiledFirst = globToRegexSource(first, parent.captures, {
50
+ declaring: true,
51
+ nextGroup: parent.nextGroup,
52
+ });
53
+ const source = alternatives.length === 1
54
+ ? compiledFirst.source
55
+ : `(?:${alternatives
56
+ .map((one) => globToRegexSource(one, parent.captures, {
57
+ declaring: false,
58
+ nextGroup: parent.nextGroup,
59
+ }).source)
60
+ .join("|")})`;
61
+ const guarded = literalSiblings.length > 0 && WILDCARD.test(first)
62
+ ? `(?!(?:${literalSiblings.map(escapeRegExp).join("|")})(?:/|$))${source}`
63
+ : source;
64
+ const pathSource = parent.pathSource === "" ? guarded : `${parent.pathSource}/${guarded}`;
65
+ const nextGroup = parent.nextGroup +
66
+ (Object.keys(compiledFirst.captures).length - Object.keys(parent.captures).length);
67
+ const frame = { pathSource, captures: compiledFirst.captures, nextGroup };
68
+ const isFolder = FOLDER_KEY.test(key) || node.children !== undefined;
69
+ const self = new RegExp(anchored(pathSource));
70
+ const under = new RegExp(prefixed(`${pathSource}/`));
71
+ const children = Object.entries(node.children ?? {});
72
+ const childIds = children.map(([childKey]) => `${id}/${alternativesOf(childKey)[0] ?? ""}`);
73
+ const allowlist = allowlistOf(id);
74
+ const own = (allowlist?.allowances ?? []).filter((one) => one.node === id);
75
+ const imports = node.imports === undefined
76
+ ? null
77
+ : {
78
+ message: node.imports.message ?? null,
79
+ reset: node.imports.reset === true,
80
+ unrestricted: node.imports.unrestricted === true,
81
+ allowances: own.map((one) => ({
82
+ kind: one.kind,
83
+ entry: one.entry,
84
+ expanded: one.kind === "allow" ? expandAliases(one.entry, aliases) : one.entry,
85
+ fragment: one.fragment ?? null,
86
+ used: !unusedKeys.has(`${one.fragment ?? one.node}\u0000${one.kind}\u0000${one.entry}`),
87
+ })),
88
+ deny: (node.imports.deny ?? []).map((one) => ({
89
+ match: typeof one.match === "string" ? [one.match] : [...one.match],
90
+ message: one.message,
91
+ })),
92
+ };
93
+ walked.push({
94
+ node: {
95
+ id,
96
+ key,
97
+ path,
98
+ parent: parentId,
99
+ depth,
100
+ folder: isFolder,
101
+ message: node.message ?? null,
102
+ layout: node.layout === "open" ? "open" : "enumerated",
103
+ partial: node.partial === true,
104
+ position: positionAt(locate, manifestPath, nodePath),
105
+ imports,
106
+ importedBy: node.importedBy === undefined
107
+ ? null
108
+ : {
109
+ message: node.importedBy.message,
110
+ allow: typeof node.importedBy.allow === "string"
111
+ ? [node.importedBy.allow]
112
+ : [...node.importedBy.allow],
113
+ },
114
+ members: (node.members ?? []).map((one) => ({
115
+ subject: one.subject,
116
+ message: one.message,
117
+ })),
118
+ surface: (node.surface ?? []).map((one) => ({ message: one.message })),
119
+ requires: [...(node.requires ?? [])],
120
+ children: childIds,
121
+ rules: ruleNames.filter((name) => name.startsWith(`${id}/`) && !name.slice(id.length + 1).includes("/")),
122
+ files: 0,
123
+ },
124
+ matches: isFolder ? (file) => under.test(file) : (file) => self.test(file),
125
+ isExactly: (folder) => isFolder && self.test(folder),
126
+ wildcards: (first.match(/[*{]/g) ?? []).length,
127
+ });
128
+ for (const [childKey, child] of children) {
129
+ walk(childKey, child, frame, `${id}/${alternativesOf(childKey)[0] ?? ""}`, id, `${path}${childKey}`, depth + 1, children.map(([one]) => one), [...nodePath, "children", childKey]);
130
+ }
131
+ };
132
+ const roots = Object.entries(policy.config.tree);
133
+ for (const [key, node] of roots) {
134
+ walk(key, node, { pathSource: "", captures: {}, nextGroup: 1 }, stripSlash(key)
135
+ .replace(/[^a-zA-Z0-9]+/g, "-")
136
+ .replace(/^-|-$/g, ""), null, key, 0, roots.map(([one]) => one), ["tree", key]);
137
+ }
138
+ return walked;
139
+ };
140
+ // The deepest node whose path covers the file, root first. Ties at a depth
141
+ // go to the key with fewer wildcards: `src/` over `**/`.
142
+ const chainOf = (nodes, file) => {
143
+ const matching = nodes.filter((one) => one.matches(file));
144
+ const byDepth = new Map();
145
+ for (const one of matching) {
146
+ const held = byDepth.get(one.node.depth);
147
+ if (held === undefined || one.wildcards < held.wildcards)
148
+ byDepth.set(one.node.depth, one);
149
+ }
150
+ const chain = [...byDepth.values()].sort((a, b) => a.node.depth - b.node.depth);
151
+ // A node only governs through its ancestors: drop anything whose parent is
152
+ // not the previous link.
153
+ const linked = [];
154
+ for (const one of chain) {
155
+ const previous = linked[linked.length - 1];
156
+ if (previous === undefined ? one.node.parent === null : one.node.parent === previous.id) {
157
+ linked.push(one.node);
158
+ }
159
+ }
160
+ return linked;
161
+ };
162
+ const admittedBy = (allowlist, captures, target) => {
163
+ if (allowlist === undefined || captures === null)
164
+ return null;
165
+ for (const allowance of allowlist.allowances) {
166
+ if (allowance.kind === "external") {
167
+ if (target.kind === "external" && target.package === allowance.entry) {
168
+ return {
169
+ node: allowance.node,
170
+ entry: allowance.entry,
171
+ fragment: allowance.fragment ?? null,
172
+ };
173
+ }
174
+ continue;
175
+ }
176
+ if (allowance.pattern !== undefined && matchesAny([allowance.pattern], captures, target.path)) {
177
+ return { node: allowance.node, entry: allowance.entry, fragment: allowance.fragment ?? null };
178
+ }
179
+ }
180
+ return null;
181
+ };
182
+ export const buildAtlas = (input) => {
183
+ const { factsOf, policy } = input;
184
+ const known = new Set(input.files);
185
+ const violations = [];
186
+ const unresolved = [];
187
+ const observed = [];
188
+ const edgeMap = new Map();
189
+ const externalsOf = new Map();
190
+ const builtinsOf = new Map();
191
+ const importRulesOf = new Map();
192
+ const requiresOf = new Map();
193
+ const outside = new Set();
194
+ const graphEdges = new Map();
195
+ for (const file of input.files) {
196
+ const facts = factsOf(file);
197
+ const selectedImports = rulesSelecting(policy.importRules, file);
198
+ const selectedExports = exportRulesSelecting(policy.exportRules, file);
199
+ const selectedMembers = memberRulesSelecting(policy.memberRules, file);
200
+ const selectedSurface = surfaceRulesSelecting(policy.surfaceRules, file);
201
+ const allowlist = selectedImports
202
+ .map(([rule]) => rule)
203
+ .find((rule) => rule.to.length === 0 && rule.toNot.length > 0);
204
+ const captures = allowlist === undefined ? null : firstFromMatch(allowlist, file);
205
+ importRulesOf.set(file, selectedImports.map(([rule]) => rule.name));
206
+ for (const violation of evaluateStructure(policy.structure, policy.fileSystem, file)) {
207
+ violations.push(violation);
208
+ }
209
+ for (const violation of evaluateSurface(selectedSurface, file, facts.exportSites)) {
210
+ violations.push(violation);
211
+ }
212
+ for (const site of facts.memberSites) {
213
+ for (const violation of evaluateMemberSite(selectedMembers, site))
214
+ violations.push(violation);
215
+ }
216
+ requiresOf.set(file, policy.structure.parity
217
+ .filter((rule) => rule.file.some((pattern) => pattern.test(file)) &&
218
+ !rule.fileNot.some((pattern) => pattern.test(file)))
219
+ .flatMap((rule) => requiredSiblingsOf(rule, file).map((sibling) => ({
220
+ sibling,
221
+ present: policy.fileSystem.exists(sibling),
222
+ rule: rule.name,
223
+ }))));
224
+ const targets = new Set();
225
+ for (const specifier of facts.specifiers) {
226
+ const resolved = policy.resolver.resolve(file, specifier);
227
+ if (Result.isFailure(resolved)) {
228
+ if (policy.config.resolve.unresolved !== "off" &&
229
+ !policy.ignoreUnresolved.some((pattern) => pattern.test(specifier))) {
230
+ unresolved.push({ file, specifier, detail: resolved.failure.detail });
231
+ }
232
+ continue;
233
+ }
234
+ const target = resolved.success;
235
+ const refused = selectedImports.length === 0 ? [] : evaluateResolvedEdge(selectedImports, file, target);
236
+ for (const violation of refused)
237
+ violations.push(violation);
238
+ if (selectedImports.length > 0)
239
+ observed.push({ importer: file, target });
240
+ const status = refused.length > 0 ? "refused" : allowlist === undefined ? "ungoverned" : "allowed";
241
+ const bound = facts.bindings.get(specifier) ?? [];
242
+ const exported = evaluateSelectedBindings(selectedExports, policy.resolver, {
243
+ importer: file,
244
+ specifier,
245
+ bindings: bound,
246
+ });
247
+ if (!Result.isFailure(exported)) {
248
+ for (const { violation } of exported.success)
249
+ violations.push(violation);
250
+ }
251
+ if (target.kind === "builtin") {
252
+ const held = builtinsOf.get(file) ?? [];
253
+ if (!held.includes(target.path))
254
+ held.push(target.path);
255
+ builtinsOf.set(file, held);
256
+ continue;
257
+ }
258
+ if (target.kind === "external") {
259
+ const name = target.package ?? target.path;
260
+ const held = externalsOf.get(file) ?? [];
261
+ const existing = held.find((one) => one.package === name);
262
+ if (existing === undefined) {
263
+ const by = admittedBy(allowlist, captures, target);
264
+ held.push({
265
+ package: name,
266
+ specifiers: [specifier],
267
+ status,
268
+ admittedBy: by === null ? null : { node: by.node, entry: by.entry },
269
+ });
270
+ }
271
+ else {
272
+ held.splice(held.indexOf(existing), 1, {
273
+ ...existing,
274
+ specifiers: [...existing.specifiers, specifier],
275
+ status: existing.status === "refused" ? "refused" : status,
276
+ });
277
+ }
278
+ externalsOf.set(file, held);
279
+ continue;
280
+ }
281
+ if (!known.has(target.path))
282
+ outside.add(target.path);
283
+ else
284
+ targets.add(target.path);
285
+ const key = `${file}\u0000${target.path}`;
286
+ const held = edgeMap.get(key);
287
+ const refusedBy = refused.map((violation) => ({
288
+ rule: violation.ruleName,
289
+ message: formatMessage(violation),
290
+ }));
291
+ if (held === undefined) {
292
+ edgeMap.set(key, {
293
+ from: file,
294
+ to: target.path,
295
+ specifiers: [specifier],
296
+ status,
297
+ admittedBy: admittedBy(allowlist, captures, target),
298
+ refusedBy,
299
+ });
300
+ }
301
+ else {
302
+ edgeMap.set(key, {
303
+ ...held,
304
+ specifiers: [...held.specifiers, specifier],
305
+ status: held.status === "refused" || status === "refused" ? "refused" : held.status,
306
+ refusedBy: [
307
+ ...held.refusedBy,
308
+ ...refusedBy.filter((one) => !held.refusedBy.some((two) => two.rule === one.rule)),
309
+ ],
310
+ });
311
+ }
312
+ }
313
+ graphEdges.set(file, [...targets]);
314
+ }
315
+ const graph = { files: input.files, edges: graphEdges };
316
+ if (hasGraphRules(policy.graph)) {
317
+ for (const violation of evaluateGraph(policy.graph, graph))
318
+ violations.push(violation);
319
+ }
320
+ const cycles = cyclesIn(graph).length;
321
+ const slack = slackOf(policy.importRules, observed, input.files);
322
+ const unusedKeys = new Set(slack.slack.map((one) => `${one.fragment ?? one.node}\u0000${one.kind}\u0000${one.entry}`));
323
+ const nodes = walkTree(policy, input.locate, input.manifestPath, unusedKeys);
324
+ const governed = new Map();
325
+ const violationsByFile = new Map();
326
+ for (const violation of violations) {
327
+ violationsByFile.set(violation.file, (violationsByFile.get(violation.file) ?? 0) + 1);
328
+ }
329
+ const fileOf = (path, walked) => {
330
+ const chain = walked ? chainOf(nodes, path) : [];
331
+ const node = chain[chain.length - 1]?.id ?? null;
332
+ if (node !== null)
333
+ governed.set(node, (governed.get(node) ?? 0) + 1);
334
+ return {
335
+ path,
336
+ name: basenameOf(path),
337
+ folder: dirnameOf(path),
338
+ walked,
339
+ node,
340
+ chain: chain.map((one) => one.id),
341
+ importRules: importRulesOf.get(path) ?? [],
342
+ requires: requiresOf.get(path) ?? [],
343
+ externals: externalsOf.get(path) ?? [],
344
+ builtins: builtinsOf.get(path) ?? [],
345
+ violations: violationsByFile.get(path) ?? 0,
346
+ };
347
+ };
348
+ const files = [
349
+ ...input.files.map((path) => fileOf(path, true)),
350
+ ...[...outside].sort().map((path) => fileOf(path, false)),
351
+ ].sort((a, b) => a.path.localeCompare(b.path));
352
+ const folderPaths = new Set();
353
+ for (const file of files) {
354
+ let folder = file.folder;
355
+ while (folder !== "" && !folderPaths.has(folder)) {
356
+ folderPaths.add(folder);
357
+ folder = dirnameOf(folder);
358
+ }
359
+ }
360
+ const folders = [...folderPaths].sort().map((path) => {
361
+ const chain = chainOf(nodes, `${path}/zzprobe`);
362
+ return {
363
+ path,
364
+ name: basenameOf(path),
365
+ parent: dirnameOf(path) === "" ? null : dirnameOf(path),
366
+ depth: path.split("/").length - 1,
367
+ node: chain[chain.length - 1]?.id ?? null,
368
+ declares: nodes.filter((one) => one.isExactly(path)).map((one) => one.node.id),
369
+ };
370
+ });
371
+ const position = (path) => positionAt(input.locate, input.manifestPath, path);
372
+ const rules = [
373
+ ...(policy.config.exports ?? []).map((rule, index) => ({
374
+ family: "exports",
375
+ name: rule.name,
376
+ message: rule.message,
377
+ position: position(["exports", index]),
378
+ })),
379
+ ...(policy.config.graph?.cycles ?? []).map((rule, index) => ({
380
+ family: "cycles",
381
+ name: rule.name,
382
+ message: rule.message,
383
+ position: position(["graph", "cycles", index]),
384
+ })),
385
+ ...(policy.config.graph?.orphans ?? []).map((rule, index) => ({
386
+ family: "orphans",
387
+ name: rule.name,
388
+ message: rule.message,
389
+ position: position(["graph", "orphans", index]),
390
+ })),
391
+ ...(policy.config.graph?.reach ?? []).map((rule, index) => ({
392
+ family: "reach",
393
+ name: rule.name,
394
+ message: rule.message,
395
+ position: position(["graph", "reach", index]),
396
+ })),
397
+ ];
398
+ return {
399
+ version: 1,
400
+ name: input.name,
401
+ generatedAt: new Date(input.now).toISOString(),
402
+ roots: input.roots,
403
+ manifest: {
404
+ path: input.manifestPath,
405
+ files: input.manifestFiles,
406
+ aliases: policy.config.aliases ?? {},
407
+ nodes: nodes.map((one) => ({ ...one.node, files: governed.get(one.node.id) ?? 0 })),
408
+ rules,
409
+ },
410
+ files,
411
+ folders,
412
+ edges: [...edgeMap.values()].sort((a, b) => {
413
+ const byFrom = a.from.localeCompare(b.from);
414
+ return byFrom !== 0 ? byFrom : a.to.localeCompare(b.to);
415
+ }),
416
+ violations: violations
417
+ .map((violation) => ({
418
+ fingerprint: fingerprintOf(violation),
419
+ kind: violation.kind,
420
+ rule: violation.ruleName,
421
+ file: violation.file,
422
+ subject: violation.subject,
423
+ message: formatMessage(violation),
424
+ baselined: policy.baseline.isBaselined(violation),
425
+ }))
426
+ .sort((a, b) => a.fingerprint.localeCompare(b.fingerprint)),
427
+ unresolved,
428
+ cycles,
429
+ };
430
+ };
431
+ //# sourceMappingURL=atlas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlas.js","sourceRoot":"","sources":["../../../src/model/atlas.ts"],"names":[],"mappings":"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"}