@anlyx/core 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.
@@ -0,0 +1,168 @@
1
+ import { endpointFlowSchema, endpointSchema, pageStoryboardSchema, scanResultSchema } from "./schema.js";
2
+ export function aggregateReportData(input) {
3
+ const endpoints = endpointSchema.array().parse(input.endpoints);
4
+ const flows = endpointFlowSchema.array().parse(input.flows);
5
+ const pages = pageStoryboardSchema.array().parse(input.pages);
6
+ const issues = [];
7
+ validateFlowReferences({ endpoints, flows }, issues);
8
+ const linkedPages = pages.map((page, pageIndex) => ({
9
+ ...page,
10
+ apiCalls: page.apiCalls.map((apiCall, apiCallIndex) => linkApiCall({
11
+ apiCall,
12
+ endpoints,
13
+ issues,
14
+ path: `pages.${pageIndex}.apiCalls.${apiCallIndex}`
15
+ }))
16
+ }));
17
+ const scanResult = scanResultSchema.parse({
18
+ projectName: input.projectName ?? "Anlyx",
19
+ generatedAt: input.generatedAt ?? new Date().toISOString(),
20
+ schemaVersion: "0.1",
21
+ endpoints,
22
+ flows,
23
+ pages: linkedPages,
24
+ ...(input.capture ? { capture: input.capture } : {}),
25
+ warnings: [...(input.warnings ?? []), ...issues.map(toWarning)]
26
+ });
27
+ return {
28
+ scanResult,
29
+ issues
30
+ };
31
+ }
32
+ export function matchApiCallToEndpoint(apiCall, endpoints) {
33
+ const matches = endpoints.filter((endpoint) => endpoint.method === apiCall.method &&
34
+ endpointPathMatchesApiCallPath(endpoint.path, apiCall.path));
35
+ if (matches.length !== 1) {
36
+ return null;
37
+ }
38
+ return matches[0] ?? null;
39
+ }
40
+ function linkApiCall(options) {
41
+ const endpointIds = new Set(options.endpoints.map((endpoint) => endpoint.id));
42
+ if (options.apiCall.endpointId && endpointIds.has(options.apiCall.endpointId)) {
43
+ return options.apiCall;
44
+ }
45
+ if (options.apiCall.endpointId) {
46
+ options.issues.push({
47
+ code: "api_call_invalid_endpoint_id",
48
+ message: `API call references missing endpointId: ${options.apiCall.endpointId}.`,
49
+ path: `${options.path}.endpointId`
50
+ });
51
+ }
52
+ const matches = options.endpoints.filter((endpoint) => endpoint.method === options.apiCall.method &&
53
+ endpointPathMatchesApiCallPath(endpoint.path, options.apiCall.path));
54
+ if (matches.length === 1) {
55
+ const { endpointId: _endpointId, ...apiCallWithoutEndpointId } = options.apiCall;
56
+ void _endpointId;
57
+ return {
58
+ ...apiCallWithoutEndpointId,
59
+ endpointId: matches[0].id
60
+ };
61
+ }
62
+ const { endpointId: _endpointId, ...apiCallWithoutEndpointId } = options.apiCall;
63
+ void _endpointId;
64
+ if (matches.length > 1) {
65
+ options.issues.push({
66
+ code: "api_call_ambiguous",
67
+ message: `API call matches multiple endpoints: ${options.apiCall.method} ${options.apiCall.path}.`,
68
+ path: options.path
69
+ });
70
+ return apiCallWithoutEndpointId;
71
+ }
72
+ options.issues.push({
73
+ code: "api_call_unmatched",
74
+ message: `API call does not match any endpoint: ${options.apiCall.method} ${options.apiCall.path}.`,
75
+ path: options.path
76
+ });
77
+ return apiCallWithoutEndpointId;
78
+ }
79
+ function endpointPathMatchesApiCallPath(endpointPath, apiCallPath) {
80
+ const endpointSegments = splitPathname(endpointPath);
81
+ const apiCallSegments = splitPathname(apiCallPath);
82
+ if (endpointSegments.length !== apiCallSegments.length) {
83
+ return false;
84
+ }
85
+ return endpointSegments.every((endpointSegment, index) => {
86
+ const apiCallSegment = apiCallSegments[index];
87
+ if (apiCallSegment === undefined) {
88
+ return false;
89
+ }
90
+ if (/^\{[^/{}]+\}$/.test(endpointSegment)) {
91
+ return apiCallSegment.length > 0 && !apiCallSegment.includes("/");
92
+ }
93
+ return endpointSegment === apiCallSegment;
94
+ });
95
+ }
96
+ function splitPathname(path) {
97
+ const pathname = toPathname(path);
98
+ if (pathname === "/") {
99
+ return [];
100
+ }
101
+ return pathname.replace(/^\/+|\/+$/g, "").split("/");
102
+ }
103
+ function toPathname(path) {
104
+ try {
105
+ return decodeURIComponent(new URL(path, "http://anlyx.local").pathname);
106
+ }
107
+ catch {
108
+ return path.split("?")[0] ?? path;
109
+ }
110
+ }
111
+ function validateFlowReferences(data, issues) {
112
+ const endpointIds = new Set(data.endpoints.map((endpoint) => endpoint.id));
113
+ data.flows.forEach((flow, flowIndex) => {
114
+ if (!endpointIds.has(flow.endpointId)) {
115
+ issues.push({
116
+ code: "flow_missing_endpoint",
117
+ message: `Flow references missing endpointId: ${flow.endpointId}.`,
118
+ path: `flows.${flowIndex}.endpointId`
119
+ });
120
+ }
121
+ const nodeIds = new Set(flow.nodes.map((node) => node.id));
122
+ flow.mainPath.forEach((nodeId, nodeIndex) => {
123
+ if (!nodeIds.has(nodeId)) {
124
+ issues.push({
125
+ code: "flow_main_path_missing_node",
126
+ message: `Flow mainPath references missing node: ${nodeId}.`,
127
+ path: `flows.${flowIndex}.mainPath.${nodeIndex}`
128
+ });
129
+ }
130
+ });
131
+ flow.edges.forEach((edge, edgeIndex) => {
132
+ if (!nodeIds.has(edge.from)) {
133
+ issues.push({
134
+ code: "flow_edge_missing_node",
135
+ message: `Flow edge references missing from node: ${edge.from}.`,
136
+ path: `flows.${flowIndex}.edges.${edgeIndex}.from`
137
+ });
138
+ }
139
+ if (!nodeIds.has(edge.to)) {
140
+ issues.push({
141
+ code: "flow_edge_missing_node",
142
+ message: `Flow edge references missing to node: ${edge.to}.`,
143
+ path: `flows.${flowIndex}.edges.${edgeIndex}.to`
144
+ });
145
+ }
146
+ });
147
+ flow.subFlows.forEach((subFlow, subFlowIndex) => {
148
+ if (!nodeIds.has(subFlow.parentNodeId)) {
149
+ issues.push({
150
+ code: "flow_subflow_missing_parent",
151
+ message: `SubFlow references missing parentNodeId: ${subFlow.parentNodeId}.`,
152
+ path: `flows.${flowIndex}.subFlows.${subFlowIndex}.parentNodeId`
153
+ });
154
+ }
155
+ });
156
+ });
157
+ }
158
+ function toWarning(issue) {
159
+ const warning = {
160
+ code: issue.code,
161
+ message: issue.message
162
+ };
163
+ if (issue.path) {
164
+ warning.targetId = issue.path;
165
+ }
166
+ return warning;
167
+ }
168
+ //# sourceMappingURL=report-aggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-aggregation.js","sourceRoot":"","sources":["../src/report-aggregation.ts"],"names":[],"mappings":"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"}