@principal-ai/principal-view-core 0.5.6
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 +126 -0
- package/dist/ConfigurationLoader.d.ts +76 -0
- package/dist/ConfigurationLoader.d.ts.map +1 -0
- package/dist/ConfigurationLoader.js +144 -0
- package/dist/ConfigurationLoader.js.map +1 -0
- package/dist/ConfigurationValidator.d.ts +31 -0
- package/dist/ConfigurationValidator.d.ts.map +1 -0
- package/dist/ConfigurationValidator.js +242 -0
- package/dist/ConfigurationValidator.js.map +1 -0
- package/dist/EventProcessor.d.ts +49 -0
- package/dist/EventProcessor.d.ts.map +1 -0
- package/dist/EventProcessor.js +215 -0
- package/dist/EventProcessor.js.map +1 -0
- package/dist/EventRecorderService.d.ts +305 -0
- package/dist/EventRecorderService.d.ts.map +1 -0
- package/dist/EventRecorderService.js +463 -0
- package/dist/EventRecorderService.js.map +1 -0
- package/dist/LibraryLoader.d.ts +63 -0
- package/dist/LibraryLoader.d.ts.map +1 -0
- package/dist/LibraryLoader.js +188 -0
- package/dist/LibraryLoader.js.map +1 -0
- package/dist/PathBasedEventProcessor.d.ts +90 -0
- package/dist/PathBasedEventProcessor.d.ts.map +1 -0
- package/dist/PathBasedEventProcessor.js +239 -0
- package/dist/PathBasedEventProcessor.js.map +1 -0
- package/dist/SessionManager.d.ts +194 -0
- package/dist/SessionManager.d.ts.map +1 -0
- package/dist/SessionManager.js +299 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/ValidationEngine.d.ts +31 -0
- package/dist/ValidationEngine.d.ts.map +1 -0
- package/dist/ValidationEngine.js +158 -0
- package/dist/ValidationEngine.js.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.js +248 -0
- package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/config.d.ts +57 -0
- package/dist/rules/config.d.ts.map +1 -0
- package/dist/rules/config.js +382 -0
- package/dist/rules/config.js.map +1 -0
- package/dist/rules/engine.d.ts +70 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +252 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/implementations/connection-type-references.d.ts +7 -0
- package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
- package/dist/rules/implementations/connection-type-references.js +104 -0
- package/dist/rules/implementations/connection-type-references.js.map +1 -0
- package/dist/rules/implementations/dead-end-states.d.ts +17 -0
- package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
- package/dist/rules/implementations/dead-end-states.js +72 -0
- package/dist/rules/implementations/dead-end-states.js.map +1 -0
- package/dist/rules/implementations/index.d.ts +24 -0
- package/dist/rules/implementations/index.d.ts.map +1 -0
- package/dist/rules/implementations/index.js +62 -0
- package/dist/rules/implementations/index.js.map +1 -0
- package/dist/rules/implementations/library-node-type-match.d.ts +17 -0
- package/dist/rules/implementations/library-node-type-match.d.ts.map +1 -0
- package/dist/rules/implementations/library-node-type-match.js +123 -0
- package/dist/rules/implementations/library-node-type-match.js.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts +22 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.js +54 -0
- package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.js +211 -0
- package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.js +47 -0
- package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.js +50 -0
- package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
- package/dist/rules/implementations/required-metadata.d.ts +7 -0
- package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
- package/dist/rules/implementations/required-metadata.js +57 -0
- package/dist/rules/implementations/required-metadata.js.map +1 -0
- package/dist/rules/implementations/state-transition-references.d.ts +7 -0
- package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
- package/dist/rules/implementations/state-transition-references.js +135 -0
- package/dist/rules/implementations/state-transition-references.js.map +1 -0
- package/dist/rules/implementations/unreachable-states.d.ts +7 -0
- package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
- package/dist/rules/implementations/unreachable-states.js +80 -0
- package/dist/rules/implementations/unreachable-states.js.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.js +109 -0
- package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
- package/dist/rules/implementations/valid-color-format.d.ts +7 -0
- package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
- package/dist/rules/implementations/valid-color-format.js +91 -0
- package/dist/rules/implementations/valid-color-format.js.map +1 -0
- package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
- package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-edge-types.js +244 -0
- package/dist/rules/implementations/valid-edge-types.js.map +1 -0
- package/dist/rules/implementations/valid-node-types.d.ts +7 -0
- package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-node-types.js +175 -0
- package/dist/rules/implementations/valid-node-types.js.map +1 -0
- package/dist/rules/index.d.ts +28 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +45 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +309 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +35 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/types/canvas.d.ts +409 -0
- package/dist/types/canvas.d.ts.map +1 -0
- package/dist/types/canvas.js +70 -0
- package/dist/types/canvas.js.map +1 -0
- package/dist/types/index.d.ts +311 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/library.d.ts +185 -0
- package/dist/types/library.d.ts.map +1 -0
- package/dist/types/library.js +15 -0
- package/dist/types/library.js.map +1 -0
- package/dist/types/path-based-config.d.ts +230 -0
- package/dist/types/path-based-config.d.ts.map +1 -0
- package/dist/types/path-based-config.js +9 -0
- package/dist/types/path-based-config.js.map +1 -0
- package/dist/utils/CanvasConverter.d.ts +118 -0
- package/dist/utils/CanvasConverter.d.ts.map +1 -0
- package/dist/utils/CanvasConverter.js +315 -0
- package/dist/utils/CanvasConverter.js.map +1 -0
- package/dist/utils/GraphConverter.d.ts +18 -0
- package/dist/utils/GraphConverter.d.ts.map +1 -0
- package/dist/utils/GraphConverter.js +61 -0
- package/dist/utils/GraphConverter.js.map +1 -0
- package/dist/utils/LibraryConverter.d.ts +113 -0
- package/dist/utils/LibraryConverter.d.ts.map +1 -0
- package/dist/utils/LibraryConverter.js +166 -0
- package/dist/utils/LibraryConverter.js.map +1 -0
- package/dist/utils/PathMatcher.d.ts +55 -0
- package/dist/utils/PathMatcher.d.ts.map +1 -0
- package/dist/utils/PathMatcher.js +172 -0
- package/dist/utils/PathMatcher.js.map +1 -0
- package/dist/utils/YamlParser.d.ts +36 -0
- package/dist/utils/YamlParser.d.ts.map +1 -0
- package/dist/utils/YamlParser.js +63 -0
- package/dist/utils/YamlParser.js.map +1 -0
- package/package.json +47 -0
- package/src/ConfigurationLoader.test.ts +490 -0
- package/src/ConfigurationLoader.ts +185 -0
- package/src/ConfigurationValidator.test.ts +200 -0
- package/src/ConfigurationValidator.ts +283 -0
- package/src/EventProcessor.test.ts +405 -0
- package/src/EventProcessor.ts +250 -0
- package/src/EventRecorderService.test.ts +541 -0
- package/src/EventRecorderService.ts +744 -0
- package/src/LibraryLoader.ts +215 -0
- package/src/PathBasedEventProcessor.test.ts +567 -0
- package/src/PathBasedEventProcessor.ts +332 -0
- package/src/SessionManager.test.ts +424 -0
- package/src/SessionManager.ts +470 -0
- package/src/ValidationEngine.test.ts +371 -0
- package/src/ValidationEngine.ts +196 -0
- package/src/helpers/GraphInstrumentationHelper.test.ts +340 -0
- package/src/helpers/GraphInstrumentationHelper.ts +326 -0
- package/src/index.ts +85 -0
- package/src/rules/config.test.ts +278 -0
- package/src/rules/config.ts +459 -0
- package/src/rules/engine.test.ts +332 -0
- package/src/rules/engine.ts +318 -0
- package/src/rules/implementations/connection-type-references.ts +117 -0
- package/src/rules/implementations/dead-end-states.ts +101 -0
- package/src/rules/implementations/index.ts +73 -0
- package/src/rules/implementations/library-node-type-match.ts +148 -0
- package/src/rules/implementations/minimum-node-sources.ts +82 -0
- package/src/rules/implementations/no-unknown-fields.ts +342 -0
- package/src/rules/implementations/orphaned-edge-types.ts +55 -0
- package/src/rules/implementations/orphaned-node-types.ts +58 -0
- package/src/rules/implementations/required-metadata.ts +64 -0
- package/src/rules/implementations/state-transition-references.ts +151 -0
- package/src/rules/implementations/unreachable-states.ts +94 -0
- package/src/rules/implementations/valid-action-patterns.ts +136 -0
- package/src/rules/implementations/valid-color-format.ts +140 -0
- package/src/rules/implementations/valid-edge-types.ts +258 -0
- package/src/rules/implementations/valid-node-types.ts +189 -0
- package/src/rules/index.ts +95 -0
- package/src/rules/types.ts +426 -0
- package/src/types/canvas.ts +496 -0
- package/src/types/index.ts +382 -0
- package/src/types/library.ts +233 -0
- package/src/types/path-based-config.ts +281 -0
- package/src/utils/CanvasConverter.ts +431 -0
- package/src/utils/GraphConverter.test.ts +195 -0
- package/src/utils/GraphConverter.ts +71 -0
- package/src/utils/LibraryConverter.ts +245 -0
- package/src/utils/PathMatcher.test.ts +148 -0
- package/src/utils/PathMatcher.ts +183 -0
- package/src/utils/YamlParser.ts +75 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: library-node-type-match
|
|
3
|
+
* Ensures nodeTypes match library nodeComponents when a library is provided
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
allowExtra: false,
|
|
7
|
+
};
|
|
8
|
+
export const libraryNodeTypeMatch = {
|
|
9
|
+
id: 'library-node-type-match',
|
|
10
|
+
name: 'Library Node Type Match',
|
|
11
|
+
description: 'NodeTypes must match library nodeComponents when a library is provided',
|
|
12
|
+
impact: 'Mismatched types may cause inconsistent behavior or missing features',
|
|
13
|
+
severity: 'error',
|
|
14
|
+
category: 'library',
|
|
15
|
+
enabled: true,
|
|
16
|
+
fixable: false,
|
|
17
|
+
defaultOptions: DEFAULT_OPTIONS,
|
|
18
|
+
async check(context) {
|
|
19
|
+
const violations = [];
|
|
20
|
+
const { configuration, library, configPath, libraryPath, options } = context;
|
|
21
|
+
// Skip if no library is provided
|
|
22
|
+
if (!library) {
|
|
23
|
+
return violations;
|
|
24
|
+
}
|
|
25
|
+
// Skip if library has no nodeComponents
|
|
26
|
+
if (!library.nodeComponents || Object.keys(library.nodeComponents).length === 0) {
|
|
27
|
+
return violations;
|
|
28
|
+
}
|
|
29
|
+
const libraryNodeTypes = new Set(Object.keys(library.nodeComponents));
|
|
30
|
+
const configNodeTypes = Object.keys(configuration.nodeTypes ?? {});
|
|
31
|
+
// Check each nodeType in configuration
|
|
32
|
+
for (const typeId of configNodeTypes) {
|
|
33
|
+
if (!libraryNodeTypes.has(typeId)) {
|
|
34
|
+
if (!options.allowExtra) {
|
|
35
|
+
const suggestion = findSimilar(typeId, libraryNodeTypes);
|
|
36
|
+
violations.push({
|
|
37
|
+
ruleId: 'library-node-type-match',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
file: configPath,
|
|
40
|
+
path: `nodeTypes.${typeId}`,
|
|
41
|
+
message: `Node type "${typeId}" is not defined in the component library`,
|
|
42
|
+
impact: 'This node type may be missing library-defined behavior or styling',
|
|
43
|
+
suggestion: suggestion
|
|
44
|
+
? `Did you mean "${suggestion}"?`
|
|
45
|
+
: `Available library nodeComponents: ${[...libraryNodeTypes].join(', ')}`,
|
|
46
|
+
fixable: false,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Validate that config matches library definition
|
|
52
|
+
const libraryComponent = library.nodeComponents[typeId];
|
|
53
|
+
const configNodeType = configuration.nodeTypes[typeId];
|
|
54
|
+
// Check shape matches if library defines one
|
|
55
|
+
if (libraryComponent.shape && configNodeType.shape !== libraryComponent.shape) {
|
|
56
|
+
violations.push({
|
|
57
|
+
ruleId: 'library-node-type-match',
|
|
58
|
+
severity: 'error',
|
|
59
|
+
file: configPath,
|
|
60
|
+
path: `nodeTypes.${typeId}.shape`,
|
|
61
|
+
message: `Node type "${typeId}" shape "${configNodeType.shape}" doesn't match library definition "${libraryComponent.shape}"`,
|
|
62
|
+
impact: 'Node may render differently than expected',
|
|
63
|
+
suggestion: `Use shape "${libraryComponent.shape}" as defined in the library`,
|
|
64
|
+
fixable: true,
|
|
65
|
+
fixData: {
|
|
66
|
+
typeId,
|
|
67
|
+
field: 'shape',
|
|
68
|
+
expected: libraryComponent.shape,
|
|
69
|
+
actual: configNodeType.shape,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Check that config defines all states from library
|
|
74
|
+
if (libraryComponent.states && Object.keys(libraryComponent.states).length > 0) {
|
|
75
|
+
const libraryStates = Object.keys(libraryComponent.states);
|
|
76
|
+
const configStates = configNodeType.states ? Object.keys(configNodeType.states) : [];
|
|
77
|
+
for (const stateId of libraryStates) {
|
|
78
|
+
if (!configStates.includes(stateId)) {
|
|
79
|
+
violations.push({
|
|
80
|
+
ruleId: 'library-node-type-match',
|
|
81
|
+
severity: 'error',
|
|
82
|
+
file: configPath,
|
|
83
|
+
path: `nodeTypes.${typeId}.states`,
|
|
84
|
+
message: `Node type "${typeId}" is missing state "${stateId}" defined in library`,
|
|
85
|
+
impact: 'State transitions to this state may fail',
|
|
86
|
+
suggestion: `Add state "${stateId}" to nodeTypes.${typeId}.states`,
|
|
87
|
+
fixable: false,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return violations;
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Find a similar string from a set (for "did you mean" suggestions)
|
|
99
|
+
*/
|
|
100
|
+
function findSimilar(input, candidates) {
|
|
101
|
+
const inputLower = input.toLowerCase();
|
|
102
|
+
for (const candidate of candidates) {
|
|
103
|
+
const candidateLower = candidate.toLowerCase();
|
|
104
|
+
// Exact substring match
|
|
105
|
+
if (inputLower.includes(candidateLower) || candidateLower.includes(inputLower)) {
|
|
106
|
+
return candidate;
|
|
107
|
+
}
|
|
108
|
+
// Small edit distance
|
|
109
|
+
if (Math.abs(input.length - candidate.length) <= 2) {
|
|
110
|
+
let differences = 0;
|
|
111
|
+
const minLen = Math.min(inputLower.length, candidateLower.length);
|
|
112
|
+
for (let i = 0; i < minLen; i++) {
|
|
113
|
+
if (inputLower[i] !== candidateLower[i])
|
|
114
|
+
differences++;
|
|
115
|
+
}
|
|
116
|
+
differences += Math.abs(input.length - candidate.length);
|
|
117
|
+
if (differences <= 2)
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=library-node-type-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-node-type-match.js","sourceRoot":"","sources":["../../../src/rules/implementations/library-node-type-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: minimum-node-sources
|
|
3
|
+
* Ensures each nodeType has at least a minimum number of sources defined
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphRule, RuleOptions } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Options for minimum-node-sources rule
|
|
8
|
+
*/
|
|
9
|
+
export interface MinimumNodeSourcesOptions extends RuleOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Minimum number of sources required per nodeType
|
|
12
|
+
* @default 1
|
|
13
|
+
*/
|
|
14
|
+
minimum: number;
|
|
15
|
+
/**
|
|
16
|
+
* NodeType IDs to exclude from this check
|
|
17
|
+
* @default []
|
|
18
|
+
*/
|
|
19
|
+
excludeNodeTypes: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare const minimumNodeSources: GraphRule<MinimumNodeSourcesOptions>;
|
|
22
|
+
//# sourceMappingURL=minimum-node-sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimum-node-sources.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/minimum-node-sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,WAAW;IAC5D;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAOD,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,yBAAyB,CAoDnE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: minimum-node-sources
|
|
3
|
+
* Ensures each nodeType has at least a minimum number of sources defined
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
minimum: 1,
|
|
7
|
+
excludeNodeTypes: [],
|
|
8
|
+
};
|
|
9
|
+
export const minimumNodeSources = {
|
|
10
|
+
id: 'minimum-node-sources',
|
|
11
|
+
name: 'Minimum Node Sources',
|
|
12
|
+
description: 'Each nodeType must have at least a minimum number of sources defined',
|
|
13
|
+
impact: 'NodeTypes without sources cannot be associated with log activity',
|
|
14
|
+
severity: 'error',
|
|
15
|
+
category: 'structure',
|
|
16
|
+
enabled: true,
|
|
17
|
+
fixable: false,
|
|
18
|
+
defaultOptions: DEFAULT_OPTIONS,
|
|
19
|
+
async check(context) {
|
|
20
|
+
const violations = [];
|
|
21
|
+
const { configuration, configPath, options } = context;
|
|
22
|
+
const minimum = options.minimum ?? DEFAULT_OPTIONS.minimum;
|
|
23
|
+
const excludeNodeTypes = options.excludeNodeTypes ?? DEFAULT_OPTIONS.excludeNodeTypes;
|
|
24
|
+
if (!configuration.nodeTypes) {
|
|
25
|
+
return violations;
|
|
26
|
+
}
|
|
27
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
28
|
+
// Skip excluded node types
|
|
29
|
+
if (excludeNodeTypes.includes(typeId)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Get sources from nodeType (may be extended via path-based config)
|
|
33
|
+
const nodeTypeAny = nodeType;
|
|
34
|
+
const sources = nodeTypeAny.sources;
|
|
35
|
+
const sourceCount = Array.isArray(sources) ? sources.length : 0;
|
|
36
|
+
if (sourceCount < minimum) {
|
|
37
|
+
violations.push({
|
|
38
|
+
ruleId: 'minimum-node-sources',
|
|
39
|
+
severity: 'error',
|
|
40
|
+
file: configPath,
|
|
41
|
+
path: `nodeTypes.${typeId}.sources`,
|
|
42
|
+
message: sourceCount === 0
|
|
43
|
+
? `Node type "${typeId}" has no sources defined`
|
|
44
|
+
: `Node type "${typeId}" has ${sourceCount} source(s), minimum required is ${minimum}`,
|
|
45
|
+
impact: 'This node type cannot be associated with log activity from source files',
|
|
46
|
+
suggestion: `Add at least ${minimum} source path(s) to nodeTypes.${typeId}.sources`,
|
|
47
|
+
fixable: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return violations;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=minimum-node-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimum-node-sources.js","sourceRoot":"","sources":["../../../src/rules/implementations/minimum-node-sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,MAAM,eAAe,GAA8B;IACjD,OAAO,EAAE,CAAC;IACV,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACtE,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,sEAAsE;IACnF,MAAM,EAAE,kEAAkE;IAC1E,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IACd,cAAc,EAAE,eAAe;IAE/B,KAAK,CAAC,KAAK,CAAC,OAAoD;QAC9D,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC;QAC3D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,gBAAgB,CAAC;QAEtF,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACzE,2BAA2B;YAC3B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,oEAAoE;YACpE,MAAM,WAAW,GAAG,QAA8C,CAAC;YACnE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACpC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhE,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,UAAU;oBACnC,OAAO,EACL,WAAW,KAAK,CAAC;wBACf,CAAC,CAAC,cAAc,MAAM,0BAA0B;wBAChD,CAAC,CAAC,cAAc,MAAM,SAAS,WAAW,mCAAmC,OAAO,EAAE;oBAC1F,MAAM,EAAE,yEAAyE;oBACjF,UAAU,EAAE,gBAAgB,OAAO,gCAAgC,MAAM,UAAU;oBACnF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unknown-fields.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/no-unknown-fields.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAgDhF,eAAO,MAAM,eAAe,EAAE,SAqO7B,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: no-unknown-fields
|
|
3
|
+
* Flags fields that are not defined in the configuration schema
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Allowed fields for each configuration section
|
|
7
|
+
*/
|
|
8
|
+
const ALLOWED_FIELDS = {
|
|
9
|
+
root: ['metadata', 'nodeTypes', 'edgeTypes', 'allowedConnections', 'validation', 'display'],
|
|
10
|
+
metadata: ['name', 'version', 'description'],
|
|
11
|
+
nodeType: [
|
|
12
|
+
'shape',
|
|
13
|
+
'icon',
|
|
14
|
+
'color',
|
|
15
|
+
'stroke',
|
|
16
|
+
'size',
|
|
17
|
+
'dataSchema',
|
|
18
|
+
'states',
|
|
19
|
+
'layout',
|
|
20
|
+
'sources',
|
|
21
|
+
'actions',
|
|
22
|
+
],
|
|
23
|
+
edgeType: [
|
|
24
|
+
'style',
|
|
25
|
+
'color',
|
|
26
|
+
'width',
|
|
27
|
+
'directed',
|
|
28
|
+
'animated',
|
|
29
|
+
'label',
|
|
30
|
+
'animation',
|
|
31
|
+
'dataSchema',
|
|
32
|
+
'activatedBy',
|
|
33
|
+
],
|
|
34
|
+
connectionRule: ['from', 'to', 'via', 'constraints'],
|
|
35
|
+
connectionConstraints: ['maxInstances', 'bidirectional', 'exclusive'],
|
|
36
|
+
validation: ['stateTransitions', 'constraints', 'cardinality'],
|
|
37
|
+
display: ['layout', 'theme', 'animations'],
|
|
38
|
+
displayTheme: ['primary', 'success', 'warning', 'danger', 'info'],
|
|
39
|
+
displayAnimations: ['enabled', 'speed'],
|
|
40
|
+
dataSchemaField: ['type', 'required', 'displayInLabel', 'label', 'displayInInfo'],
|
|
41
|
+
stateDefinition: ['color', 'icon', 'label'],
|
|
42
|
+
layoutHints: ['layer', 'cluster'],
|
|
43
|
+
edgeLabel: ['field', 'position'],
|
|
44
|
+
edgeAnimation: ['type', 'duration', 'color'],
|
|
45
|
+
nodeSize: ['width', 'height'],
|
|
46
|
+
stateTransition: ['from', 'to'],
|
|
47
|
+
constraint: ['id', 'description', 'check', 'severity'],
|
|
48
|
+
actionPattern: ['pattern', 'event', 'state', 'metadata'],
|
|
49
|
+
};
|
|
50
|
+
export const noUnknownFields = {
|
|
51
|
+
id: 'no-unknown-fields',
|
|
52
|
+
name: 'No Unknown Fields',
|
|
53
|
+
description: 'Flag fields that are not defined in the configuration schema',
|
|
54
|
+
impact: 'Unknown fields are likely typos and will be ignored',
|
|
55
|
+
severity: 'error',
|
|
56
|
+
category: 'schema',
|
|
57
|
+
enabled: true,
|
|
58
|
+
fixable: true,
|
|
59
|
+
async check(context) {
|
|
60
|
+
const violations = [];
|
|
61
|
+
const { configuration, configPath } = context;
|
|
62
|
+
// Check root level fields
|
|
63
|
+
checkFields(configuration, ALLOWED_FIELDS.root, '', configPath, violations);
|
|
64
|
+
// Check metadata fields
|
|
65
|
+
if (configuration.metadata) {
|
|
66
|
+
checkFields(configuration.metadata, ALLOWED_FIELDS.metadata, 'metadata', configPath, violations);
|
|
67
|
+
}
|
|
68
|
+
// Check nodeTypes
|
|
69
|
+
if (configuration.nodeTypes) {
|
|
70
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
71
|
+
const basePath = `nodeTypes.${typeId}`;
|
|
72
|
+
checkFields(nodeType, ALLOWED_FIELDS.nodeType, basePath, configPath, violations);
|
|
73
|
+
// Check nested fields in nodeType
|
|
74
|
+
if (nodeType.dataSchema) {
|
|
75
|
+
for (const [fieldName, fieldDef] of Object.entries(nodeType.dataSchema)) {
|
|
76
|
+
checkFields(fieldDef, ALLOWED_FIELDS.dataSchemaField, `${basePath}.dataSchema.${fieldName}`, configPath, violations);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (nodeType.states) {
|
|
80
|
+
for (const [stateName, stateDef] of Object.entries(nodeType.states)) {
|
|
81
|
+
checkFields(stateDef, ALLOWED_FIELDS.stateDefinition, `${basePath}.states.${stateName}`, configPath, violations);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (nodeType.layout) {
|
|
85
|
+
checkFields(nodeType.layout, ALLOWED_FIELDS.layoutHints, `${basePath}.layout`, configPath, violations);
|
|
86
|
+
}
|
|
87
|
+
if (nodeType.size) {
|
|
88
|
+
checkFields(nodeType.size, ALLOWED_FIELDS.nodeSize, `${basePath}.size`, configPath, violations);
|
|
89
|
+
}
|
|
90
|
+
// Check actions
|
|
91
|
+
const nodeTypeAny = nodeType;
|
|
92
|
+
if (Array.isArray(nodeTypeAny.actions)) {
|
|
93
|
+
nodeTypeAny.actions.forEach((action, index) => {
|
|
94
|
+
if (typeof action === 'object' && action !== null) {
|
|
95
|
+
checkFields(action, ALLOWED_FIELDS.actionPattern, `${basePath}.actions[${index}]`, configPath, violations);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Check edgeTypes
|
|
102
|
+
if (configuration.edgeTypes) {
|
|
103
|
+
for (const [typeId, edgeType] of Object.entries(configuration.edgeTypes)) {
|
|
104
|
+
const basePath = `edgeTypes.${typeId}`;
|
|
105
|
+
checkFields(edgeType, ALLOWED_FIELDS.edgeType, basePath, configPath, violations);
|
|
106
|
+
if (edgeType.label && typeof edgeType.label === 'object') {
|
|
107
|
+
checkFields(edgeType.label, ALLOWED_FIELDS.edgeLabel, `${basePath}.label`, configPath, violations);
|
|
108
|
+
}
|
|
109
|
+
if (edgeType.animation && typeof edgeType.animation === 'object') {
|
|
110
|
+
checkFields(edgeType.animation, ALLOWED_FIELDS.edgeAnimation, `${basePath}.animation`, configPath, violations);
|
|
111
|
+
}
|
|
112
|
+
if (edgeType.dataSchema) {
|
|
113
|
+
for (const [fieldName, fieldDef] of Object.entries(edgeType.dataSchema)) {
|
|
114
|
+
checkFields(fieldDef, ALLOWED_FIELDS.dataSchemaField, `${basePath}.dataSchema.${fieldName}`, configPath, violations);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check allowedConnections
|
|
120
|
+
if (configuration.allowedConnections) {
|
|
121
|
+
configuration.allowedConnections.forEach((rule, index) => {
|
|
122
|
+
const basePath = `allowedConnections[${index}]`;
|
|
123
|
+
checkFields(rule, ALLOWED_FIELDS.connectionRule, basePath, configPath, violations);
|
|
124
|
+
if (rule.constraints) {
|
|
125
|
+
checkFields(rule.constraints, ALLOWED_FIELDS.connectionConstraints, `${basePath}.constraints`, configPath, violations);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Check validation
|
|
130
|
+
if (configuration.validation) {
|
|
131
|
+
checkFields(configuration.validation, ALLOWED_FIELDS.validation, 'validation', configPath, violations);
|
|
132
|
+
// Check state transitions
|
|
133
|
+
if (configuration.validation.stateTransitions) {
|
|
134
|
+
for (const [nodeType, transitions] of Object.entries(configuration.validation.stateTransitions)) {
|
|
135
|
+
if (Array.isArray(transitions)) {
|
|
136
|
+
transitions.forEach((transition, index) => {
|
|
137
|
+
checkFields(transition, ALLOWED_FIELDS.stateTransition, `validation.stateTransitions.${nodeType}[${index}]`, configPath, violations);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Check constraints
|
|
143
|
+
if (configuration.validation.constraints && Array.isArray(configuration.validation.constraints)) {
|
|
144
|
+
configuration.validation.constraints.forEach((constraint, index) => {
|
|
145
|
+
checkFields(constraint, ALLOWED_FIELDS.constraint, `validation.constraints[${index}]`, configPath, violations);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Check display
|
|
150
|
+
if (configuration.display) {
|
|
151
|
+
checkFields(configuration.display, ALLOWED_FIELDS.display, 'display', configPath, violations);
|
|
152
|
+
if (configuration.display.theme) {
|
|
153
|
+
checkFields(configuration.display.theme, ALLOWED_FIELDS.displayTheme, 'display.theme', configPath, violations);
|
|
154
|
+
}
|
|
155
|
+
if (configuration.display.animations) {
|
|
156
|
+
checkFields(configuration.display.animations, ALLOWED_FIELDS.displayAnimations, 'display.animations', configPath, violations);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return violations;
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Check an object's fields against allowed fields
|
|
164
|
+
*/
|
|
165
|
+
function checkFields(obj, allowedFields, path, configPath, violations) {
|
|
166
|
+
for (const field of Object.keys(obj)) {
|
|
167
|
+
if (!allowedFields.includes(field)) {
|
|
168
|
+
const suggestion = findSimilarField(field, allowedFields);
|
|
169
|
+
violations.push({
|
|
170
|
+
ruleId: 'no-unknown-fields',
|
|
171
|
+
severity: 'error',
|
|
172
|
+
file: configPath,
|
|
173
|
+
path: path ? `${path}.${field}` : field,
|
|
174
|
+
message: `Unknown field "${field}"${path ? ` in ${path}` : ' at root level'}`,
|
|
175
|
+
impact: 'This field will be ignored and may indicate a configuration error',
|
|
176
|
+
suggestion: suggestion
|
|
177
|
+
? `Did you mean "${suggestion}"? Allowed fields: ${allowedFields.join(', ')}`
|
|
178
|
+
: `Allowed fields: ${allowedFields.join(', ')}`,
|
|
179
|
+
fixable: true,
|
|
180
|
+
fixData: { path, field, suggestion },
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Find a similar field name for "did you mean" suggestions
|
|
187
|
+
*/
|
|
188
|
+
function findSimilarField(field, allowedFields) {
|
|
189
|
+
const fieldLower = field.toLowerCase();
|
|
190
|
+
for (const allowed of allowedFields) {
|
|
191
|
+
const allowedLower = allowed.toLowerCase();
|
|
192
|
+
// Check for substring match
|
|
193
|
+
if (fieldLower.includes(allowedLower) || allowedLower.includes(fieldLower)) {
|
|
194
|
+
return allowed;
|
|
195
|
+
}
|
|
196
|
+
// Check for small edit distance (typos)
|
|
197
|
+
if (Math.abs(field.length - allowed.length) <= 2) {
|
|
198
|
+
let differences = 0;
|
|
199
|
+
const minLen = Math.min(fieldLower.length, allowedLower.length);
|
|
200
|
+
for (let i = 0; i < minLen; i++) {
|
|
201
|
+
if (fieldLower[i] !== allowedLower[i])
|
|
202
|
+
differences++;
|
|
203
|
+
}
|
|
204
|
+
differences += Math.abs(field.length - allowed.length);
|
|
205
|
+
if (differences <= 2)
|
|
206
|
+
return allowed;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=no-unknown-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unknown-fields.js","sourceRoot":"","sources":["../../../src/rules/implementations/no-unknown-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphaned-edge-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SA+C/B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: orphaned-edge-types
|
|
3
|
+
* Warns when edgeTypes are not used in any connection rule
|
|
4
|
+
*/
|
|
5
|
+
export const orphanedEdgeTypes = {
|
|
6
|
+
id: 'orphaned-edge-types',
|
|
7
|
+
name: 'Orphaned Edge Types',
|
|
8
|
+
description: 'EdgeTypes should be used in at least one connection rule',
|
|
9
|
+
impact: 'Orphaned edge types may indicate unused or misconfigured types',
|
|
10
|
+
severity: 'error',
|
|
11
|
+
category: 'structure',
|
|
12
|
+
enabled: true,
|
|
13
|
+
fixable: false,
|
|
14
|
+
async check(context) {
|
|
15
|
+
const violations = [];
|
|
16
|
+
const { configuration, configPath } = context;
|
|
17
|
+
if (!configuration.edgeTypes || Object.keys(configuration.edgeTypes).length === 0) {
|
|
18
|
+
return violations;
|
|
19
|
+
}
|
|
20
|
+
// Collect all edgeTypes referenced in allowedConnections
|
|
21
|
+
const referencedEdgeTypes = new Set();
|
|
22
|
+
if (configuration.allowedConnections) {
|
|
23
|
+
for (const connection of configuration.allowedConnections) {
|
|
24
|
+
if (connection.via) {
|
|
25
|
+
referencedEdgeTypes.add(connection.via);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Check each edgeType
|
|
30
|
+
for (const typeId of Object.keys(configuration.edgeTypes)) {
|
|
31
|
+
if (!referencedEdgeTypes.has(typeId)) {
|
|
32
|
+
violations.push({
|
|
33
|
+
ruleId: 'orphaned-edge-types',
|
|
34
|
+
severity: 'error',
|
|
35
|
+
file: configPath,
|
|
36
|
+
path: `edgeTypes.${typeId}`,
|
|
37
|
+
message: `Edge type "${typeId}" is not used in any connection rule`,
|
|
38
|
+
impact: 'This edge type may be unused or misconfigured',
|
|
39
|
+
suggestion: `Add a connection rule using this edge type, or remove it if unused`,
|
|
40
|
+
fixable: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return violations;
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=orphaned-edge-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphaned-edge-types.js","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,0DAA0D;IACvE,MAAM,EAAE,gEAAgE;IACxE,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IAEd,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9C,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACrC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;oBACnB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,EAAE;oBAC3B,OAAO,EAAE,cAAc,MAAM,sCAAsC;oBACnE,MAAM,EAAE,+CAA+C;oBACvD,UAAU,EAAE,oEAAoE;oBAChF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphaned-node-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-node-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SAkD/B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: orphaned-node-types
|
|
3
|
+
* Warns when nodeTypes are not used in any connection rule
|
|
4
|
+
*/
|
|
5
|
+
export const orphanedNodeTypes = {
|
|
6
|
+
id: 'orphaned-node-types',
|
|
7
|
+
name: 'Orphaned Node Types',
|
|
8
|
+
description: 'NodeTypes should be used in at least one connection rule',
|
|
9
|
+
impact: 'Orphaned node types may indicate unused or misconfigured types',
|
|
10
|
+
severity: 'error',
|
|
11
|
+
category: 'structure',
|
|
12
|
+
enabled: true,
|
|
13
|
+
fixable: false,
|
|
14
|
+
async check(context) {
|
|
15
|
+
const violations = [];
|
|
16
|
+
const { configuration, configPath } = context;
|
|
17
|
+
if (!configuration.nodeTypes || Object.keys(configuration.nodeTypes).length === 0) {
|
|
18
|
+
return violations;
|
|
19
|
+
}
|
|
20
|
+
// Collect all nodeTypes referenced in allowedConnections
|
|
21
|
+
const referencedNodeTypes = new Set();
|
|
22
|
+
if (configuration.allowedConnections) {
|
|
23
|
+
for (const connection of configuration.allowedConnections) {
|
|
24
|
+
if (connection.from) {
|
|
25
|
+
referencedNodeTypes.add(connection.from);
|
|
26
|
+
}
|
|
27
|
+
if (connection.to) {
|
|
28
|
+
referencedNodeTypes.add(connection.to);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Check each nodeType
|
|
33
|
+
for (const typeId of Object.keys(configuration.nodeTypes)) {
|
|
34
|
+
if (!referencedNodeTypes.has(typeId)) {
|
|
35
|
+
violations.push({
|
|
36
|
+
ruleId: 'orphaned-node-types',
|
|
37
|
+
severity: 'error',
|
|
38
|
+
file: configPath,
|
|
39
|
+
path: `nodeTypes.${typeId}`,
|
|
40
|
+
message: `Node type "${typeId}" is not used in any connection rule`,
|
|
41
|
+
impact: 'This node type may be unused or misconfigured',
|
|
42
|
+
suggestion: `Add a connection rule using this node type, or remove it if unused`,
|
|
43
|
+
fixable: false,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return violations;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=orphaned-node-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphaned-node-types.js","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-node-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,0DAA0D;IACvE,MAAM,EAAE,gEAAgE;IACxE,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IAEd,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9C,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACrC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;oBACpB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;oBAClB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,EAAE;oBAC3B,OAAO,EAAE,cAAc,MAAM,sCAAsC;oBACnE,MAAM,EAAE,+CAA+C;oBACvD,UAAU,EAAE,oEAAoE;oBAChF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-metadata.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/required-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,gBAAgB,EAAE,SAwD9B,CAAC"}
|