@anlyx/core 0.1.3 → 0.1.5
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/README.md +4 -2
- package/dist/flow-spec/normalize.d.ts +7 -0
- package/dist/flow-spec/normalize.d.ts.map +1 -0
- package/dist/flow-spec/normalize.js +153 -0
- package/dist/flow-spec/normalize.js.map +1 -0
- package/dist/flow-spec/schema.d.ts +502 -0
- package/dist/flow-spec/schema.d.ts.map +1 -0
- package/dist/flow-spec/schema.js +186 -0
- package/dist/flow-spec/schema.js.map +1 -0
- package/dist/flow-spec/validate.d.ts +17 -0
- package/dist/flow-spec/validate.d.ts.map +1 -0
- package/dist/flow-spec/validate.js +231 -0
- package/dist/flow-spec/validate.js.map +1 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/live-flow.d.ts +103 -0
- package/dist/live-flow.d.ts.map +1 -0
- package/dist/live-flow.js +325 -0
- package/dist/live-flow.js.map +1 -0
- package/dist/project-normalize.d.ts +21 -0
- package/dist/project-normalize.d.ts.map +1 -0
- package/dist/project-normalize.js +27 -0
- package/dist/project-normalize.js.map +1 -0
- package/dist/project-schema.d.ts +885 -0
- package/dist/project-schema.d.ts.map +1 -0
- package/dist/project-schema.js +253 -0
- package/dist/project-schema.js.map +1 -0
- package/dist/schema.d.ts +1299 -49
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +161 -1
- package/dist/schema.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @anlyx/core
|
|
2
2
|
|
|
3
|
-
Core
|
|
3
|
+
Core Project JSON schemas, validation, normalization, and local viewer data
|
|
4
|
+
contracts for Anlyx.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
The public product path is `anlyx.project.json -> validate -> import -> local
|
|
7
|
+
4777 viewer`.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReportData, ScanResult } from "../schema.js";
|
|
2
|
+
import type { AnlyxFlowFile } from "./schema.js";
|
|
3
|
+
export type NormalizeFlowFileToScanResult = (file: AnlyxFlowFile) => ScanResult;
|
|
4
|
+
export type NormalizeFlowFileToReportData = (file: AnlyxFlowFile) => ReportData;
|
|
5
|
+
export declare function normalizeFlowFileToScanResult(file: AnlyxFlowFile): ScanResult;
|
|
6
|
+
export declare function normalizeFlowFileToReportData(file: AnlyxFlowFile): ReportData;
|
|
7
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/flow-spec/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,UAAU,EACV,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,6BAA6B,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,UAAU,CAAC;AAChF,MAAM,MAAM,6BAA6B,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,UAAU,CAAC;AAIhF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAU7E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAE7E"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
const API_NODE_TYPES = new Set(["api.request", "api.route"]);
|
|
2
|
+
export function normalizeFlowFileToScanResult(file) {
|
|
3
|
+
return {
|
|
4
|
+
projectName: file.project.name,
|
|
5
|
+
generatedAt: file.snapshot?.createdAt ?? new Date().toISOString(),
|
|
6
|
+
schemaVersion: "0.1",
|
|
7
|
+
endpoints: file.flows.flatMap((flow) => flow.nodes.filter(isApiNode).map(toEndpoint)),
|
|
8
|
+
flows: file.flows.map((flow) => toEndpointFlow(flow, file)),
|
|
9
|
+
pages: [],
|
|
10
|
+
warnings: []
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function normalizeFlowFileToReportData(file) {
|
|
14
|
+
return normalizeFlowFileToScanResult(file);
|
|
15
|
+
}
|
|
16
|
+
function toEndpoint(node) {
|
|
17
|
+
const endpoint = parseEndpointLabel(node.label);
|
|
18
|
+
return {
|
|
19
|
+
id: node.id,
|
|
20
|
+
method: endpoint.method,
|
|
21
|
+
path: endpoint.path,
|
|
22
|
+
supportLevel: "basic",
|
|
23
|
+
confidence: confidenceFromStatus(node.status),
|
|
24
|
+
...(node.request ? { requestSchema: "Flow JSON request" } : {}),
|
|
25
|
+
...(node.response ? { responseSchema: "Flow JSON response" } : {})
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function toEndpointFlow(flow, file) {
|
|
29
|
+
const endpointId = flow.nodes.find(isApiNode)?.id ?? flow.nodes[0]?.id ?? flow.id;
|
|
30
|
+
return {
|
|
31
|
+
endpointId,
|
|
32
|
+
nodes: flow.nodes.map((node) => toViewerNode(node, file)),
|
|
33
|
+
edges: flow.edges.map(toViewerEdge),
|
|
34
|
+
mainPath: buildMainPath(flow),
|
|
35
|
+
subFlows: []
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function toViewerNode(node, file) {
|
|
39
|
+
const metadata = {
|
|
40
|
+
...(node.metadata ?? {}),
|
|
41
|
+
flowJsonType: node.type
|
|
42
|
+
};
|
|
43
|
+
if (file.generatedBy) {
|
|
44
|
+
metadata.generatedBy = file.generatedBy;
|
|
45
|
+
}
|
|
46
|
+
if (file.snapshot) {
|
|
47
|
+
metadata.snapshot = file.snapshot;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
id: node.id,
|
|
51
|
+
type: toViewerNodeType(node.type),
|
|
52
|
+
label: node.label,
|
|
53
|
+
confidence: confidenceFromStatus(node.status),
|
|
54
|
+
status: node.status,
|
|
55
|
+
...(node.timing ? { timing: node.timing } : {}),
|
|
56
|
+
...(node.evidenceIds ? { evidenceIds: node.evidenceIds } : {}),
|
|
57
|
+
...(node.request ? { request: node.request } : {}),
|
|
58
|
+
...(node.response ? { response: node.response } : {}),
|
|
59
|
+
metadata
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function toViewerEdge(edge, index) {
|
|
63
|
+
return {
|
|
64
|
+
id: edge.id ?? `edge:${edge.from}:${edge.to}:${index}`,
|
|
65
|
+
from: edge.from,
|
|
66
|
+
to: edge.to,
|
|
67
|
+
kind: "main",
|
|
68
|
+
...(edge.label ? { label: edge.label } : {}),
|
|
69
|
+
confidence: confidenceFromStatus(edge.status),
|
|
70
|
+
status: edge.status,
|
|
71
|
+
...(edge.timing ? { timing: edge.timing } : {}),
|
|
72
|
+
...(edge.evidenceIds ? { evidenceIds: edge.evidenceIds } : {}),
|
|
73
|
+
...(edge.metadata ? { metadata: edge.metadata } : {})
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function buildMainPath(flow) {
|
|
77
|
+
const firstNode = flow.nodes[0];
|
|
78
|
+
if (!firstNode) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
const nodeIds = new Set(flow.nodes.map((node) => node.id));
|
|
82
|
+
const path = [firstNode.id];
|
|
83
|
+
const visited = new Set(path);
|
|
84
|
+
let current = firstNode.id;
|
|
85
|
+
for (let step = 0; step < flow.edges.length; step += 1) {
|
|
86
|
+
const nextEdge = flow.edges.find((edge) => edge.from === current);
|
|
87
|
+
if (!nextEdge || visited.has(nextEdge.to) || !nodeIds.has(nextEdge.to)) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
path.push(nextEdge.to);
|
|
91
|
+
visited.add(nextEdge.to);
|
|
92
|
+
current = nextEdge.to;
|
|
93
|
+
}
|
|
94
|
+
return path;
|
|
95
|
+
}
|
|
96
|
+
function parseEndpointLabel(label) {
|
|
97
|
+
const match = /^(GET|POST|PUT|PATCH|DELETE)\s+(\S+)/.exec(label.trim());
|
|
98
|
+
if (!match) {
|
|
99
|
+
return {
|
|
100
|
+
method: "GET",
|
|
101
|
+
path: label
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
method: match[1],
|
|
106
|
+
path: match[2]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function confidenceFromStatus(status) {
|
|
110
|
+
if (status === "observed" || status === "measured" || status === "source-matched") {
|
|
111
|
+
return "high";
|
|
112
|
+
}
|
|
113
|
+
if (status === "manual") {
|
|
114
|
+
return "medium";
|
|
115
|
+
}
|
|
116
|
+
if (status === "agent-inferred" || status === "not-proven") {
|
|
117
|
+
return "low";
|
|
118
|
+
}
|
|
119
|
+
return "unknown";
|
|
120
|
+
}
|
|
121
|
+
function isApiNode(node) {
|
|
122
|
+
return API_NODE_TYPES.has(node.type);
|
|
123
|
+
}
|
|
124
|
+
function toViewerNodeType(type) {
|
|
125
|
+
switch (type) {
|
|
126
|
+
case "ui.page":
|
|
127
|
+
case "ui.action":
|
|
128
|
+
case "ui.component":
|
|
129
|
+
return "page";
|
|
130
|
+
case "api.request":
|
|
131
|
+
case "api.route":
|
|
132
|
+
return "endpoint";
|
|
133
|
+
case "external":
|
|
134
|
+
return "externalApi";
|
|
135
|
+
case "response":
|
|
136
|
+
case "result":
|
|
137
|
+
return "schema";
|
|
138
|
+
case "middleware":
|
|
139
|
+
case "auth.session":
|
|
140
|
+
case "queue":
|
|
141
|
+
case "job":
|
|
142
|
+
return "utility";
|
|
143
|
+
case "controller":
|
|
144
|
+
case "service":
|
|
145
|
+
case "repository":
|
|
146
|
+
case "database":
|
|
147
|
+
case "unknown":
|
|
148
|
+
return type;
|
|
149
|
+
default:
|
|
150
|
+
return "unknown";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/flow-spec/normalize.ts"],"names":[],"mappings":"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"}
|