@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.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/config.d.ts +208 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +143 -0
- package/dist/config.js.map +1 -0
- package/dist/fixture-validation.d.ts +17 -0
- package/dist/fixture-validation.d.ts.map +1 -0
- package/dist/fixture-validation.js +121 -0
- package/dist/fixture-validation.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/report-aggregation.d.ts +23 -0
- package/dist/report-aggregation.d.ts.map +1 -0
- package/dist/report-aggregation.js +168 -0
- package/dist/report-aggregation.js.map +1 -0
- package/dist/schema.d.ts +628 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +155 -0
- package/dist/schema.js.map +1 -0
- package/package.json +38 -0
|
@@ -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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"}
|