@anlyx/core 0.1.5 → 0.1.6-beta.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.
@@ -0,0 +1,195 @@
1
+ export async function validateProjectData(projectData, options) {
2
+ const errors = [];
3
+ const warnings = [];
4
+ for (const candidate of collectSourceCandidates(projectData)) {
5
+ warnings.push(...(await validateSourceCandidate(candidate, options.cwd)));
6
+ }
7
+ warnings.push(...validateCoverage(projectData));
8
+ const issues = [...errors, ...warnings];
9
+ const sourceIssueCount = issues.filter((issue) => issue.code.startsWith("source_")).length;
10
+ const sourceIssueBreakdown = summarizeSourceIssues(issues);
11
+ const modeled = getModeledCounts(projectData);
12
+ const summary = {
13
+ sourceIssueCount,
14
+ sourceIssueBreakdown,
15
+ coverageStatus: projectData.coverage?.status ?? "unknown",
16
+ modeled
17
+ };
18
+ if (projectData.coverage?.detected) {
19
+ summary.detected = projectData.coverage.detected;
20
+ }
21
+ const report = {
22
+ schemaVersion: "0.1",
23
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
24
+ valid: errors.length === 0,
25
+ summary,
26
+ issues
27
+ };
28
+ return {
29
+ valid: report.valid,
30
+ errors,
31
+ warnings,
32
+ report
33
+ };
34
+ }
35
+ function collectSourceCandidates(projectData) {
36
+ const candidates = [];
37
+ projectData.evidence.forEach((evidence, evidenceIndex) => {
38
+ candidates.push({
39
+ source: evidence.source,
40
+ path: `evidence.${evidenceIndex}.source`,
41
+ requiresSourceMatch: evidence.status === "source-matched"
42
+ });
43
+ });
44
+ projectData.flows.forEach((flow, flowIndex) => {
45
+ flow.layers.forEach((layer, layerIndex) => {
46
+ candidates.push({
47
+ source: layer.source,
48
+ path: `flows.${flowIndex}.layers.${layerIndex}.source`,
49
+ requiresSourceMatch: layer.status === "source-matched"
50
+ });
51
+ });
52
+ });
53
+ projectData.pages.forEach((page, pageIndex) => {
54
+ candidates.push({
55
+ source: page.source,
56
+ path: `pages.${pageIndex}.source`,
57
+ requiresSourceMatch: false
58
+ });
59
+ });
60
+ projectData.architecture.nodes.forEach((node, nodeIndex) => {
61
+ candidates.push({
62
+ source: node.source,
63
+ path: `architecture.nodes.${nodeIndex}.source`,
64
+ requiresSourceMatch: false
65
+ });
66
+ });
67
+ return candidates.filter((candidate) => candidate.source || candidate.requiresSourceMatch);
68
+ }
69
+ async function validateSourceCandidate(candidate, cwd) {
70
+ const issues = [];
71
+ const source = candidate.source;
72
+ if (!source?.filePath) {
73
+ if (candidate.requiresSourceMatch) {
74
+ issues.push(warning("source_matched_missing_source", `${candidate.path}.filePath`, "source-matched requires a concrete source file."));
75
+ }
76
+ return issues;
77
+ }
78
+ const { readFile } = await import("node:fs/promises");
79
+ const { isAbsolute, relative, resolve } = await import("node:path");
80
+ const absolutePath = resolve(cwd, source.filePath);
81
+ const relativePath = relative(resolve(cwd), absolutePath);
82
+ if (isAbsolute(relativePath) || relativePath.startsWith("..")) {
83
+ return [
84
+ warning("source_path_outside_root", `${candidate.path}.filePath`, `Source path must stay inside the working directory: ${source.filePath}`)
85
+ ];
86
+ }
87
+ let content;
88
+ try {
89
+ content = await readFile(absolutePath, "utf8");
90
+ }
91
+ catch (error) {
92
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
93
+ return [
94
+ warning(code === "ENOENT" ? "source_file_missing" : "source_file_unreadable", `${candidate.path}.filePath`, `Source file could not be verified: ${source.filePath}`)
95
+ ];
96
+ }
97
+ const lineCount = content.split(/\r?\n/).length;
98
+ if (candidate.requiresSourceMatch && source.lineStart === 1) {
99
+ issues.push(warning("source_line_placeholder", `${candidate.path}.lineStart`, "lineStart: 1 looks like a placeholder. Use the actual symbol line or downgrade the evidence status."));
100
+ }
101
+ if (source.lineStart && source.lineStart > lineCount) {
102
+ issues.push(warning("source_line_out_of_range", `${candidate.path}.lineStart`, `lineStart ${source.lineStart} is outside ${source.filePath}.`));
103
+ }
104
+ if (source.lineEnd && source.lineEnd > lineCount) {
105
+ issues.push(warning("source_line_out_of_range", `${candidate.path}.lineEnd`, `lineEnd ${source.lineEnd} is outside ${source.filePath}.`));
106
+ }
107
+ if (source.symbol && !content.includes(source.symbol)) {
108
+ issues.push(warning("source_symbol_not_found", `${candidate.path}.symbol`, `Symbol was not found in ${source.filePath}: ${source.symbol}`));
109
+ }
110
+ return issues;
111
+ }
112
+ function validateCoverage(projectData) {
113
+ const issues = [];
114
+ const coverage = projectData.coverage;
115
+ if (!coverage) {
116
+ return issues;
117
+ }
118
+ if (coverage.status === "partial") {
119
+ issues.push(warning("partial_analysis", "coverage.status", "Project JSON declares partial analysis. Keep unmodeled areas visible to users."));
120
+ }
121
+ const modeled = {
122
+ ...getModeledCounts(projectData),
123
+ ...coverage.modeled
124
+ };
125
+ addCoverageGap(issues, "pages", coverage.detected?.pages, modeled.pages);
126
+ addCoverageGap(issues, "requests", coverage.detected?.requests, modeled.requests);
127
+ addCoverageGap(issues, "flows", coverage.detected?.flows, modeled.flows);
128
+ addCoverageGap(issues, "architectureNodes", coverage.detected?.architectureNodes, modeled.architectureNodes);
129
+ addCoverageGap(issues, "frontendApiUsages", coverage.detected?.frontendApiUsages, modeled.requests);
130
+ addCoverageGap(issues, "backendEndpoints", coverage.detected?.backendEndpoints, modeled.requests);
131
+ return issues;
132
+ }
133
+ function addCoverageGap(issues, key, detected, modeled) {
134
+ if (detected === undefined || modeled === undefined || detected <= modeled) {
135
+ return;
136
+ }
137
+ issues.push(warning(`coverage_${toSnakeCase(key)}_partial`, `coverage.detected.${key}`, `Only ${modeled} of ${detected} detected ${key} are modeled.`));
138
+ }
139
+ function getModeledCounts(projectData) {
140
+ return {
141
+ pages: projectData.pages.length,
142
+ requests: projectData.requests.length,
143
+ flows: projectData.flows.length,
144
+ architectureNodes: projectData.architecture.nodes.length
145
+ };
146
+ }
147
+ function summarizeSourceIssues(issues) {
148
+ const breakdown = {
149
+ missingSource: 0,
150
+ missingFiles: 0,
151
+ unreadableFiles: 0,
152
+ outsideRoot: 0,
153
+ placeholderLines: 0,
154
+ outOfRangeLines: 0,
155
+ missingSymbols: 0
156
+ };
157
+ for (const issue of issues) {
158
+ switch (issue.code) {
159
+ case "source_matched_missing_source":
160
+ breakdown.missingSource += 1;
161
+ break;
162
+ case "source_file_missing":
163
+ breakdown.missingFiles += 1;
164
+ break;
165
+ case "source_file_unreadable":
166
+ breakdown.unreadableFiles += 1;
167
+ break;
168
+ case "source_path_outside_root":
169
+ breakdown.outsideRoot += 1;
170
+ break;
171
+ case "source_line_placeholder":
172
+ breakdown.placeholderLines += 1;
173
+ break;
174
+ case "source_line_out_of_range":
175
+ breakdown.outOfRangeLines += 1;
176
+ break;
177
+ case "source_symbol_not_found":
178
+ breakdown.missingSymbols += 1;
179
+ break;
180
+ }
181
+ }
182
+ return breakdown;
183
+ }
184
+ function warning(code, path, message) {
185
+ return {
186
+ severity: "warning",
187
+ code,
188
+ path,
189
+ message
190
+ };
191
+ }
192
+ function toSnakeCase(value) {
193
+ return value.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`);
194
+ }
195
+ //# sourceMappingURL=project-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-validation.js","sourceRoot":"","sources":["../src/project-validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anlyx/core",
3
- "version": "0.1.5",
3
+ "version": "0.1.6-beta.0",
4
4
  "description": "Core Project JSON schemas, validation, normalization, and local data contracts for Anlyx.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,6 +27,11 @@
27
27
  ".": {
28
28
  "types": "./dist/index.d.ts",
29
29
  "default": "./dist/index.js"
30
+ },
31
+ "./project-validation": {
32
+ "types": "./dist/project-validation.d.ts",
33
+ "import": "./dist/project-validation.js",
34
+ "default": "./dist/project-validation.js"
30
35
  }
31
36
  },
32
37
  "dependencies": {