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.
Files changed (56) hide show
  1. package/dist/dashboard/dist/index.html +1 -1
  2. package/dist/src/discovery/fileClassifier.d.ts.map +1 -1
  3. package/dist/src/discovery/fileClassifier.js +15 -16
  4. package/dist/src/discovery/projectDiscovery.d.ts.map +1 -1
  5. package/dist/src/discovery/projectDiscovery.js +4 -1
  6. package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -1
  7. package/dist/src/languages/java/semanticBuilder.js +69 -12
  8. package/dist/src/languages/javascript/angularDetector.d.ts.map +1 -1
  9. package/dist/src/languages/javascript/angularDetector.js +50 -17
  10. package/dist/src/languages/javascript/assertionResolver.js +6 -4
  11. package/dist/src/languages/javascript/hapiDetector.d.ts.map +1 -1
  12. package/dist/src/languages/javascript/hapiDetector.js +48 -5
  13. package/dist/src/languages/javascript/vueDetector.d.ts +2 -0
  14. package/dist/src/languages/javascript/vueDetector.d.ts.map +1 -1
  15. package/dist/src/languages/javascript/vueDetector.js +22 -0
  16. package/dist/src/languages/python/index.d.ts +1 -1
  17. package/dist/src/languages/python/index.d.ts.map +1 -1
  18. package/dist/src/languages/python/index.js +33 -3
  19. package/dist/src/pipeline/confidence.d.ts +6 -1
  20. package/dist/src/pipeline/confidence.d.ts.map +1 -1
  21. package/dist/src/pipeline/confidence.js +8 -3
  22. package/dist/src/pipeline/graph.d.ts.map +1 -1
  23. package/dist/src/pipeline/graph.js +16 -4
  24. package/dist/src/pipeline/stages/ast/astStage.d.ts.map +1 -1
  25. package/dist/src/pipeline/stages/ast/astStage.js +46 -2
  26. package/dist/src/pipeline/stages/ast/baseUrlComposer.d.ts.map +1 -1
  27. package/dist/src/pipeline/stages/ast/baseUrlComposer.js +18 -4
  28. package/dist/src/pipeline/stages/ast/crossFileResolver.js +29 -0
  29. package/dist/src/pipeline/stages/ast/graphBuilder.d.ts.map +1 -1
  30. package/dist/src/pipeline/stages/ast/graphBuilder.js +81 -0
  31. package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts +3 -1
  32. package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts.map +1 -1
  33. package/dist/src/pipeline/stages/ast/optionalAuthUnifier.js +34 -14
  34. package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.d.ts.map +1 -1
  35. package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.js +22 -3
  36. package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.d.ts.map +1 -1
  37. package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.js +104 -28
  38. package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.d.ts.map +1 -1
  39. package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.js +56 -0
  40. package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.d.ts.map +1 -1
  41. package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.js +43 -18
  42. package/dist/src/pipeline/stages/ast/rulesEnforcer.d.ts.map +1 -1
  43. package/dist/src/pipeline/stages/ast/rulesEnforcer.js +336 -45
  44. package/dist/src/pipeline/stages/merge/conflictDetector.d.ts +2 -0
  45. package/dist/src/pipeline/stages/merge/conflictDetector.d.ts.map +1 -1
  46. package/dist/src/pipeline/stages/merge/conflictDetector.js +54 -2
  47. package/dist/src/pipeline/stages/merge/coverageMappingBuilder.d.ts.map +1 -1
  48. package/dist/src/pipeline/stages/merge/coverageMappingBuilder.js +67 -3
  49. package/dist/src/pipeline/stages/tia/mockBoundaryDetector.d.ts.map +1 -1
  50. package/dist/src/pipeline/stages/tia/mockBoundaryDetector.js +8 -1
  51. package/dist/src/pipeline/stages/tia/parameterizedTestExpander.js +8 -4
  52. package/dist/src/pipeline/stages/tia/testLayerClassifier.d.ts.map +1 -1
  53. package/dist/src/pipeline/stages/tia/testLayerClassifier.js +36 -10
  54. package/dist/src/pipeline/types.d.ts +1 -1
  55. package/dist/src/pipeline/types.d.ts.map +1 -1
  56. 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
- for (const [filePath, model] of ctx.symbolTable.models) {
32
- const sourceText = getSourceText(filePath, ctx);
33
- if (!sourceText)
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
- // Detect repository interfaces
36
- const repos = detectRepositoryInterfaces(sourceText, filePath);
37
- repoInterfaces.push(...repos);
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(ifaceName).push(implName);
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;AAEpF,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;CAgEpE"}
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;CAyCpE"}
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
- // Look for Vuex store modules (files with actions that call APIs)
25
- // and link them to component dispatch calls
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
- // Check if file has functions that look like Vuex actions (call API services)
30
- let hasApiCalls = false;
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
- hasApiCalls = true;
34
- break;
30
+ actionNames.push(funcName);
35
31
  }
36
32
  }
37
- if (hasApiCalls) {
38
- vuexStoreFiles++;
33
+ if (actionNames.length > 0) {
34
+ actionFiles.set(filePath, actionNames);
39
35
  }
40
- // Check if file dispatches to store
41
- if (model.functions.size > 0) {
42
- for (const [, func] of model.functions) {
43
- if (func.calledFunctions.some((f) => f.includes('dispatch'))) {
44
- dispatchFiles++;
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 (vuexStoreFiles > 0 || dispatchFiles > 0) {
50
- diagnostics.push(`Found ${vuexStoreFiles} Vuex store file(s), ${dispatchFiles} dispatch file(s)`);
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,CAsDxB"}
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"}