@intentset/architecture 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 (91) hide show
  1. package/dist/baseline.d.ts +39 -0
  2. package/dist/baseline.d.ts.map +1 -0
  3. package/dist/baseline.js +104 -0
  4. package/dist/baseline.js.map +1 -0
  5. package/dist/boundaries.d.ts +63 -0
  6. package/dist/boundaries.d.ts.map +1 -0
  7. package/dist/boundaries.js +436 -0
  8. package/dist/boundaries.js.map +1 -0
  9. package/dist/check.d.ts +73 -0
  10. package/dist/check.d.ts.map +1 -0
  11. package/dist/check.js +130 -0
  12. package/dist/check.js.map +1 -0
  13. package/dist/claims.d.ts +24 -0
  14. package/dist/claims.d.ts.map +1 -0
  15. package/dist/claims.js +201 -0
  16. package/dist/claims.js.map +1 -0
  17. package/dist/config.d.ts +53 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +159 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/dependencies.d.ts +30 -0
  22. package/dist/dependencies.d.ts.map +1 -0
  23. package/dist/dependencies.js +179 -0
  24. package/dist/dependencies.js.map +1 -0
  25. package/dist/exceptions.d.ts +43 -0
  26. package/dist/exceptions.d.ts.map +1 -0
  27. package/dist/exceptions.js +233 -0
  28. package/dist/exceptions.js.map +1 -0
  29. package/dist/extract.d.ts +24 -0
  30. package/dist/extract.d.ts.map +1 -0
  31. package/dist/extract.js +316 -0
  32. package/dist/extract.js.map +1 -0
  33. package/dist/finding.d.ts +39 -0
  34. package/dist/finding.d.ts.map +1 -0
  35. package/dist/finding.js +29 -0
  36. package/dist/finding.js.map +1 -0
  37. package/dist/imports.d.ts +30 -0
  38. package/dist/imports.d.ts.map +1 -0
  39. package/dist/imports.js +48 -0
  40. package/dist/imports.js.map +1 -0
  41. package/dist/index.d.ts +23 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +22 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/layers.d.ts +38 -0
  46. package/dist/layers.d.ts.map +1 -0
  47. package/dist/layers.js +41 -0
  48. package/dist/layers.js.map +1 -0
  49. package/dist/ownership.d.ts +25 -0
  50. package/dist/ownership.d.ts.map +1 -0
  51. package/dist/ownership.js +97 -0
  52. package/dist/ownership.js.map +1 -0
  53. package/dist/paths.d.ts +18 -0
  54. package/dist/paths.d.ts.map +1 -0
  55. package/dist/paths.js +54 -0
  56. package/dist/paths.js.map +1 -0
  57. package/dist/patterns.d.ts +25 -0
  58. package/dist/patterns.d.ts.map +1 -0
  59. package/dist/patterns.js +101 -0
  60. package/dist/patterns.js.map +1 -0
  61. package/dist/regions.d.ts +85 -0
  62. package/dist/regions.d.ts.map +1 -0
  63. package/dist/regions.js +144 -0
  64. package/dist/regions.js.map +1 -0
  65. package/dist/resolve.d.ts +53 -0
  66. package/dist/resolve.d.ts.map +1 -0
  67. package/dist/resolve.js +268 -0
  68. package/dist/resolve.js.map +1 -0
  69. package/dist/tsconfig.d.ts +42 -0
  70. package/dist/tsconfig.d.ts.map +1 -0
  71. package/dist/tsconfig.js +186 -0
  72. package/dist/tsconfig.js.map +1 -0
  73. package/package.json +36 -0
  74. package/src/baseline.ts +126 -0
  75. package/src/boundaries.ts +499 -0
  76. package/src/check.ts +197 -0
  77. package/src/claims.ts +229 -0
  78. package/src/config.ts +212 -0
  79. package/src/dependencies.ts +211 -0
  80. package/src/exceptions.ts +269 -0
  81. package/src/extract.ts +344 -0
  82. package/src/finding.ts +64 -0
  83. package/src/imports.ts +77 -0
  84. package/src/index.ts +58 -0
  85. package/src/layers.ts +67 -0
  86. package/src/ownership.ts +135 -0
  87. package/src/paths.ts +53 -0
  88. package/src/patterns.ts +95 -0
  89. package/src/regions.ts +243 -0
  90. package/src/resolve.ts +283 -0
  91. package/src/tsconfig.ts +198 -0
@@ -0,0 +1,268 @@
1
+ import { basename, dirname, joinPath } from "./paths.js";
2
+ import { compareStrings } from "./patterns.js";
3
+ import { matchAlias, TsConfigs } from "./tsconfig.js";
4
+ const JS_REWRITES = [
5
+ [".js", [".ts", ".tsx", ".d.ts"]],
6
+ [".jsx", [".tsx"]],
7
+ [".mjs", [".mts", ".d.mts"]],
8
+ [".cjs", [".cts", ".d.cts"]],
9
+ ];
10
+ const APPENDED = [".ts", ".tsx", ".d.ts", ".js", ".jsx", ".mts", ".cts", ".mjs", ".cjs"];
11
+ const INDEXES = ["index.ts", "index.tsx", "index.d.ts", "index.js", "index.jsx"];
12
+ /** A bare specifier that npm or node could serve: `name`, `name/sub`, `@scope/name/sub`, `node:fs`. */
13
+ const PACKAGE_NAME = /^(?:node:)?(?:@[a-z0-9][\w.~-]*\/)?[a-z0-9][\w.~-]*(?:\/.*)?$/i;
14
+ export class Resolver {
15
+ tsconfigs;
16
+ notes = [];
17
+ files;
18
+ conditions;
19
+ packages = [];
20
+ constructor(files, config) {
21
+ this.files = files;
22
+ this.tsconfigs = new TsConfigs(files);
23
+ this.conditions = [...config.conditions, "types", "import", "default", "require", "node"];
24
+ const seen = new Set();
25
+ for (const path of [...files.keys()].sort(compareStrings)) {
26
+ if (basename(path) !== "package.json")
27
+ continue;
28
+ let manifest;
29
+ try {
30
+ manifest = JSON.parse(files.get(path));
31
+ }
32
+ catch (error) {
33
+ this.notes.push({
34
+ path,
35
+ message: `does not parse (${error.message}), so its package cannot be resolved`,
36
+ });
37
+ continue;
38
+ }
39
+ if (typeof manifest !== "object" || manifest === null || Array.isArray(manifest))
40
+ continue;
41
+ const name = manifest.name;
42
+ if (typeof name !== "string" || name === "")
43
+ continue;
44
+ if (seen.has(name)) {
45
+ this.notes.push({ path, message: `declares package ${name} a second time; the first, by path, is used` });
46
+ continue;
47
+ }
48
+ seen.add(name);
49
+ this.packages.push({ name, dir: dirname(path), manifest: manifest });
50
+ }
51
+ this.packages.sort((a, b) => b.name.length - a.name.length || compareStrings(a.name, b.name));
52
+ }
53
+ /** The first existing file a module path names. */
54
+ probe(base) {
55
+ const has = (path) => this.files.has(path);
56
+ for (const [extension, alternatives] of JS_REWRITES) {
57
+ if (!base.endsWith(extension))
58
+ continue;
59
+ const stem = base.slice(0, -extension.length);
60
+ for (const alternative of alternatives)
61
+ if (has(stem + alternative))
62
+ return stem + alternative;
63
+ }
64
+ if (has(base))
65
+ return base;
66
+ for (const extension of APPENDED)
67
+ if (has(base + extension))
68
+ return base + extension;
69
+ for (const index of INDEXES) {
70
+ const candidate = base === "" ? index : `${base}/${index}`;
71
+ if (has(candidate))
72
+ return candidate;
73
+ }
74
+ return null;
75
+ }
76
+ resolve(from, specifier) {
77
+ if (specifier.startsWith("/")) {
78
+ return {
79
+ to: null,
80
+ via: "relative",
81
+ wildcard: false,
82
+ problem: "is an absolute path, which no repository-relative tree can resolve",
83
+ };
84
+ }
85
+ if (specifier === "." || specifier === ".." || specifier.startsWith("./") || specifier.startsWith("../")) {
86
+ const joined = joinPath(dirname(from), specifier);
87
+ if (joined === null)
88
+ return { to: null, via: "relative", wildcard: false, problem: "climbs above the repository root" };
89
+ const to = this.probe(joined);
90
+ if (to === null)
91
+ return { to: null, via: "relative", wildcard: false, problem: "names no file in the tree" };
92
+ return { to, via: "relative", wildcard: false };
93
+ }
94
+ const config = this.tsconfigs.forFile(from);
95
+ let aliasMiss = null;
96
+ if (config !== null) {
97
+ const match = matchAlias(config.aliases, specifier);
98
+ if (match !== null) {
99
+ for (const candidate of match.candidates) {
100
+ const to = this.probe(candidate);
101
+ if (to !== null)
102
+ return { to, via: "alias", wildcard: match.wildcard };
103
+ }
104
+ // A catch-all `*` key falls back to packages, as TypeScript does; a named alias that misses is a broken import.
105
+ if (!match.key.startsWith("*")) {
106
+ aliasMiss = `matches the alias ${match.key} in ${config.path}, but none of its targets is a file in the tree`;
107
+ }
108
+ }
109
+ if (config.baseUrl !== null) {
110
+ const joined = joinPath(config.baseUrl, specifier);
111
+ const to = joined === null ? null : this.probe(joined);
112
+ if (to !== null)
113
+ return { to, via: "baseUrl", wildcard: false };
114
+ }
115
+ }
116
+ const workspace = this.resolveWorkspace(specifier);
117
+ if (workspace !== null)
118
+ return workspace;
119
+ if (aliasMiss !== null)
120
+ return { to: null, via: "alias", wildcard: false, problem: aliasMiss };
121
+ if (PACKAGE_NAME.test(specifier))
122
+ return { to: null, via: "package", wildcard: false };
123
+ return {
124
+ to: null,
125
+ via: "package",
126
+ wildcard: false,
127
+ problem: "is not relative, matches no tsconfig alias or workspace package, and is not a package name",
128
+ };
129
+ }
130
+ resolveWorkspace(specifier) {
131
+ const pkg = this.packages.find((p) => specifier === p.name || specifier.startsWith(`${p.name}/`));
132
+ if (pkg === undefined)
133
+ return null;
134
+ const subpath = specifier === pkg.name ? "." : `.${specifier.slice(pkg.name.length)}`;
135
+ const exportsField = pkg.manifest.exports;
136
+ const candidates = [];
137
+ let wildcard = false;
138
+ if (exportsField !== undefined && exportsField !== null) {
139
+ const found = this.fromExports(exportsField, subpath);
140
+ if (found === null) {
141
+ return {
142
+ to: null,
143
+ via: "workspace",
144
+ wildcard: false,
145
+ problem: `names ${subpath} of workspace package ${pkg.name}, which its exports do not include`,
146
+ };
147
+ }
148
+ candidates.push(...found.targets);
149
+ wildcard = found.wildcard;
150
+ }
151
+ else if (subpath !== ".") {
152
+ candidates.push(subpath);
153
+ wildcard = true;
154
+ }
155
+ if (subpath === ".") {
156
+ for (const field of ["types", "typings", "main", "module"]) {
157
+ const value = pkg.manifest[field];
158
+ if (typeof value === "string")
159
+ candidates.push(value);
160
+ }
161
+ if (exportsField === undefined || exportsField === null)
162
+ candidates.push("./index");
163
+ }
164
+ for (const candidate of candidates) {
165
+ const joined = joinPath(pkg.dir, candidate);
166
+ const to = joined === null ? null : this.probe(joined);
167
+ if (to !== null)
168
+ return { to, via: "workspace", wildcard };
169
+ }
170
+ return {
171
+ to: null,
172
+ via: "workspace",
173
+ wildcard,
174
+ problem: `names workspace package ${pkg.name}, whose entry is no file in the tree (name an export condition that points at source in \`conditions\`)`,
175
+ };
176
+ }
177
+ fromExports(field, subpath) {
178
+ if (typeof field === "string" || Array.isArray(field)) {
179
+ return subpath === "." ? { targets: this.conditionTargets(field), wildcard: false } : null;
180
+ }
181
+ if (typeof field !== "object" || field === null)
182
+ return null;
183
+ const map = field;
184
+ const keys = Object.keys(map);
185
+ if (keys.every((key) => !key.startsWith("."))) {
186
+ return subpath === "." ? { targets: this.conditionTargets(map), wildcard: false } : null;
187
+ }
188
+ if (map[subpath] !== undefined)
189
+ return { targets: this.conditionTargets(map[subpath]), wildcard: false };
190
+ let best = null;
191
+ for (const key of keys) {
192
+ const star = key.indexOf("*");
193
+ if (star === -1)
194
+ continue;
195
+ const prefix = key.slice(0, star);
196
+ const suffix = key.slice(star + 1);
197
+ if (!subpath.startsWith(prefix) || !subpath.endsWith(suffix) || subpath.length < prefix.length + suffix.length)
198
+ continue;
199
+ if (best === null || prefix.length > best.key.indexOf("*")) {
200
+ best = { key, capture: subpath.slice(prefix.length, subpath.length - suffix.length) };
201
+ }
202
+ }
203
+ if (best === null)
204
+ return null;
205
+ const capture = best.capture;
206
+ return {
207
+ targets: this.conditionTargets(map[best.key]).map((target) => target.replaceAll("*", capture)),
208
+ wildcard: true,
209
+ };
210
+ }
211
+ /** Targets of an exports value in the order tried: configured conditions, then types, import, default. */
212
+ conditionTargets(value) {
213
+ if (typeof value === "string")
214
+ return [value];
215
+ if (Array.isArray(value))
216
+ return value.flatMap((item) => this.conditionTargets(item));
217
+ if (typeof value !== "object" || value === null)
218
+ return [];
219
+ const map = value;
220
+ return this.conditions
221
+ .filter((condition) => map[condition] !== undefined)
222
+ .flatMap((condition) => this.conditionTargets(map[condition]));
223
+ }
224
+ /**
225
+ * A configured specifier — a tsconfig alias or a workspace package name —
226
+ * that resolves from `from` to `target`, shortest first; null when none
227
+ * does. TS002 asks for this before calling a relative path a bypass.
228
+ */
229
+ aliasFor(from, target) {
230
+ const found = [];
231
+ const config = this.tsconfigs.forFile(from);
232
+ const variants = [target.replace(/\.(?:d\.)?[cm]?[jt]sx?$/, ""), target];
233
+ if (/^index\.(?:d\.)?[cm]?[jt]sx?$/.test(basename(target)))
234
+ variants.unshift(dirname(target));
235
+ for (const alias of config?.aliases ?? []) {
236
+ const star = alias.key.indexOf("*");
237
+ if (star === -1) {
238
+ if (this.resolve(from, alias.key).to === target)
239
+ found.push(alias.key);
240
+ continue;
241
+ }
242
+ for (const pattern of alias.targets) {
243
+ const at = pattern.indexOf("*");
244
+ if (at === -1)
245
+ continue;
246
+ const prefix = pattern.slice(0, at);
247
+ const suffix = pattern.slice(at + 1);
248
+ for (const variant of variants) {
249
+ if (variant.length < prefix.length + suffix.length ||
250
+ !variant.startsWith(prefix) ||
251
+ !variant.endsWith(suffix))
252
+ continue;
253
+ const capture = variant.slice(prefix.length, variant.length - suffix.length);
254
+ const specifier = alias.key.slice(0, star) + capture + alias.key.slice(star + 1);
255
+ if (this.resolve(from, specifier).to === target)
256
+ found.push(specifier);
257
+ }
258
+ }
259
+ }
260
+ for (const pkg of this.packages) {
261
+ if (this.resolve(from, pkg.name).to === target)
262
+ found.push(pkg.name);
263
+ }
264
+ found.sort((a, b) => a.length - b.length || compareStrings(a, b));
265
+ return found[0] ?? null;
266
+ }
267
+ }
268
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface PathAlias {
2
+ /** The key as written: `@assessment/*` or `@app/router`. */
3
+ key: string;
4
+ /** Repository-relative targets, each with at most one `*`. */
5
+ targets: string[];
6
+ }
7
+ export interface TsConfig {
8
+ /** Repository path of the config file this was read from. */
9
+ path: string;
10
+ /** Effective baseUrl as a repository directory, or null. */
11
+ baseUrl: string | null;
12
+ /** Effective aliases, targets already joined to their base. */
13
+ aliases: PathAlias[];
14
+ }
15
+ export interface TsConfigNote {
16
+ path: string;
17
+ message: string;
18
+ }
19
+ /** Strip comments and trailing commas from JSON with comments, leaving strings alone. */
20
+ export declare function stripJsonComments(text: string): string;
21
+ export declare class TsConfigs {
22
+ private readonly files;
23
+ private readonly loaded;
24
+ private readonly nearest;
25
+ readonly notes: TsConfigNote[];
26
+ constructor(files: ReadonlyMap<string, string>);
27
+ /** The effective config for a file: the nearest tsconfig.json at or above its directory, or null. */
28
+ forFile(path: string): TsConfig | null;
29
+ private load;
30
+ private extendsTarget;
31
+ }
32
+ /**
33
+ * TypeScript's `paths` matching: an exact key wins; otherwise the wildcard
34
+ * key with the longest prefix. Returns the candidate target paths in order,
35
+ * and whether the key that matched had a wildcard.
36
+ */
37
+ export declare function matchAlias(aliases: readonly PathAlias[], specifier: string): {
38
+ key: string;
39
+ candidates: string[];
40
+ wildcard: boolean;
41
+ } | null;
42
+ //# sourceMappingURL=tsconfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../src/tsconfig.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+DAA+D;IAC/D,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAOD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAM;IAEpC,YAAY,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAE7C;IAED,qGAAqG;IACrG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAcrC;IAED,OAAO,CAAC,IAAI;IA2DZ,OAAO,CAAC,aAAa;CAWtB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA0BjE"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * `paths` and `baseUrl` from the tsconfig.json nearest to an importing file,
3
+ * walking up from it, with `extends` followed while the extended file is in
4
+ * the tree (profile TS002, TS004, TS006). A root tsconfig is not assumed: a
5
+ * monorepo's apps/web/tsconfig.json governs apps/web alone.
6
+ *
7
+ * TypeScript 7 offers no in-process config parser, so tsconfig's JSON with
8
+ * comments and trailing commas is read here. Resolution follows TypeScript:
9
+ * `paths` targets are relative to `baseUrl` when one is in effect, otherwise
10
+ * to the directory of the config that declares `paths`; a child's `paths` or
11
+ * `baseUrl` replaces its parent's whole.
12
+ */
13
+ import { ancestors, dirname, joinPath } from "./paths.js";
14
+ /** Strip comments and trailing commas from JSON with comments, leaving strings alone. */
15
+ export function stripJsonComments(text) {
16
+ let out = "";
17
+ let i = 0;
18
+ while (i < text.length) {
19
+ const c = text[i];
20
+ if (c === '"') {
21
+ let j = i + 1;
22
+ while (j < text.length && text[j] !== '"')
23
+ j += text[j] === "\\" ? 2 : 1;
24
+ out += text.slice(i, j + 1);
25
+ i = j + 1;
26
+ }
27
+ else if (c === "/" && text[i + 1] === "/") {
28
+ while (i < text.length && text[i] !== "\n")
29
+ i++;
30
+ }
31
+ else if (c === "/" && text[i + 1] === "*") {
32
+ const end = text.indexOf("*/", i + 2);
33
+ i = end === -1 ? text.length : end + 2;
34
+ }
35
+ else {
36
+ out += c;
37
+ i++;
38
+ }
39
+ }
40
+ return out.replace(/,(\s*[}\]])/g, "$1");
41
+ }
42
+ export class TsConfigs {
43
+ files;
44
+ loaded = new Map();
45
+ nearest = new Map();
46
+ notes = [];
47
+ constructor(files) {
48
+ this.files = files;
49
+ }
50
+ /** The effective config for a file: the nearest tsconfig.json at or above its directory, or null. */
51
+ forFile(path) {
52
+ const directory = dirname(path);
53
+ const cached = this.nearest.get(directory);
54
+ if (cached !== undefined)
55
+ return cached;
56
+ let found = null;
57
+ for (const dir of ancestors(directory)) {
58
+ const candidate = dir === "" ? "tsconfig.json" : `${dir}/tsconfig.json`;
59
+ if (this.files.has(candidate)) {
60
+ found = this.load(candidate, []);
61
+ break;
62
+ }
63
+ }
64
+ this.nearest.set(directory, found);
65
+ return found;
66
+ }
67
+ load(path, chain) {
68
+ const cached = this.loaded.get(path);
69
+ if (cached !== undefined)
70
+ return cached;
71
+ if (chain.includes(path)) {
72
+ this.notes.push({
73
+ path,
74
+ message: `extends itself through ${[...chain, path].join(" -> ")}; the cycle is cut here`,
75
+ });
76
+ return null;
77
+ }
78
+ const text = this.files.get(path);
79
+ if (text === undefined)
80
+ return null;
81
+ let raw;
82
+ try {
83
+ raw = JSON.parse(stripJsonComments(text));
84
+ }
85
+ catch (error) {
86
+ this.notes.push({ path, message: `does not parse (${error.message}), so its paths are not applied` });
87
+ this.loaded.set(path, null);
88
+ return null;
89
+ }
90
+ const directory = dirname(path);
91
+ let baseUrl = null;
92
+ let aliases = [];
93
+ const parents = typeof raw.extends === "string" ? [raw.extends] : Array.isArray(raw.extends) ? raw.extends : [];
94
+ for (const parent of parents) {
95
+ if (typeof parent !== "string")
96
+ continue;
97
+ const target = this.extendsTarget(directory, parent);
98
+ if (target === null) {
99
+ this.notes.push({
100
+ path,
101
+ message: `extends ${parent}, which is not in the tree; any paths it declares are not applied`,
102
+ });
103
+ continue;
104
+ }
105
+ const inherited = this.load(target, [...chain, path]);
106
+ if (inherited === null)
107
+ continue;
108
+ if (inherited.baseUrl !== null)
109
+ baseUrl = inherited.baseUrl;
110
+ if (inherited.aliases.length > 0)
111
+ aliases = inherited.aliases;
112
+ }
113
+ const options = raw.compilerOptions ?? {};
114
+ if (typeof options.baseUrl === "string")
115
+ baseUrl = joinPath(directory, options.baseUrl);
116
+ if (options.paths !== undefined && typeof options.paths === "object" && options.paths !== null) {
117
+ const base = baseUrl ?? directory;
118
+ aliases = [];
119
+ for (const [key, targets] of Object.entries(options.paths)) {
120
+ if (!Array.isArray(targets))
121
+ continue;
122
+ const joined = targets
123
+ .filter((target) => typeof target === "string")
124
+ .map((target) => joinPath(base, target))
125
+ .filter((target) => target !== null);
126
+ aliases.push({ key, targets: joined });
127
+ }
128
+ }
129
+ // Inherited targets were joined to the base of the config that declared them, as TypeScript resolves them.
130
+ const config = { path, baseUrl, aliases };
131
+ this.loaded.set(path, config);
132
+ return config;
133
+ }
134
+ extendsTarget(directory, specifier) {
135
+ if (!specifier.startsWith(".")) {
136
+ const candidate = `node_modules/${specifier}`;
137
+ return this.files.has(candidate) ? candidate : null;
138
+ }
139
+ const joined = joinPath(directory, specifier);
140
+ if (joined === null)
141
+ return null;
142
+ if (this.files.has(joined))
143
+ return joined;
144
+ if (this.files.has(`${joined}.json`))
145
+ return `${joined}.json`;
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * TypeScript's `paths` matching: an exact key wins; otherwise the wildcard
151
+ * key with the longest prefix. Returns the candidate target paths in order,
152
+ * and whether the key that matched had a wildcard.
153
+ */
154
+ export function matchAlias(aliases, specifier) {
155
+ const exact = aliases.find((alias) => !alias.key.includes("*") && alias.key === specifier);
156
+ if (exact !== undefined)
157
+ return { key: exact.key, candidates: [...exact.targets], wildcard: false };
158
+ let best = null;
159
+ for (const alias of aliases) {
160
+ const star = alias.key.indexOf("*");
161
+ if (star === -1)
162
+ continue;
163
+ const prefix = alias.key.slice(0, star);
164
+ const suffix = alias.key.slice(star + 1);
165
+ if (specifier.length < prefix.length + suffix.length)
166
+ continue;
167
+ if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix))
168
+ continue;
169
+ if (best === null || prefix.length > best.prefix) {
170
+ best = {
171
+ alias,
172
+ capture: specifier.slice(prefix.length, specifier.length - suffix.length),
173
+ prefix: prefix.length,
174
+ };
175
+ }
176
+ }
177
+ if (best === null)
178
+ return null;
179
+ const capture = best.capture;
180
+ return {
181
+ key: best.alias.key,
182
+ candidates: best.alias.targets.map((target) => target.replace("*", capture)),
183
+ wildcard: true,
184
+ };
185
+ }
186
+ //# sourceMappingURL=tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../src/tsconfig.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@intentset/architecture",
3
+ "version": "0.1.0",
4
+ "description": "Traceable VSA checks: path claims, import graph, layer matrix, resources, exceptions, baseline.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=22.18"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/intentset/intentset.git",
13
+ "directory": "packages/architecture"
14
+ },
15
+ "homepage": "https://intentset.org/",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "src"
22
+ ],
23
+ "exports": {
24
+ ".": {
25
+ "intentset-source": "./src/index.ts",
26
+ "types": "./dist/index.d.ts",
27
+ "default": "./dist/index.js"
28
+ }
29
+ },
30
+ "dependencies": {
31
+ "@intentset/core": "^0.1.0"
32
+ },
33
+ "peerDependencies": {
34
+ "typescript": "^7.0.2"
35
+ }
36
+ }