@nielspeter/eess-ts 0.5.1 → 0.6.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.
Files changed (91) hide show
  1. package/README.md +1 -1
  2. package/dist/builders/class-rule-builder.d.ts +6 -3
  3. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/class-rule-builder.js +6 -3
  5. package/dist/builders/class-rule-builder.js.map +1 -1
  6. package/dist/builders/function-rule-builder.d.ts +29 -7
  7. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/function-rule-builder.js +34 -8
  9. package/dist/builders/function-rule-builder.js.map +1 -1
  10. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  11. package/dist/conditions/body-analysis-function.js +19 -1
  12. package/dist/conditions/body-analysis-function.js.map +1 -1
  13. package/dist/conditions/body-analysis.d.ts +5 -2
  14. package/dist/conditions/body-analysis.d.ts.map +1 -1
  15. package/dist/conditions/body-analysis.js +9 -6
  16. package/dist/conditions/body-analysis.js.map +1 -1
  17. package/dist/conditions/call.d.ts +4 -2
  18. package/dist/conditions/call.d.ts.map +1 -1
  19. package/dist/conditions/call.js +11 -8
  20. package/dist/conditions/call.js.map +1 -1
  21. package/dist/conditions/catch-analysis.d.ts +7 -1
  22. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  23. package/dist/conditions/catch-analysis.js +26 -27
  24. package/dist/conditions/catch-analysis.js.map +1 -1
  25. package/dist/conditions/class.d.ts +5 -3
  26. package/dist/conditions/class.d.ts.map +1 -1
  27. package/dist/conditions/class.js +9 -6
  28. package/dist/conditions/class.js.map +1 -1
  29. package/dist/conditions/function.d.ts +4 -4
  30. package/dist/conditions/function.js +4 -4
  31. package/dist/core/execute-rule.js +1 -1
  32. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  33. package/dist/graphql/resolver-rule-builder.js +16 -2
  34. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  35. package/dist/helpers/body-traversal.d.ts +63 -9
  36. package/dist/helpers/body-traversal.d.ts.map +1 -1
  37. package/dist/helpers/body-traversal.js +179 -30
  38. package/dist/helpers/body-traversal.js.map +1 -1
  39. package/dist/helpers/heritage.d.ts +25 -0
  40. package/dist/helpers/heritage.d.ts.map +1 -0
  41. package/dist/helpers/heritage.js +41 -0
  42. package/dist/helpers/heritage.js.map +1 -0
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/models/arch-function.d.ts +42 -12
  48. package/dist/models/arch-function.d.ts.map +1 -1
  49. package/dist/models/arch-function.js +104 -18
  50. package/dist/models/arch-function.js.map +1 -1
  51. package/dist/predicates/class.d.ts +9 -9
  52. package/dist/predicates/class.d.ts.map +1 -1
  53. package/dist/predicates/class.js +14 -13
  54. package/dist/predicates/class.js.map +1 -1
  55. package/dist/predicates/function.d.ts +16 -4
  56. package/dist/predicates/function.d.ts.map +1 -1
  57. package/dist/predicates/function.js +56 -3
  58. package/dist/predicates/function.js.map +1 -1
  59. package/dist/predicates/type.d.ts +2 -1
  60. package/dist/predicates/type.d.ts.map +1 -1
  61. package/dist/predicates/type.js +6 -2
  62. package/dist/predicates/type.js.map +1 -1
  63. package/dist/presets/agent-guardrails.js +5 -5
  64. package/dist/presets/agent-guardrails.js.map +1 -1
  65. package/dist/rules/code-quality.d.ts +12 -1
  66. package/dist/rules/code-quality.d.ts.map +1 -1
  67. package/dist/rules/code-quality.js +106 -12
  68. package/dist/rules/code-quality.js.map +1 -1
  69. package/dist/rules/errors.d.ts +4 -2
  70. package/dist/rules/errors.d.ts.map +1 -1
  71. package/dist/rules/errors.js +18 -16
  72. package/dist/rules/errors.js.map +1 -1
  73. package/dist/rules/hygiene.d.ts +3 -1
  74. package/dist/rules/hygiene.d.ts.map +1 -1
  75. package/dist/rules/hygiene.js +3 -1
  76. package/dist/rules/hygiene.js.map +1 -1
  77. package/dist/rules/metrics.d.ts +6 -4
  78. package/dist/rules/metrics.d.ts.map +1 -1
  79. package/dist/rules/metrics.js +40 -20
  80. package/dist/rules/metrics.js.map +1 -1
  81. package/dist/rules/security.d.ts +13 -5
  82. package/dist/rules/security.d.ts.map +1 -1
  83. package/dist/rules/security.js +144 -19
  84. package/dist/rules/security.js.map +1 -1
  85. package/dist/rules/typescript.d.ts +2 -2
  86. package/dist/rules/typescript.js +2 -2
  87. package/dist/smells/duplicate-bodies.js +2 -2
  88. package/dist/smells/duplicate-bodies.js.map +1 -1
  89. package/dist/smells/sibling-files.js +2 -2
  90. package/dist/smells/sibling-files.js.map +1 -1
  91. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { Node } from 'ts-morph';
2
+ import type { CatchClause } from 'ts-morph';
2
3
  /**
3
4
  * Result of scanning a single catch clause.
4
5
  */
@@ -9,7 +10,7 @@ interface SilentCatchResult {
9
10
  message: string;
10
11
  }
11
12
  /**
12
- * Find catch clauses in the body that don't reference the caught error.
13
+ * Why a catch clause is silent, or `undefined` when it references the caught error.
13
14
  *
14
15
  * A catch clause is "silent" if:
15
16
  * 1. It has no binding at all (`catch { ... }`) — no error to reference
@@ -27,6 +28,11 @@ interface SilentCatchResult {
27
28
  * — the inner `err` usage satisfies the outer check.
28
29
  * Both are rare in practice and arguably code smells themselves.
29
30
  */
31
+ export declare function silentCatchMessage(catchClause: CatchClause): string | undefined;
32
+ /**
33
+ * Find catch clauses in the body that don't reference the caught error — see
34
+ * `silentCatchMessage` for what counts as silent.
35
+ */
30
36
  export declare function findSilentCatches(body: Node): SilentCatchResult[];
31
37
  export {};
32
38
  //# sourceMappingURL=catch-analysis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catch-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAE3C;;GAEG;AACH,UAAU,iBAAiB;IACzB,oEAAoE;IACpE,IAAI,EAAE,IAAI,CAAA;IACV,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;CAChB;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,EAAE,CAqCjE"}
1
+ {"version":3,"file":"catch-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C;;GAEG;AACH,UAAU,iBAAiB;IACzB,oEAAoE;IACpE,IAAI,EAAE,IAAI,CAAA;IACV,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;CAChB;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAkB/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,EAAE,CAOjE"}
@@ -25,7 +25,7 @@ function getBindingNames(nameNode) {
25
25
  return new Set();
26
26
  }
27
27
  /**
28
- * Find catch clauses in the body that don't reference the caught error.
28
+ * Why a catch clause is silent, or `undefined` when it references the caught error.
29
29
  *
30
30
  * A catch clause is "silent" if:
31
31
  * 1. It has no binding at all (`catch { ... }`) — no error to reference
@@ -43,35 +43,34 @@ function getBindingNames(nameNode) {
43
43
  * — the inner `err` usage satisfies the outer check.
44
44
  * Both are rare in practice and arguably code smells themselves.
45
45
  */
46
+ export function silentCatchMessage(catchClause) {
47
+ const varDecl = catchClause.getVariableDeclaration();
48
+ // catch { ... } — no binding at all, always a violation
49
+ if (!varDecl)
50
+ return 'catch block has no error binding — error is silently discarded';
51
+ // No binding names extracted (e.g., unusual pattern) — skip to avoid false positive
52
+ const bindingNames = getBindingNames(varDecl.getNameNode());
53
+ if (bindingNames.size === 0)
54
+ return undefined;
55
+ // Walk the catch block for Identifier nodes matching any binding name
56
+ const hasReference = catchClause
57
+ .getBlock()
58
+ .getDescendantsOfKind(SyntaxKind.Identifier)
59
+ .some((id) => bindingNames.has(id.getText()));
60
+ if (hasReference)
61
+ return undefined;
62
+ return `catch block binds '${varDecl.getName()}' but never references it — error is silently discarded`;
63
+ }
64
+ /**
65
+ * Find catch clauses in the body that don't reference the caught error — see
66
+ * `silentCatchMessage` for what counts as silent.
67
+ */
46
68
  export function findSilentCatches(body) {
47
69
  const results = [];
48
70
  for (const catchClause of body.getDescendantsOfKind(SyntaxKind.CatchClause)) {
49
- const varDecl = catchClause.getVariableDeclaration();
50
- if (!varDecl) {
51
- // catch { ... } — no binding at all, always a violation
52
- results.push({
53
- node: catchClause,
54
- message: 'catch block has no error binding — error is silently discarded',
55
- });
56
- continue;
57
- }
58
- // Collect the binding names to search for
59
- const bindingNames = getBindingNames(varDecl.getNameNode());
60
- // No binding names extracted (e.g., unusual pattern) — skip to avoid false positive
61
- if (bindingNames.size === 0)
62
- continue;
63
- // Walk the catch block for Identifier nodes matching any binding name
64
- const block = catchClause.getBlock();
65
- const hasReference = block
66
- .getDescendantsOfKind(SyntaxKind.Identifier)
67
- .some((id) => bindingNames.has(id.getText()));
68
- if (!hasReference) {
69
- const varName = varDecl.getName();
70
- results.push({
71
- node: catchClause,
72
- message: `catch block binds '${varName}' but never references it — error is silently discarded`,
73
- });
74
- }
71
+ const message = silentCatchMessage(catchClause);
72
+ if (message !== undefined)
73
+ results.push({ node: catchClause, message });
75
74
  }
76
75
  return results;
77
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"catch-analysis.js","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAY3C;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAc;IACrC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBACzC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yEAAyE;IACzE,OAAO,IAAI,GAAG,EAAU,CAAA;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,MAAM,OAAO,GAAwB,EAAE,CAAA;IAEvC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,sBAAsB,EAAE,CAAA;QAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,wDAAwD;YACxD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gEAAgE;aAC1E,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,0CAA0C;QAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QAE3D,oFAAoF;QACpF,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;YAAE,SAAQ;QAErC,sEAAsE;QACtE,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAA;QACpC,MAAM,YAAY,GAAG,KAAK;aACvB,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;aAC3C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACjC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB,OAAO,yDAAyD;aAChG,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"catch-analysis.js","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAa3C;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAc;IACrC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBACzC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yEAAyE;IACzE,OAAO,IAAI,GAAG,EAAU,CAAA;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAwB;IACzD,MAAM,OAAO,GAAG,WAAW,CAAC,sBAAsB,EAAE,CAAA;IAEpD,wDAAwD;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,gEAAgE,CAAA;IAErF,oFAAoF;IACpF,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAC3D,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAE7C,sEAAsE;IACtE,MAAM,YAAY,GAAG,WAAW;SAC7B,QAAQ,EAAE;SACV,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;SAC3C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/C,IAAI,YAAY;QAAE,OAAO,SAAS,CAAA;IAElC,OAAO,sBAAsB,OAAO,CAAC,OAAO,EAAE,yDAAyD,CAAA;AACzG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,MAAM,OAAO,GAAwB,EAAE,CAAA;IACvC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAC/C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -2,11 +2,13 @@ import type { ClassDeclaration } from 'ts-morph';
2
2
  import type { Condition } from '@nielspeter/eess';
3
3
  import type { TypeMatcher } from '../helpers/type-matchers.js';
4
4
  /**
5
- * Assert that classes extend the named base class.
5
+ * Assert that classes directly extend the named base class — written as its name, or through
6
+ * an aliased import, a namespace member or a mixin call.
6
7
  */
7
8
  export declare function shouldExtend(className: string): Condition<ClassDeclaration>;
8
9
  /**
9
- * Assert that classes implement the named interface.
10
+ * Assert that classes implement the named interface in their own `implements` clause — as
11
+ * written, or through an aliased import.
10
12
  */
11
13
  export declare function shouldImplement(interfaceName: string): Condition<ClassDeclaration>;
12
14
  /**
@@ -26,7 +28,7 @@ export declare function shouldNotHaveMethodMatching(regex: RegExp): Condition<Cl
26
28
  *
27
29
  * **Scope note:** This scans constructors, methods, AND set accessors.
28
30
  * The function-level counterpart (`functions(p).should().acceptParameterOfType(...)`)
29
- * does NOT scan set accessors because `collectFunctions()` excludes them.
31
+ * reads a set accessor as its own function, `Class.set x` (bug 0315).
30
32
  */
31
33
  export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<ClassDeclaration>;
32
34
  export declare function notAcceptParameterOfType(matcher: TypeMatcher): Condition<ClassDeclaration>;
@@ -1 +1 @@
1
- {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9D;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAMlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAYtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAyBvF;AAkDD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAW1F"}
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAMlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAYtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAyBvF;AAkDD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAW1F"}
@@ -1,16 +1,19 @@
1
1
  import { elementCondition } from './helpers.js';
2
2
  import { createViolation, getElementName } from '../core/violation.js';
3
+ import { extendsByName, implementsByName } from '../helpers/heritage.js';
3
4
  /**
4
- * Assert that classes extend the named base class.
5
+ * Assert that classes directly extend the named base class — written as its name, or through
6
+ * an aliased import, a namespace member or a mixin call.
5
7
  */
6
8
  export function shouldExtend(className) {
7
- return elementCondition(`extend "${className}"`, (cls) => cls.getExtends()?.getExpression().getText() === className, (cls) => `${getElementName(cls)} does not extend "${className}"`);
9
+ return elementCondition(`extend "${className}"`, (cls) => extendsByName(cls, className), (cls) => `${getElementName(cls)} does not extend "${className}"`);
8
10
  }
9
11
  /**
10
- * Assert that classes implement the named interface.
12
+ * Assert that classes implement the named interface in their own `implements` clause — as
13
+ * written, or through an aliased import.
11
14
  */
12
15
  export function shouldImplement(interfaceName) {
13
- return elementCondition(`implement "${interfaceName}"`, (cls) => cls.getImplements().some((impl) => impl.getExpression().getText() === interfaceName), (cls) => `${getElementName(cls)} does not implement "${interfaceName}"`);
16
+ return elementCondition(`implement "${interfaceName}"`, (cls) => implementsByName(cls, interfaceName), (cls) => `${getElementName(cls)} does not implement "${interfaceName}"`);
14
17
  }
15
18
  /**
16
19
  * Assert that classes have a method with the given name.
@@ -39,7 +42,7 @@ export function shouldNotHaveMethodMatching(regex) {
39
42
  *
40
43
  * **Scope note:** This scans constructors, methods, AND set accessors.
41
44
  * The function-level counterpart (`functions(p).should().acceptParameterOfType(...)`)
42
- * does NOT scan set accessors because `collectFunctions()` excludes them.
45
+ * reads a set accessor as its own function, `Class.set x` (bug 0315).
43
46
  */
44
47
  export function acceptParameterOfType(matcher) {
45
48
  return {
@@ -70,7 +73,7 @@ export function acceptParameterOfType(matcher) {
70
73
  *
71
74
  * **Scope note:** This scans constructors, methods, AND set accessors.
72
75
  * The function-level counterpart (`functions(p).should().notAcceptParameterOfType(...)`)
73
- * does NOT scan set accessors because `collectFunctions()` excludes them.
76
+ * reads a set accessor as its own function, `Class.set x` (bug 0315).
74
77
  */
75
78
  /**
76
79
  * Scan parameters of class members (constructors, methods, set accessors) for
@@ -1 +1 @@
1
- {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"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"}
@@ -34,8 +34,8 @@ export declare function haveNameMatching(pattern: RegExp): Condition<ArchFunctio
34
34
  * Reports one violation per function that has no matching parameter.
35
35
  *
36
36
  * **Scope note:** This operates on the function's own parameter list only.
37
- * Unlike the class-level counterpart, it does NOT scan set accessors
38
- * because `collectFunctions()` excludes them.
37
+ * A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
38
+ * counterpart scans the whole class at once.
39
39
  */
40
40
  export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<ArchFunction>;
41
41
  /**
@@ -46,8 +46,8 @@ export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<A
46
46
  * with actionable messages including the parameter name and type.
47
47
  *
48
48
  * **Scope note:** This operates on the function's own parameter list only.
49
- * Unlike the class-level counterpart, it does NOT scan set accessors
50
- * because `collectFunctions()` excludes them.
49
+ * A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
50
+ * counterpart scans the whole class at once.
51
51
  */
52
52
  export declare function notAcceptParameterOfType(matcher: TypeMatcher): Condition<ArchFunction>;
53
53
  /**
@@ -89,8 +89,8 @@ export function haveNameMatching(pattern) {
89
89
  * Reports one violation per function that has no matching parameter.
90
90
  *
91
91
  * **Scope note:** This operates on the function's own parameter list only.
92
- * Unlike the class-level counterpart, it does NOT scan set accessors
93
- * because `collectFunctions()` excludes them.
92
+ * A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
93
+ * counterpart scans the whole class at once.
94
94
  */
95
95
  export function acceptParameterOfType(matcher) {
96
96
  return functionCondition('accept parameter of matching type', (fn) => fn.getParameters().some((p) => matcher(p.getType())), (fn) => `${fn.getName() ?? '<anonymous>'} has no parameter with matching type`);
@@ -103,8 +103,8 @@ export function acceptParameterOfType(matcher) {
103
103
  * with actionable messages including the parameter name and type.
104
104
  *
105
105
  * **Scope note:** This operates on the function's own parameter list only.
106
- * Unlike the class-level counterpart, it does NOT scan set accessors
107
- * because `collectFunctions()` excludes them.
106
+ * A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
107
+ * counterpart scans the whole class at once.
108
108
  */
109
109
  export function notAcceptParameterOfType(matcher) {
110
110
  return {
@@ -181,7 +181,7 @@ export function applyFilters(violations, ctx) {
181
181
  // pattern that silences NOTHING (fail-closed — the finding still fires, CI is
182
182
  // still red), while this warns about a pattern that silences MULTIPLE real
183
183
  // findings and every future one on the same edges (fail-open — a green
184
- // `check()`, one stderr line). ADR-008 states the primary consumer does not
184
+ // `check()`, one stderr line). ADR-009 states the primary consumer does not
185
185
  // read warnings. Kept advisory here, matching plan 0104's own review
186
186
  // resolution — but the asymmetry is real and worth re-litigating if this
187
187
  // loophole is measured firing in practice, not settled by the precedent
@@ -1 +1 @@
1
- {"version":3,"file":"resolver-rule-builder.d.ts","sourceRoot":"","sources":["../../src/graphql/resolver-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAO9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAYvF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB,CAAC,YAAY,CAAC;IAiBrE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAlB3B;;;;;;;;;;;;;;OAcG;gBAEgB,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,WAAW,YAAA;IAKxC,6EAA6E;IAC7E,UAAU,IAAI,WAAW,GAAG,SAAS;IAIrC;;;;;;;;OAQG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;IAarC;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQrD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAMzC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAM5C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAQnE;;;;;;;OAOG;cACgB,gBAAgB,IAAI,MAAM;cAI1B,kBAAkB,IAAI,MAAM;cAI5B,iBAAiB,IAAI,MAAM;cAI3B,WAAW,IAAI,YAAY,EAAE;CAajD"}
1
+ {"version":3,"file":"resolver-rule-builder.d.ts","sourceRoot":"","sources":["../../src/graphql/resolver-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAO9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAY9D;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAYvF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB,CAAC,YAAY,CAAC;IAiBrE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAlB3B;;;;;;;;;;;;;;OAcG;gBAEgB,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,WAAW,YAAA;IAKxC,6EAA6E;IAC7E,UAAU,IAAI,WAAW,GAAG,SAAS;IAIrC;;;;;;;;OAQG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;IAarC;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQrD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAMzC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAM5C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAQnE;;;;;;;OAOG;cACgB,gBAAgB,IAAI,MAAM;cAI1B,kBAAkB,IAAI,MAAM;cAI5B,iBAAiB,IAAI,MAAM;cAI3B,WAAW,IAAI,YAAY,EAAE;CAoBjD"}
@@ -1,8 +1,17 @@
1
1
  import { stampGlobs } from '@nielspeter/eess/internal';
2
2
  import { globAnyOf } from '@nielspeter/eess';
3
- import { collectFunctions } from '../models/arch-function.js';
3
+ import { collectFunctions, functionKindOf } from '../models/arch-function.js';
4
4
  import { functionContain, functionNotContain, functionUseInsteadOf, } from '../conditions/body-analysis-function.js';
5
5
  import { GraphqlRuleBuilder } from './graphql-rule-builder.js';
6
+ /**
7
+ * The kinds of collected function `resolvers()` does not treat as a resolver. A getter written as a field
8
+ * resolver, `@Field() get fullName()`, is therefore not read.
9
+ */
10
+ const NOT_RESOLVERS = new Set([
11
+ 'constructor',
12
+ 'getter',
13
+ 'setter',
14
+ ]);
6
15
  /**
7
16
  * Predicate: filter to resolver functions for fields returning types matching the pattern.
8
17
  *
@@ -148,7 +157,12 @@ export class ResolverRuleBuilder extends GraphqlRuleBuilder {
148
157
  // sit beside the resolvers and none of the resolvers themselves — measured
149
158
  // on a real schema as 60 subjects, 0 of them resolvers. Every rule written
150
159
  // against it then passes on the wrong subjects (ADR-008).
151
- return this.sourceFiles.flatMap((sf) => collectFunctions(sf, { includeObjectLiteralFunctions: true }));
160
+ //
161
+ // A constructor or an accessor is not treated as a resolver, so a getter field resolver is not read.
162
+ // Since bug 0315 the collection returns a class's constructor and accessors beside its methods, and a
163
+ // class-based resolver's injected constructor would otherwise fail every `contain(...)` rule written
164
+ // against the resolvers.
165
+ return this.sourceFiles.flatMap((sf) => collectFunctions(sf, { includeObjectLiteralFunctions: true }).filter((fn) => !NOT_RESOLVERS.has(functionKindOf(fn))));
152
166
  }
153
167
  }
154
168
  //# sourceMappingURL=resolver-rule-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver-rule-builder.js","sourceRoot":"","sources":["../../src/graphql/resolver-rule-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver-rule-builder.js","sourceRoot":"","sources":["../../src/graphql/resolver-rule-builder.ts"],"names":[],"mappings":"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"}
@@ -46,20 +46,74 @@ interface Match {
46
46
  */
47
47
  export declare function reportedLine(node: Node, triviaPos: number | undefined): number;
48
48
  /**
49
- * Find all nodes in a subtree that match the given matcher.
49
+ * How much of a class a body search reads (bug 0307).
50
50
  *
51
- * Uses getDescendantsOfKind when the matcher specifies syntaxKinds
52
- * (efficient — only walks nodes of that kind). Falls back to
53
- * getDescendants() for matchers without syntaxKinds (expression()).
51
+ * - `'member-code'` — the code the class's members run: method, constructor and accessor bodies,
52
+ * parameter defaults — each default and computed key inside a destructured parameter included
53
+ * (bug 0309) — property initializers and static blocks.
54
+ * - `'all-code'` — that, and the code the class runs outside its members when it is defined: every
55
+ * decorator expression (on the class, its members, accessors and parameters), computed member
56
+ * names and the `extends` expression.
57
+ *
58
+ * A search for what a class must NOT contain reads all of it: there, reading more fails closed. A
59
+ * search for what it MUST contain reads member code only: there, reading less fails closed, and a decorator, a
60
+ * computed name or the `extends` expression is wiring that must not satisfy a rule like
61
+ * `classMustCall` — a DI token passed to a decorator included. The line is drawn by position: a
62
+ * call in member code still satisfies it, a DI lookup in a field initializer included.
63
+ *
64
+ * A computed key inside a destructured parameter is member code, unlike a computed member name: the
65
+ * key runs at each call, as a default does, and the member name runs once, when the class is
66
+ * defined. So a call in the key satisfies a must-contain rule, and a call in the member name does not.
67
+ *
68
+ * A rule that forbids something may still read member code only, when the other positions hold
69
+ * nothing it should report: `noMagicNumbers` does, because a number in a decorator argument such as
70
+ * `@Max(150)` is named by the decorator that takes it (bug 0306).
71
+ */
72
+ type ClassBodyReach = 'member-code' | 'all-code';
73
+ /**
74
+ * Search the code a class runs (bugs 0300, 0307), as far as `reach` says.
75
+ *
76
+ * In four passes, for baselines. A match's identity is numbered within its enclosing declaration
77
+ * (`match-identity.ts`), and a declaration is known by its name, so a getter and its setter, or a
78
+ * static and an instance member of one name, share one. What the walk read before bug 0300 comes
79
+ * first for every member, then what 0300 added, then what 0307 added, then what 0309 added, so a
80
+ * finding a baseline accepted keeps its ordinal and a new one is numbered after it however the
81
+ * members interleave:
82
+ *
83
+ * 1. every method, constructor and accessor body;
84
+ * 2. every parameter default, property initializer (which covers an arrow-function property) and
85
+ * static block;
86
+ * 3. for `'all-code'`: every parameter, member and property decorator, computed member name, class
87
+ * decorator and the `extends` expression;
88
+ * 4. under either reach, the code every destructured parameter runs at each call, at any depth
89
+ * (`bindingPatternMatches`).
90
+ *
91
+ * Overload signatures have no body, defaults or decorators, so walking every constructor is the
92
+ * same as walking the implementation. `implements` is type-only and docstrings are not code, so
93
+ * neither is read, and a `comment()` rule reads code, not documentation.
94
+ */
95
+ export declare function searchClassBody(cls: ClassDeclaration, matcher: ExpressionMatcher, reach: ClassBodyReach): MatchResult;
96
+ /**
97
+ * Matches in what a call condition searches — an argument, or a callback's body — including the
98
+ * node itself unless it is a block (bug 0323).
99
+ *
100
+ * An argument can BE the match — `use(legacy(1))` — and so can a concise callback's body, which
101
+ * `getFunctionBody` returns as the expression itself: `use(() => legacy(1))`. With
102
+ * `findMatchesInNode` alone neither was tested, under `call()` as under `expression()`. A block is
103
+ * searched below its root, as `searchFunctionBody` searches a function's own: tested itself, a
104
+ * block would match a broad pattern against the whole body.
54
105
  */
55
- export declare function findMatchesInNode(node: Node, matcher: ExpressionMatcher): Match[];
106
+ export declare function findMatchesInCode(node: Node, matcher: ExpressionMatcher): Match[];
56
107
  /**
57
- * Search all method bodies in a class for matches.
108
+ * `findMatchesInCode` over several roots, numbered so a baseline keeps its identities (bug 0323):
109
+ * every match below a root first, in order, then the roots that are matches themselves.
58
110
  *
59
- * Iterates over every method (instance and static), gets the body,
60
- * and tests each body against the matcher. Returns aggregated results.
111
+ * 0.5.1 never tested a root, so each root match is new. Numbered in place, one would take the
112
+ * ordinal of a match a baseline already accepted, and the new finding would be the one hidden —
113
+ * as `searchClassBody` numbers the code bug 0300 made it read after the code it read before. A
114
+ * trivia match was found on a root before too, so it keeps its place.
61
115
  */
62
- export declare function searchClassBody(cls: ClassDeclaration, matcher: ExpressionMatcher): MatchResult;
116
+ export declare function findMatchesInEach(roots: readonly Node[], matcher: ExpressionMatcher): Match[];
63
117
  /**
64
118
  * Search a function body for matches.
65
119
  *
@@ -1 +1 @@
1
- {"version":3,"file":"body-traversal.d.ts","sourceRoot":"","sources":["../../src/helpers/body-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAGhB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAG9D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,2CAA2C;IAC3C,KAAK,EAAE,OAAO,CAAA;IACd,qEAAqE;IACrE,aAAa,EAAE,IAAI,EAAE,CAAA;IACrB;;;;;;;OAOG;IACH,eAAe,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAA;CACxC;AAED,uEAAuE;AACvE,UAAU,KAAK;IACb,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9E;AA8BD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,KAAK,EAAE,CAYjF;AAiCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,GAAG,WAAW,CAkC9F;AAuBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,GAAG,WAAW,CA8C5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAQ5D;AAiCD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,WAAW,CA4Bb"}
1
+ {"version":3,"file":"body-traversal.d.ts","sourceRoot":"","sources":["../../src/helpers/body-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,gBAAgB,EAErB,KAAK,UAAU,EAGhB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAG9D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,2CAA2C;IAC3C,KAAK,EAAE,OAAO,CAAA;IACd,qEAAqE;IACrE,aAAa,EAAE,IAAI,EAAE,CAAA;IACrB;;;;;;;OAOG;IACH,eAAe,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAA;CACxC;AAED,uEAAuE;AACvE,UAAU,KAAK;IACb,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9E;AA4FD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,KAAK,cAAc,GAAG,aAAa,GAAG,UAAU,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,cAAc,GACpB,WAAW,CAsDb;AAiDD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,KAAK,EAAE,CAIjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,KAAK,EAAE,CAQ7F;AAuBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,GAAG,WAAW,CAqD5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAQ5D;AAkCD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,WAAW,CA4Bb"}