@intentset/architecture 0.7.0 → 0.7.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.
package/dist/subject-source.d.ts
CHANGED
|
@@ -3,17 +3,22 @@
|
|
|
3
3
|
* (Core §8, ADR 0013): the files each slice's claims resolve to, the files of
|
|
4
4
|
* each registry resource, the local files a test imports (resolved with the
|
|
5
5
|
* same TypeScript-aware resolver as the import graph, and stopping at a
|
|
6
|
-
* package boundary), the global inputs expanded to paths,
|
|
7
|
-
*
|
|
6
|
+
* package boundary), the global inputs expanded to paths, which resource files a
|
|
7
|
+
* subject hashes (`evidence.resources`, Core §8) and which files can move any
|
|
8
|
+
* subject at all. Pure: it reads the tree it is given and the file
|
|
8
9
|
* contents through the function it is given.
|
|
9
10
|
*/
|
|
10
|
-
import type
|
|
11
|
+
import { type EvidenceDependencies, type EvidenceResources, type Graph, type Registries } from "@intentset/core";
|
|
11
12
|
import { type ArchitectureConfig } from "./config.ts";
|
|
12
13
|
export interface SubjectSourceOptions {
|
|
13
14
|
/** Laid over the defaults and `.intentset/architecture.yaml`, as for `checkArchitecture`. */
|
|
14
15
|
config?: Partial<ArchitectureConfig>;
|
|
15
16
|
/** `evidence.globalInputs`: paths, or patterns expanded over the tree. */
|
|
16
17
|
globalInputs: readonly string[];
|
|
18
|
+
/** `evidence.resources`: `exercised` (the default) or `used`; the evidence package's subject reads it from the source this returns. */
|
|
19
|
+
resources?: EvidenceResources;
|
|
20
|
+
/** `evidence.dependencies`: what a dependency slice contributes; the subject reads it from the source this returns. */
|
|
21
|
+
dependencies?: EvidenceDependencies;
|
|
17
22
|
/** The bytes of a repository-relative file, or undefined when it does not exist. */
|
|
18
23
|
readFile: (path: string) => Uint8Array | undefined;
|
|
19
24
|
}
|
|
@@ -27,6 +32,8 @@ export interface ArchitectureSubjectSource {
|
|
|
27
32
|
}>;
|
|
28
33
|
localImports: (path: string) => string[];
|
|
29
34
|
globalInputs: string[];
|
|
35
|
+
resourceMode: EvidenceResources;
|
|
36
|
+
dependencyMode: EvidenceDependencies;
|
|
30
37
|
covers: (path: string) => boolean;
|
|
31
38
|
}
|
|
32
39
|
export declare function subjectSource(graph: Graph, registries: Registries, tree: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-source.d.ts","sourceRoot":"","sources":["../src/subject-source.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"subject-source.d.ts","sourceRoot":"","sources":["../src/subject-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACV,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA4B,KAAK,kBAAkB,EAAyC,MAAM,aAAa,CAAC;AAOvH,MAAM,WAAW,oBAAoB;IACnC,6FAA6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,0EAA0E;IAC1E,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,uIAAuI;IACvI,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,uHAAuH;IACvH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,oFAAoF;IACpF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CACpD;AAED,4FAA4F;AAC5F,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACnD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7D,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,iBAAiB,CAAC;IAChC,cAAc,EAAE,oBAAoB,CAAC;IACrC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAaD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC5C,OAAO,EAAE,oBAAoB,GAC5B,yBAAyB,CA6F3B"}
|
package/dist/subject-source.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the evidence package's subject hash needs from the architecture
|
|
3
|
+
* (Core §8, ADR 0013): the files each slice's claims resolve to, the files of
|
|
4
|
+
* each registry resource, the local files a test imports (resolved with the
|
|
5
|
+
* same TypeScript-aware resolver as the import graph, and stopping at a
|
|
6
|
+
* package boundary), the global inputs expanded to paths, which resource files a
|
|
7
|
+
* subject hashes (`evidence.resources`, Core §8) and which files can move any
|
|
8
|
+
* subject at all. Pure: it reads the tree it is given and the file
|
|
9
|
+
* contents through the function it is given.
|
|
10
|
+
*/
|
|
11
|
+
import { DEFAULT_EVIDENCE_DEPENDENCIES, } from "@intentset/core";
|
|
1
12
|
import { ARCHITECTURE_CONFIG_PATH, readArchitectureConfig, resolveConfig } from "./config.js";
|
|
2
13
|
import { extractImports } from "./extract.js";
|
|
3
14
|
import { isCode } from "./paths.js";
|
|
@@ -67,6 +78,7 @@ export function subjectSource(graph, registries, tree, options) {
|
|
|
67
78
|
return list;
|
|
68
79
|
};
|
|
69
80
|
const globalInputs = expandGlobalInputs(options.globalInputs, tree.files.keys());
|
|
81
|
+
const resourceMode = options.resources ?? "exercised";
|
|
70
82
|
let covered = null;
|
|
71
83
|
const covers = (path) => {
|
|
72
84
|
if (covered === null) {
|
|
@@ -74,10 +86,21 @@ export function subjectSource(graph, registries, tree, options) {
|
|
|
74
86
|
for (const files of sliceFiles.values())
|
|
75
87
|
for (const file of files)
|
|
76
88
|
covered.add(file);
|
|
89
|
+
// The resources some subject hashes: under `used`, every one a slice lists; under `exercised`, the ones a slice
|
|
90
|
+
// that implements a behavior lists and also claims a file of (its own), and the ones a verification exercises.
|
|
77
91
|
const used = new Set();
|
|
78
|
-
for (const slice of model.slices)
|
|
79
|
-
|
|
80
|
-
|
|
92
|
+
for (const slice of model.slices) {
|
|
93
|
+
const implementing = (graph.artifacts.get(slice.id)?.meta.links.implements ?? []).length > 0;
|
|
94
|
+
for (const id of slice.meta.usesResources) {
|
|
95
|
+
if (resourceMode === "used")
|
|
96
|
+
used.add(id);
|
|
97
|
+
else if (implementing) {
|
|
98
|
+
const files = new Set(resources.get(id)?.files ?? []);
|
|
99
|
+
if ((sliceFiles.get(slice.id) ?? []).some((file) => files.has(file)))
|
|
100
|
+
used.add(id);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
81
104
|
for (const artifact of graph.artifacts.values()) {
|
|
82
105
|
covered.add(artifact.path);
|
|
83
106
|
const verification = artifact.meta.verification;
|
|
@@ -95,6 +118,16 @@ export function subjectSource(graph, registries, tree, options) {
|
|
|
95
118
|
}
|
|
96
119
|
return covered.has(path);
|
|
97
120
|
};
|
|
98
|
-
|
|
121
|
+
const dependencyMode = options.dependencies ?? DEFAULT_EVIDENCE_DEPENDENCIES;
|
|
122
|
+
return {
|
|
123
|
+
readFile: options.readFile,
|
|
124
|
+
sliceFiles,
|
|
125
|
+
resources,
|
|
126
|
+
localImports,
|
|
127
|
+
globalInputs,
|
|
128
|
+
resourceMode,
|
|
129
|
+
dependencyMode,
|
|
130
|
+
covers,
|
|
131
|
+
};
|
|
99
132
|
}
|
|
100
133
|
//# sourceMappingURL=subject-source.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-source.js","sourceRoot":"","sources":["../src/subject-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subject-source.js","sourceRoot":"","sources":["../src/subject-source.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intentset/architecture",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Traceable VSA checks: path claims, import graph, layer matrix, resources, exceptions, baseline.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"intentset",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@intentset/core": "^0.7.
|
|
39
|
+
"@intentset/core": "^0.7.1"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"typescript": "^7.0.2"
|
package/src/subject-source.ts
CHANGED
|
@@ -3,11 +3,18 @@
|
|
|
3
3
|
* (Core §8, ADR 0013): the files each slice's claims resolve to, the files of
|
|
4
4
|
* each registry resource, the local files a test imports (resolved with the
|
|
5
5
|
* same TypeScript-aware resolver as the import graph, and stopping at a
|
|
6
|
-
* package boundary), the global inputs expanded to paths,
|
|
7
|
-
*
|
|
6
|
+
* package boundary), the global inputs expanded to paths, which resource files a
|
|
7
|
+
* subject hashes (`evidence.resources`, Core §8) and which files can move any
|
|
8
|
+
* subject at all. Pure: it reads the tree it is given and the file
|
|
8
9
|
* contents through the function it is given.
|
|
9
10
|
*/
|
|
10
|
-
import
|
|
11
|
+
import {
|
|
12
|
+
DEFAULT_EVIDENCE_DEPENDENCIES,
|
|
13
|
+
type EvidenceDependencies,
|
|
14
|
+
type EvidenceResources,
|
|
15
|
+
type Graph,
|
|
16
|
+
type Registries,
|
|
17
|
+
} from "@intentset/core";
|
|
11
18
|
import { ARCHITECTURE_CONFIG_PATH, type ArchitectureConfig, readArchitectureConfig, resolveConfig } from "./config.ts";
|
|
12
19
|
import { extractImports } from "./extract.ts";
|
|
13
20
|
import { isCode } from "./paths.ts";
|
|
@@ -20,6 +27,10 @@ export interface SubjectSourceOptions {
|
|
|
20
27
|
config?: Partial<ArchitectureConfig>;
|
|
21
28
|
/** `evidence.globalInputs`: paths, or patterns expanded over the tree. */
|
|
22
29
|
globalInputs: readonly string[];
|
|
30
|
+
/** `evidence.resources`: `exercised` (the default) or `used`; the evidence package's subject reads it from the source this returns. */
|
|
31
|
+
resources?: EvidenceResources;
|
|
32
|
+
/** `evidence.dependencies`: what a dependency slice contributes; the subject reads it from the source this returns. */
|
|
33
|
+
dependencies?: EvidenceDependencies;
|
|
23
34
|
/** The bytes of a repository-relative file, or undefined when it does not exist. */
|
|
24
35
|
readFile: (path: string) => Uint8Array | undefined;
|
|
25
36
|
}
|
|
@@ -31,6 +42,8 @@ export interface ArchitectureSubjectSource {
|
|
|
31
42
|
resources: Map<string, { record: unknown; files: string[] }>;
|
|
32
43
|
localImports: (path: string) => string[];
|
|
33
44
|
globalInputs: string[];
|
|
45
|
+
resourceMode: EvidenceResources;
|
|
46
|
+
dependencyMode: EvidenceDependencies;
|
|
34
47
|
covers: (path: string) => boolean;
|
|
35
48
|
}
|
|
36
49
|
|
|
@@ -100,13 +113,25 @@ export function subjectSource(
|
|
|
100
113
|
|
|
101
114
|
const globalInputs = expandGlobalInputs(options.globalInputs, tree.files.keys());
|
|
102
115
|
|
|
116
|
+
const resourceMode = options.resources ?? "exercised";
|
|
103
117
|
let covered: Set<string> | null = null;
|
|
104
118
|
const covers = (path: string): boolean => {
|
|
105
119
|
if (covered === null) {
|
|
106
120
|
covered = new Set<string>(globalInputs);
|
|
107
121
|
for (const files of sliceFiles.values()) for (const file of files) covered.add(file);
|
|
122
|
+
// The resources some subject hashes: under `used`, every one a slice lists; under `exercised`, the ones a slice
|
|
123
|
+
// that implements a behavior lists and also claims a file of (its own), and the ones a verification exercises.
|
|
108
124
|
const used = new Set<string>();
|
|
109
|
-
for (const slice of model.slices)
|
|
125
|
+
for (const slice of model.slices) {
|
|
126
|
+
const implementing = (graph.artifacts.get(slice.id)?.meta.links.implements ?? []).length > 0;
|
|
127
|
+
for (const id of slice.meta.usesResources) {
|
|
128
|
+
if (resourceMode === "used") used.add(id);
|
|
129
|
+
else if (implementing) {
|
|
130
|
+
const files = new Set(resources.get(id)?.files ?? []);
|
|
131
|
+
if ((sliceFiles.get(slice.id) ?? []).some((file) => files.has(file))) used.add(id);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
110
135
|
for (const artifact of graph.artifacts.values()) {
|
|
111
136
|
covered.add(artifact.path);
|
|
112
137
|
const verification = artifact.meta.verification;
|
|
@@ -120,5 +145,15 @@ export function subjectSource(
|
|
|
120
145
|
return covered.has(path);
|
|
121
146
|
};
|
|
122
147
|
|
|
123
|
-
|
|
148
|
+
const dependencyMode = options.dependencies ?? DEFAULT_EVIDENCE_DEPENDENCIES;
|
|
149
|
+
return {
|
|
150
|
+
readFile: options.readFile,
|
|
151
|
+
sliceFiles,
|
|
152
|
+
resources,
|
|
153
|
+
localImports,
|
|
154
|
+
globalInputs,
|
|
155
|
+
resourceMode,
|
|
156
|
+
dependencyMode,
|
|
157
|
+
covers,
|
|
158
|
+
};
|
|
124
159
|
}
|