api-tests-coverage 1.0.16 → 1.0.17
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/dist/dashboard/dist/index.html +1 -1
- package/dist/src/discovery/fileClassifier.d.ts.map +1 -1
- package/dist/src/discovery/fileClassifier.js +15 -16
- package/dist/src/discovery/projectDiscovery.d.ts.map +1 -1
- package/dist/src/discovery/projectDiscovery.js +4 -1
- package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -1
- package/dist/src/languages/java/semanticBuilder.js +69 -12
- package/dist/src/languages/javascript/angularDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/angularDetector.js +50 -17
- package/dist/src/languages/javascript/assertionResolver.js +6 -4
- package/dist/src/languages/javascript/hapiDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/hapiDetector.js +48 -5
- package/dist/src/languages/javascript/vueDetector.d.ts +2 -0
- package/dist/src/languages/javascript/vueDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/vueDetector.js +22 -0
- package/dist/src/languages/python/index.d.ts +1 -1
- package/dist/src/languages/python/index.d.ts.map +1 -1
- package/dist/src/languages/python/index.js +33 -3
- package/dist/src/pipeline/confidence.d.ts +6 -1
- package/dist/src/pipeline/confidence.d.ts.map +1 -1
- package/dist/src/pipeline/confidence.js +8 -3
- package/dist/src/pipeline/graph.d.ts.map +1 -1
- package/dist/src/pipeline/graph.js +16 -4
- package/dist/src/pipeline/stages/ast/astStage.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/astStage.js +46 -2
- package/dist/src/pipeline/stages/ast/baseUrlComposer.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/baseUrlComposer.js +18 -4
- package/dist/src/pipeline/stages/ast/crossFileResolver.js +29 -0
- package/dist/src/pipeline/stages/ast/graphBuilder.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/graphBuilder.js +81 -0
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts +3 -1
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.js +34 -14
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.js +22 -3
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.js +104 -28
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.js +56 -0
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.js +43 -18
- package/dist/src/pipeline/stages/ast/rulesEnforcer.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/rulesEnforcer.js +336 -45
- package/dist/src/pipeline/stages/merge/conflictDetector.d.ts +2 -0
- package/dist/src/pipeline/stages/merge/conflictDetector.d.ts.map +1 -1
- package/dist/src/pipeline/stages/merge/conflictDetector.js +54 -2
- package/dist/src/pipeline/stages/merge/coverageMappingBuilder.d.ts.map +1 -1
- package/dist/src/pipeline/stages/merge/coverageMappingBuilder.js +67 -3
- package/dist/src/pipeline/stages/tia/mockBoundaryDetector.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/mockBoundaryDetector.js +8 -1
- package/dist/src/pipeline/stages/tia/parameterizedTestExpander.js +8 -4
- package/dist/src/pipeline/stages/tia/testLayerClassifier.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/testLayerClassifier.js +36 -10
- package/dist/src/pipeline/types.d.ts +1 -1
- package/dist/src/pipeline/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -28,23 +28,80 @@ class DddLayerResolver {
|
|
|
28
28
|
const repoInterfaces = [];
|
|
29
29
|
const cqrsHandlers = [];
|
|
30
30
|
const implementations = new Map();
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
// ----- Detect from class registry and semantic models -----
|
|
32
|
+
// 1. Detect repository interfaces from class registry
|
|
33
|
+
for (const [className, classDecl] of ctx.symbolTable.classes) {
|
|
34
|
+
const isRepoByName = /(?:Repository|Repo|Store|Gateway)$/.test(className);
|
|
35
|
+
const repoMethods = classDecl.methods.filter(m => /^(?:findBy\w+|find\w+|save|saveAll|delete|deleteById|existsBy\w+|countBy\w+|getBy\w+)$/.test(m));
|
|
36
|
+
if (isRepoByName && repoMethods.length > 0) {
|
|
37
|
+
repoInterfaces.push({
|
|
38
|
+
interfaceName: className,
|
|
39
|
+
methods: repoMethods,
|
|
40
|
+
sourceFile: classDecl.filePath,
|
|
41
|
+
line: classDecl.line,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (!isRepoByName && repoMethods.length >= 2) {
|
|
45
|
+
// Generic interface with enough repository-like methods
|
|
46
|
+
repoInterfaces.push({
|
|
47
|
+
interfaceName: className,
|
|
48
|
+
methods: repoMethods,
|
|
49
|
+
sourceFile: classDecl.filePath,
|
|
50
|
+
line: classDecl.line,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// 2. Detect CQRS handlers from class registry + semantic models
|
|
55
|
+
for (const [className, classDecl] of ctx.symbolTable.classes) {
|
|
56
|
+
const model = ctx.symbolTable.models.get(classDecl.filePath);
|
|
57
|
+
if (!model)
|
|
58
|
+
continue;
|
|
59
|
+
for (const methodName of classDecl.methods) {
|
|
60
|
+
if (methodName !== 'execute' && methodName !== 'handle' && methodName !== 'apply')
|
|
61
|
+
continue;
|
|
62
|
+
// Determine handler type from class name or method context
|
|
63
|
+
let handlerType = 'command';
|
|
64
|
+
if (/Query/.test(className))
|
|
65
|
+
handlerType = 'query';
|
|
66
|
+
else if (/Event/.test(className))
|
|
67
|
+
handlerType = 'event';
|
|
68
|
+
// Try to get parameter type from the function's annotations or the class name
|
|
69
|
+
const func = model.functions.get(methodName);
|
|
70
|
+
let parameterType = `${className.replace(/Handler$/, '')}`;
|
|
71
|
+
if (func === null || func === void 0 ? void 0 : func.annotations) {
|
|
72
|
+
// Check for annotations that hint at the command/query type
|
|
73
|
+
for (const ann of func.annotations) {
|
|
74
|
+
const typeMatch = ann.match(/(\w+(?:Command|Query|Event))/);
|
|
75
|
+
if (typeMatch) {
|
|
76
|
+
parameterType = typeMatch[1];
|
|
77
|
+
if (/Command$/.test(parameterType))
|
|
78
|
+
handlerType = 'command';
|
|
79
|
+
else if (/Query$/.test(parameterType))
|
|
80
|
+
handlerType = 'query';
|
|
81
|
+
else if (/Event$/.test(parameterType))
|
|
82
|
+
handlerType = 'event';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
cqrsHandlers.push({
|
|
87
|
+
className,
|
|
88
|
+
handlerType,
|
|
89
|
+
handleMethodName: methodName,
|
|
90
|
+
parameterType,
|
|
91
|
+
sourceFile: classDecl.filePath,
|
|
92
|
+
line: classDecl.line,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 3. Detect implements clauses from class registry (already parsed by tree-sitter)
|
|
97
|
+
for (const [className, classDecl] of ctx.symbolTable.classes) {
|
|
98
|
+
if (!classDecl.implementsInterfaces || classDecl.implementsInterfaces.length === 0)
|
|
34
99
|
continue;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// Detect CQRS handlers
|
|
39
|
-
const handlers = detectCqrsHandlers(sourceText, filePath);
|
|
40
|
-
cqrsHandlers.push(...handlers);
|
|
41
|
-
// Detect implements clauses
|
|
42
|
-
const impls = detectImplementsClauses(sourceText, filePath);
|
|
43
|
-
for (const [ifaceName, implName] of impls) {
|
|
44
|
-
if (!implementations.has(ifaceName)) {
|
|
45
|
-
implementations.set(ifaceName, []);
|
|
100
|
+
for (const iface of classDecl.implementsInterfaces) {
|
|
101
|
+
if (!implementations.has(iface)) {
|
|
102
|
+
implementations.set(iface, []);
|
|
46
103
|
}
|
|
47
|
-
implementations.get(
|
|
104
|
+
implementations.get(iface).push(className);
|
|
48
105
|
}
|
|
49
106
|
}
|
|
50
107
|
// Map interface → implementation in symbolTable
|
|
@@ -72,6 +129,38 @@ class DddLayerResolver {
|
|
|
72
129
|
}
|
|
73
130
|
}
|
|
74
131
|
}
|
|
132
|
+
// Write repository interfaces into symbolTable (Section 5.3)
|
|
133
|
+
for (const repo of repoInterfaces) {
|
|
134
|
+
const key = repo.sourceFile;
|
|
135
|
+
if (!ctx.symbolTable.interfaceImplementations.has(key)) {
|
|
136
|
+
ctx.symbolTable.interfaceImplementations.set(key, []);
|
|
137
|
+
}
|
|
138
|
+
const existing = ctx.symbolTable.interfaceImplementations.get(key);
|
|
139
|
+
const alreadyMapped = existing.some(e => e.interfaceName === repo.interfaceName);
|
|
140
|
+
if (!alreadyMapped) {
|
|
141
|
+
existing.push({
|
|
142
|
+
interfaceName: repo.interfaceName,
|
|
143
|
+
interfaceFile: repo.sourceFile,
|
|
144
|
+
implName: '',
|
|
145
|
+
implFile: '',
|
|
146
|
+
});
|
|
147
|
+
entriesAdded++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Write CQRS handlers as service-layer entries into symbolTable (Section 5.2)
|
|
151
|
+
for (const handler of cqrsHandlers) {
|
|
152
|
+
const key = handler.sourceFile;
|
|
153
|
+
if (!ctx.symbolTable.interfaceImplementations.has(key)) {
|
|
154
|
+
ctx.symbolTable.interfaceImplementations.set(key, []);
|
|
155
|
+
}
|
|
156
|
+
ctx.symbolTable.interfaceImplementations.get(key).push({
|
|
157
|
+
interfaceName: handler.parameterType,
|
|
158
|
+
interfaceFile: handler.sourceFile,
|
|
159
|
+
implName: handler.className,
|
|
160
|
+
implFile: handler.sourceFile,
|
|
161
|
+
});
|
|
162
|
+
entriesAdded++;
|
|
163
|
+
}
|
|
75
164
|
if (repoInterfaces.length > 0) {
|
|
76
165
|
diagnostics.push(`Found ${repoInterfaces.length} repository interface(s)`);
|
|
77
166
|
}
|
|
@@ -211,19 +300,6 @@ function detectImplementsClauses(source, filePath) {
|
|
|
211
300
|
}
|
|
212
301
|
return impls;
|
|
213
302
|
}
|
|
214
|
-
function getSourceText(filePath, ctx) {
|
|
215
|
-
// Try to get content from models (stored as raw source in semantic model)
|
|
216
|
-
// For now, we scan from the model's functions and other extracted data
|
|
217
|
-
// to detect patterns. In practice, we use regex on the raw source.
|
|
218
|
-
// If the model has functions, we have some content available.
|
|
219
|
-
const model = ctx.symbolTable.models.get(filePath);
|
|
220
|
-
if (!model)
|
|
221
|
-
return undefined;
|
|
222
|
-
// We return a synthetic source text reconstructed from available data.
|
|
223
|
-
// In a full implementation, we'd cache the raw source from the parse stage.
|
|
224
|
-
// For now, return undefined to indicate we can't access raw source from the symbol table.
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
303
|
function findFileForClass(className, ctx) {
|
|
228
304
|
// Search through exported symbols and class registry
|
|
229
305
|
const classInfo = ctx.symbolTable.classes.get(className);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mybatisResolver.d.ts","sourceRoot":"","sources":["../../../../../../src/pipeline/stages/ast/resolvers/mybatisResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"mybatisResolver.d.ts","sourceRoot":"","sources":["../../../../../../src/pipeline/stages/ast/resolvers/mybatisResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAIpF,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,IAAI,aAAa;IAE1B,SAAS,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO;IAItD,OAAO,CAAC,GAAG,EAAE,0BAA0B,GAAG,yBAAyB;CAmFpE"}
|
|
@@ -6,8 +6,43 @@
|
|
|
6
6
|
* - @Mapper interface FQCN ↔ <mapper namespace="..."> in XML
|
|
7
7
|
* - Interface method names ↔ <select id="...">, <insert id="...">, etc.
|
|
8
8
|
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
9
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
43
|
exports.MyBatisResolver = void 0;
|
|
44
|
+
const mybatisXmlParser_1 = require("../../../../languages/java/mybatisXmlParser");
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
11
46
|
class MyBatisResolver {
|
|
12
47
|
constructor() {
|
|
13
48
|
this.name = 'mybatis';
|
|
@@ -41,6 +76,27 @@ class MyBatisResolver {
|
|
|
41
76
|
mapperInterfaces.push({ name: className, file: classInfo.filePath });
|
|
42
77
|
}
|
|
43
78
|
}
|
|
79
|
+
// Parse XML mapper files from the project
|
|
80
|
+
for (const filePath of ctx.allSourceFiles) {
|
|
81
|
+
if (!filePath.endsWith('.xml'))
|
|
82
|
+
continue;
|
|
83
|
+
try {
|
|
84
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
85
|
+
if (!(0, mybatisXmlParser_1.isMyBatisMapperXml)(content))
|
|
86
|
+
continue;
|
|
87
|
+
const parsed = (0, mybatisXmlParser_1.parseMyBatisMapper)(content, filePath);
|
|
88
|
+
if (parsed) {
|
|
89
|
+
xmlMappers.push({
|
|
90
|
+
namespace: parsed.namespace,
|
|
91
|
+
file: filePath,
|
|
92
|
+
methods: parsed.queries.map((q) => q.id),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Skip unreadable XML files
|
|
98
|
+
}
|
|
99
|
+
}
|
|
44
100
|
// Match mapper interfaces to XML files by namespace suffix
|
|
45
101
|
for (const xml of xmlMappers) {
|
|
46
102
|
const simpleName = (_b = xml.namespace.split('.').pop()) !== null && _b !== void 0 ? _b : xml.namespace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vuexActionResolver.d.ts","sourceRoot":"","sources":["../../../../../../src/pipeline/stages/ast/resolvers/vuexActionResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,SAAS,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO;IAItD,OAAO,CAAC,GAAG,EAAE,0BAA0B,GAAG,yBAAyB;
|
|
1
|
+
{"version":3,"file":"vuexActionResolver.d.ts","sourceRoot":"","sources":["../../../../../../src/pipeline/stages/ast/resolvers/vuexActionResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,SAAS,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO;IAItD,OAAO,CAAC,GAAG,EAAE,0BAA0B,GAAG,yBAAyB;CAgEpE"}
|
|
@@ -21,33 +21,58 @@ class VuexActionResolver {
|
|
|
21
21
|
let entriesAdded = 0;
|
|
22
22
|
const diagnostics = [];
|
|
23
23
|
const unresolvedRefs = [];
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
let vuexStoreFiles = 0;
|
|
27
|
-
let dispatchFiles = 0;
|
|
24
|
+
// Collect Vuex store files: files with functions that have API calls (actions)
|
|
25
|
+
const actionFiles = new Map(); // filePath → action function names
|
|
28
26
|
for (const [filePath, model] of ctx.symbolTable.models) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
for (const [, func] of model.functions) {
|
|
27
|
+
const actionNames = [];
|
|
28
|
+
for (const [funcName, func] of model.functions) {
|
|
32
29
|
if (func.bodyHttpCalls.length > 0) {
|
|
33
|
-
|
|
34
|
-
break;
|
|
30
|
+
actionNames.push(funcName);
|
|
35
31
|
}
|
|
36
32
|
}
|
|
37
|
-
if (
|
|
38
|
-
|
|
33
|
+
if (actionNames.length > 0) {
|
|
34
|
+
actionFiles.set(filePath, actionNames);
|
|
39
35
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
}
|
|
37
|
+
// Find dispatch calls and link them to actions
|
|
38
|
+
for (const [filePath, model] of ctx.symbolTable.models) {
|
|
39
|
+
for (const [funcName, func] of model.functions) {
|
|
40
|
+
for (const calledFunc of func.calledFunctions) {
|
|
41
|
+
if (!calledFunc.includes('dispatch'))
|
|
42
|
+
continue;
|
|
43
|
+
// Try to match dispatched action name to a known action function
|
|
44
|
+
// dispatch('getArticles') → match to 'getArticles' action in a store file
|
|
45
|
+
// Extract the action name from the dispatch call if possible
|
|
46
|
+
// Since we only have function names from calledFunctions, look for action names
|
|
47
|
+
// across all store files
|
|
48
|
+
for (const [storeFile, actionNames] of actionFiles) {
|
|
49
|
+
if (storeFile === filePath)
|
|
50
|
+
continue; // Don't link a file to itself
|
|
51
|
+
for (const actionName of actionNames) {
|
|
52
|
+
// Check if the current file references this action name
|
|
53
|
+
if (func.calledFunctions.some((f) => f.includes(actionName))) {
|
|
54
|
+
if (!ctx.symbolTable.injectionChains.has(filePath)) {
|
|
55
|
+
ctx.symbolTable.injectionChains.set(filePath, []);
|
|
56
|
+
}
|
|
57
|
+
ctx.symbolTable.injectionChains.get(filePath).push({
|
|
58
|
+
consumerFile: filePath,
|
|
59
|
+
consumerClass: funcName,
|
|
60
|
+
serviceClass: actionName,
|
|
61
|
+
serviceFile: storeFile,
|
|
62
|
+
injectionStyle: 'property',
|
|
63
|
+
});
|
|
64
|
+
entriesAdded++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
45
67
|
}
|
|
46
68
|
}
|
|
47
69
|
}
|
|
48
70
|
}
|
|
49
|
-
if (
|
|
50
|
-
diagnostics.push(`Found ${
|
|
71
|
+
if (actionFiles.size > 0) {
|
|
72
|
+
diagnostics.push(`Found ${actionFiles.size} Vuex store file(s) with actions`);
|
|
73
|
+
}
|
|
74
|
+
if (entriesAdded > 0) {
|
|
75
|
+
diagnostics.push(`Linked ${entriesAdded} Vuex dispatch→action chain(s)`);
|
|
51
76
|
}
|
|
52
77
|
return { entriesAdded, diagnostics, unresolvedRefs };
|
|
53
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rulesEnforcer.d.ts","sourceRoot":"","sources":["../../../../../src/pipeline/stages/ast/rulesEnforcer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,oBAAoB,EACjC,WAAW,EAAE,MAAM,GAClB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"rulesEnforcer.d.ts","sourceRoot":"","sources":["../../../../../src/pipeline/stages/ast/rulesEnforcer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,oBAAoB,EACjC,WAAW,EAAE,MAAM,GAClB,sBAAsB,CA0BxB"}
|