@skastr0/pulsar-rs-pack 0.1.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 (189) hide show
  1. package/dist/cargo-metadata.d.ts +59 -0
  2. package/dist/cargo-metadata.d.ts.map +1 -0
  3. package/dist/cargo-metadata.js +162 -0
  4. package/dist/cargo-metadata.js.map +1 -0
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +7 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lock-file.d.ts +20 -0
  10. package/dist/lock-file.d.ts.map +1 -0
  11. package/dist/lock-file.js +144 -0
  12. package/dist/lock-file.js.map +1 -0
  13. package/dist/pack.d.ts +6 -0
  14. package/dist/pack.d.ts.map +1 -0
  15. package/dist/pack.js +55 -0
  16. package/dist/pack.js.map +1 -0
  17. package/dist/project.d.ts +26 -0
  18. package/dist/project.d.ts.map +1 -0
  19. package/dist/project.js +172 -0
  20. package/dist/project.js.map +1 -0
  21. package/dist/rust-analysis-collect.d.ts +4 -0
  22. package/dist/rust-analysis-collect.d.ts.map +1 -0
  23. package/dist/rust-analysis-collect.js +84 -0
  24. package/dist/rust-analysis-collect.js.map +1 -0
  25. package/dist/rust-analysis-functions.d.ts +4 -0
  26. package/dist/rust-analysis-functions.d.ts.map +1 -0
  27. package/dist/rust-analysis-functions.js +140 -0
  28. package/dist/rust-analysis-functions.js.map +1 -0
  29. package/dist/rust-analysis-identifiers.d.ts +3 -0
  30. package/dist/rust-analysis-identifiers.d.ts.map +1 -0
  31. package/dist/rust-analysis-identifiers.js +5 -0
  32. package/dist/rust-analysis-identifiers.js.map +1 -0
  33. package/dist/rust-analysis-items.d.ts +4 -0
  34. package/dist/rust-analysis-items.d.ts.map +1 -0
  35. package/dist/rust-analysis-items.js +58 -0
  36. package/dist/rust-analysis-items.js.map +1 -0
  37. package/dist/rust-analysis-modules.d.ts +7 -0
  38. package/dist/rust-analysis-modules.d.ts.map +1 -0
  39. package/dist/rust-analysis-modules.js +52 -0
  40. package/dist/rust-analysis-modules.js.map +1 -0
  41. package/dist/rust-analysis-syntax.d.ts +12 -0
  42. package/dist/rust-analysis-syntax.d.ts.map +1 -0
  43. package/dist/rust-analysis-syntax.js +102 -0
  44. package/dist/rust-analysis-syntax.js.map +1 -0
  45. package/dist/rust-analysis-types.d.ts +109 -0
  46. package/dist/rust-analysis-types.d.ts.map +1 -0
  47. package/dist/rust-analysis-types.js +2 -0
  48. package/dist/rust-analysis-types.js.map +1 -0
  49. package/dist/rust-analysis-uses.d.ts +4 -0
  50. package/dist/rust-analysis-uses.d.ts.map +1 -0
  51. package/dist/rust-analysis-uses.js +63 -0
  52. package/dist/rust-analysis-uses.js.map +1 -0
  53. package/dist/rust-analysis.d.ts +5 -0
  54. package/dist/rust-analysis.d.ts.map +1 -0
  55. package/dist/rust-analysis.js +4 -0
  56. package/dist/rust-analysis.js.map +1 -0
  57. package/dist/signals/rs-ab-01-unused-pub.d.ts +29 -0
  58. package/dist/signals/rs-ab-01-unused-pub.d.ts.map +1 -0
  59. package/dist/signals/rs-ab-01-unused-pub.js +184 -0
  60. package/dist/signals/rs-ab-01-unused-pub.js.map +1 -0
  61. package/dist/signals/rs-ab-02-trait-object-depth.d.ts +26 -0
  62. package/dist/signals/rs-ab-02-trait-object-depth.d.ts.map +1 -0
  63. package/dist/signals/rs-ab-02-trait-object-depth.js +157 -0
  64. package/dist/signals/rs-ab-02-trait-object-depth.js.map +1 -0
  65. package/dist/signals/rs-ab-03-generic-proliferation.d.ts +28 -0
  66. package/dist/signals/rs-ab-03-generic-proliferation.d.ts.map +1 -0
  67. package/dist/signals/rs-ab-03-generic-proliferation.js +108 -0
  68. package/dist/signals/rs-ab-03-generic-proliferation.js.map +1 -0
  69. package/dist/signals/rs-ab-04-derive-density.d.ts +25 -0
  70. package/dist/signals/rs-ab-04-derive-density.d.ts.map +1 -0
  71. package/dist/signals/rs-ab-04-derive-density.js +101 -0
  72. package/dist/signals/rs-ab-04-derive-density.js.map +1 -0
  73. package/dist/signals/rs-ad-01-visibility-surface.d.ts +29 -0
  74. package/dist/signals/rs-ad-01-visibility-surface.d.ts.map +1 -0
  75. package/dist/signals/rs-ad-01-visibility-surface.js +129 -0
  76. package/dist/signals/rs-ad-01-visibility-surface.js.map +1 -0
  77. package/dist/signals/rs-ad-02-boundary-rules.d.ts +3 -0
  78. package/dist/signals/rs-ad-02-boundary-rules.d.ts.map +1 -0
  79. package/dist/signals/rs-ad-02-boundary-rules.js +26 -0
  80. package/dist/signals/rs-ad-02-boundary-rules.js.map +1 -0
  81. package/dist/signals/rs-ad-02-crate-analysis.d.ts +9 -0
  82. package/dist/signals/rs-ad-02-crate-analysis.d.ts.map +1 -0
  83. package/dist/signals/rs-ad-02-crate-analysis.js +117 -0
  84. package/dist/signals/rs-ad-02-crate-analysis.js.map +1 -0
  85. package/dist/signals/rs-ad-02-crate-boundaries.d.ts +6 -0
  86. package/dist/signals/rs-ad-02-crate-boundaries.d.ts.map +1 -0
  87. package/dist/signals/rs-ad-02-crate-boundaries.js +84 -0
  88. package/dist/signals/rs-ad-02-crate-boundaries.js.map +1 -0
  89. package/dist/signals/rs-ad-02-types.d.ts +26 -0
  90. package/dist/signals/rs-ad-02-types.d.ts.map +1 -0
  91. package/dist/signals/rs-ad-02-types.js +6 -0
  92. package/dist/signals/rs-ad-02-types.js.map +1 -0
  93. package/dist/signals/rs-ad-03-circular-crate-deps.d.ts +30 -0
  94. package/dist/signals/rs-ad-03-circular-crate-deps.d.ts.map +1 -0
  95. package/dist/signals/rs-ad-03-circular-crate-deps.js +185 -0
  96. package/dist/signals/rs-ad-03-circular-crate-deps.js.map +1 -0
  97. package/dist/signals/rs-de-01-trait-coupling.d.ts +43 -0
  98. package/dist/signals/rs-de-01-trait-coupling.d.ts.map +1 -0
  99. package/dist/signals/rs-de-01-trait-coupling.js +222 -0
  100. package/dist/signals/rs-de-01-trait-coupling.js.map +1 -0
  101. package/dist/signals/rs-de-02-dep-tree.d.ts +28 -0
  102. package/dist/signals/rs-de-02-dep-tree.d.ts.map +1 -0
  103. package/dist/signals/rs-de-02-dep-tree.js +173 -0
  104. package/dist/signals/rs-de-02-dep-tree.js.map +1 -0
  105. package/dist/signals/rs-de-03-feature-flags.d.ts +32 -0
  106. package/dist/signals/rs-de-03-feature-flags.d.ts.map +1 -0
  107. package/dist/signals/rs-de-03-feature-flags.js +139 -0
  108. package/dist/signals/rs-de-03-feature-flags.js.map +1 -0
  109. package/dist/signals/rs-de-04-fan-in-fan-out.d.ts +28 -0
  110. package/dist/signals/rs-de-04-fan-in-fan-out.d.ts.map +1 -0
  111. package/dist/signals/rs-de-04-fan-in-fan-out.js +109 -0
  112. package/dist/signals/rs-de-04-fan-in-fan-out.js.map +1 -0
  113. package/dist/signals/rs-ld-01-unsafe.d.ts +28 -0
  114. package/dist/signals/rs-ld-01-unsafe.d.ts.map +1 -0
  115. package/dist/signals/rs-ld-01-unsafe.js +116 -0
  116. package/dist/signals/rs-ld-01-unsafe.js.map +1 -0
  117. package/dist/signals/rs-ld-02-lifetimes.d.ts +30 -0
  118. package/dist/signals/rs-ld-02-lifetimes.d.ts.map +1 -0
  119. package/dist/signals/rs-ld-02-lifetimes.js +79 -0
  120. package/dist/signals/rs-ld-02-lifetimes.js.map +1 -0
  121. package/dist/signals/rs-ld-03-match-catch-all.d.ts +26 -0
  122. package/dist/signals/rs-ld-03-match-catch-all.d.ts.map +1 -0
  123. package/dist/signals/rs-ld-03-match-catch-all.js +68 -0
  124. package/dist/signals/rs-ld-03-match-catch-all.js.map +1 -0
  125. package/dist/signals/rs-ld-04-error-granularity.d.ts +25 -0
  126. package/dist/signals/rs-ld-04-error-granularity.d.ts.map +1 -0
  127. package/dist/signals/rs-ld-04-error-granularity.js +77 -0
  128. package/dist/signals/rs-ld-04-error-granularity.js.map +1 -0
  129. package/dist/signals/rs-ld-05-complexity.d.ts +26 -0
  130. package/dist/signals/rs-ld-05-complexity.d.ts.map +1 -0
  131. package/dist/signals/rs-ld-05-complexity.js +70 -0
  132. package/dist/signals/rs-ld-05-complexity.js.map +1 -0
  133. package/dist/signals/rs-ld-06-domain-terms.d.ts +29 -0
  134. package/dist/signals/rs-ld-06-domain-terms.d.ts.map +1 -0
  135. package/dist/signals/rs-ld-06-domain-terms.js +158 -0
  136. package/dist/signals/rs-ld-06-domain-terms.js.map +1 -0
  137. package/dist/signals/rs-rp-01-hotspots.d.ts +27 -0
  138. package/dist/signals/rs-rp-01-hotspots.d.ts.map +1 -0
  139. package/dist/signals/rs-rp-01-hotspots.js +110 -0
  140. package/dist/signals/rs-rp-01-hotspots.js.map +1 -0
  141. package/dist/signals/rs-rp-02-compile-time.d.ts +25 -0
  142. package/dist/signals/rs-rp-02-compile-time.d.ts.map +1 -0
  143. package/dist/signals/rs-rp-02-compile-time.js +177 -0
  144. package/dist/signals/rs-rp-02-compile-time.js.map +1 -0
  145. package/dist/signals/rs-rp-03-pr-size.d.ts +23 -0
  146. package/dist/signals/rs-rp-03-pr-size.d.ts.map +1 -0
  147. package/dist/signals/rs-rp-03-pr-size.js +160 -0
  148. package/dist/signals/rs-rp-03-pr-size.js.map +1 -0
  149. package/dist/signals/rs-sl-01-duplication.d.ts +28 -0
  150. package/dist/signals/rs-sl-01-duplication.d.ts.map +1 -0
  151. package/dist/signals/rs-sl-01-duplication.js +172 -0
  152. package/dist/signals/rs-sl-01-duplication.js.map +1 -0
  153. package/dist/signals/rs-sl-02-suppressions.d.ts +30 -0
  154. package/dist/signals/rs-sl-02-suppressions.d.ts.map +1 -0
  155. package/dist/signals/rs-sl-02-suppressions.js +176 -0
  156. package/dist/signals/rs-sl-02-suppressions.js.map +1 -0
  157. package/dist/signals/rs-sl-03-unwrap-expect.d.ts +22 -0
  158. package/dist/signals/rs-sl-03-unwrap-expect.d.ts.map +1 -0
  159. package/dist/signals/rs-sl-03-unwrap-expect.js +94 -0
  160. package/dist/signals/rs-sl-03-unwrap-expect.js.map +1 -0
  161. package/dist/signals/rs-sl-04-clone-abuse.d.ts +22 -0
  162. package/dist/signals/rs-sl-04-clone-abuse.d.ts.map +1 -0
  163. package/dist/signals/rs-sl-04-clone-abuse.js +115 -0
  164. package/dist/signals/rs-sl-04-clone-abuse.js.map +1 -0
  165. package/dist/signals/shared-globs.d.ts +4 -0
  166. package/dist/signals/shared-globs.d.ts.map +1 -0
  167. package/dist/signals/shared-globs.js +12 -0
  168. package/dist/signals/shared-globs.js.map +1 -0
  169. package/dist/signals/shared-record-guards.d.ts +4 -0
  170. package/dist/signals/shared-record-guards.d.ts.map +1 -0
  171. package/dist/signals/shared-record-guards.js +4 -0
  172. package/dist/signals/shared-record-guards.js.map +1 -0
  173. package/dist/signals/shared-rust-ast.d.ts +30 -0
  174. package/dist/signals/shared-rust-ast.d.ts.map +1 -0
  175. package/dist/signals/shared-rust-ast.js +78 -0
  176. package/dist/signals/shared-rust-ast.js.map +1 -0
  177. package/dist/signals/shared-rust-resolution.d.ts +10 -0
  178. package/dist/signals/shared-rust-resolution.d.ts.map +1 -0
  179. package/dist/signals/shared-rust-resolution.js +53 -0
  180. package/dist/signals/shared-rust-resolution.js.map +1 -0
  181. package/dist/signals/shared-threshold-score.d.ts +2 -0
  182. package/dist/signals/shared-threshold-score.d.ts.map +1 -0
  183. package/dist/signals/shared-threshold-score.js +6 -0
  184. package/dist/signals/shared-threshold-score.js.map +1 -0
  185. package/dist/syn-walker.d.ts +7 -0
  186. package/dist/syn-walker.d.ts.map +1 -0
  187. package/dist/syn-walker.js +61 -0
  188. package/dist/syn-walker.js.map +1 -0
  189. package/package.json +56 -0
@@ -0,0 +1,26 @@
1
+ import { asUnknownRecord } from "./shared-record-guards.js";
2
+ const isStringArray = (value) => Array.isArray(value) && value.every((entry) => typeof entry === "string");
3
+ export const normalizeBoundaryRules = (raw) => {
4
+ const record = asUnknownRecord(raw);
5
+ const boundaries = asUnknownRecord(record?.rust_crate_boundaries) ?? asUnknownRecord(record?.boundaries) ?? {};
6
+ return new Map(Object.entries(boundaries).flatMap(([key, value]) => {
7
+ const rule = asUnknownRecord(value);
8
+ if (rule === undefined)
9
+ return [];
10
+ return [
11
+ [
12
+ key,
13
+ {
14
+ visibility: typeof rule.visibility === "string" ? rule.visibility : "public-api",
15
+ allowedDependents: isStringArray(rule.allowed_dependents)
16
+ ? rule.allowed_dependents
17
+ : [],
18
+ publicModules: isStringArray(rule.public_modules)
19
+ ? rule.public_modules
20
+ : ["crate"],
21
+ },
22
+ ],
23
+ ];
24
+ }));
25
+ };
26
+ //# sourceMappingURL=rs-ad-02-boundary-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-boundary-rules.js","sourceRoot":"","sources":["../../src/signals/rs-ad-02-boundary-rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,MAAM,aAAa,GAAG,CAAC,KAAc,EAAkC,EAAE,CACvE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAY,EAAyC,EAAE;IAC5F,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAA;IAC9G,OAAO,IAAI,GAAG,CACZ,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;QACjC,OAAO;YACL;gBACE,GAAG;gBACH;oBACE,UAAU,EACR,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;oBACtE,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;wBACvD,CAAC,CAAC,IAAI,CAAC,kBAAkB;wBACzB,CAAC,CAAC,EAAE;oBACN,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;wBAC/C,CAAC,CAAC,IAAI,CAAC,cAAc;wBACrB,CAAC,CAAC,CAAC,OAAO,CAAC;iBACa;aACpB;SACX,CAAA;IACH,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { collectRustProjectFacts, type RustUseFact } from "../rust-analysis.js";
2
+ import type { RustManifestInfo } from "../project.js";
3
+ import type { RsAd02Config, RsAd02Violation, RustBoundaryRule } from "./rs-ad-02-types.js";
4
+ type RustProjectFacts = Awaited<ReturnType<typeof collectRustProjectFacts>>;
5
+ export declare const collectCrossCrateImports: (facts: RustProjectFacts, crateByIdentifier: ReadonlyMap<string, RustManifestInfo>, config: RsAd02Config) => ReadonlyArray<RustUseFact>;
6
+ export declare const evaluateCrateBoundaryViolations: (crossCrateImports: ReadonlyArray<RustUseFact>, manifests: ReadonlyArray<RustManifestInfo>, crateByIdentifier: ReadonlyMap<string, RustManifestInfo>, rules: ReadonlyMap<string, RustBoundaryRule>, facts: RustProjectFacts) => ReadonlyArray<RsAd02Violation>;
7
+ export declare const buildCrateIdentifierIndex: (manifests: ReadonlyArray<RustManifestInfo>) => ReadonlyMap<string, RustManifestInfo>;
8
+ export {};
9
+ //# sourceMappingURL=rs-ad-02-crate-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-crate-analysis.d.ts","sourceRoot":"","sources":["../../src/signals/rs-ad-02-crate-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAIvB,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGrD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAE5B,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA;AAE3E,eAAO,MAAM,wBAAwB,GACnC,OAAO,gBAAgB,EACvB,mBAAmB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxD,QAAQ,YAAY,KACnB,aAAa,CAAC,WAAW,CAKxB,CAAA;AAEJ,eAAO,MAAM,+BAA+B,GAC1C,mBAAmB,aAAa,CAAC,WAAW,CAAC,EAC7C,WAAW,aAAa,CAAC,gBAAgB,CAAC,EAC1C,mBAAmB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxD,OAAO,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC5C,OAAO,gBAAgB,KACtB,aAAa,CAAC,eAAe,CAK/B,CAAA;AAwGD,eAAO,MAAM,yBAAyB,GACpC,WAAW,aAAa,CAAC,gBAAgB,CAAC,KACzC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAQtC,CAAA"}
@@ -0,0 +1,117 @@
1
+ import { isExternallyVisible, } from "../rust-analysis.js";
2
+ import { resolveManifestForFile } from "../rust-analysis-modules.js";
3
+ import { isExcluded } from "./shared-globs.js";
4
+ export const collectCrossCrateImports = (facts, crateByIdentifier, config) => facts.uses.filter((useFact) => {
5
+ if (isExcluded(useFact.file, config.exclude_globs))
6
+ return false;
7
+ const root = useFact.segments[0];
8
+ return root !== undefined && crateByIdentifier.has(root);
9
+ });
10
+ export const evaluateCrateBoundaryViolations = (crossCrateImports, manifests, crateByIdentifier, rules, facts) => {
11
+ const violations = crossCrateImports.flatMap((useFact) => violationForCrossCrateImport(useFact, manifests, crateByIdentifier, rules, facts));
12
+ return violations.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
13
+ };
14
+ const violationForCrossCrateImport = (useFact, manifests, crateByIdentifier, rules, facts) => {
15
+ const targetCrate = crateByIdentifier.get(useFact.segments[0]);
16
+ if (targetCrate === undefined)
17
+ return [];
18
+ const fromCrate = resolveManifestForFile(useFact.file, manifests);
19
+ if (fromCrate === undefined)
20
+ return [];
21
+ const rule = lookupBoundaryRule(rules, targetCrate);
22
+ if (rule === undefined)
23
+ return [];
24
+ const dependentViolation = dependentRuleViolation(useFact, fromCrate, targetCrate, rule);
25
+ if (dependentViolation !== undefined)
26
+ return [dependentViolation];
27
+ const targetVisibility = resolveTargetVisibility(useFact.segments.slice(1), targetCrate.packageName ?? targetCrate.name, facts.modulesByPath, facts.itemsByModuleAndName);
28
+ const visibilityViolation = visibilityRuleViolation(useFact, fromCrate, targetCrate, targetVisibility);
29
+ if (visibilityViolation !== undefined)
30
+ return [visibilityViolation];
31
+ const moduleViolation = publicModuleRuleViolation(useFact, fromCrate, targetCrate, rule, targetVisibility);
32
+ return moduleViolation === undefined ? [] : [moduleViolation];
33
+ };
34
+ const dependentRuleViolation = (useFact, fromCrate, targetCrate, rule) => {
35
+ const dependentIdentifiers = crateIdentifiers(fromCrate);
36
+ if (rule.allowedDependents.length === 0 ||
37
+ rule.allowedDependents.some((allowed) => dependentIdentifiers.has(allowed))) {
38
+ return undefined;
39
+ }
40
+ return baseViolation(useFact, fromCrate, targetCrate, {
41
+ kind: "dependent-not-allowed",
42
+ detail: `Crate ${fromCrate.packageName ?? fromCrate.name} is not listed in allowed_dependents for ${targetCrate.packageName ?? targetCrate.name}`,
43
+ });
44
+ };
45
+ const visibilityRuleViolation = (useFact, fromCrate, targetCrate, targetVisibility) => {
46
+ if (targetVisibility === undefined || isExternallyVisible(targetVisibility.visibility)) {
47
+ return undefined;
48
+ }
49
+ return baseViolation(useFact, fromCrate, targetCrate, {
50
+ kind: "non-public-target",
51
+ detail: `${useFact.path} resolves to a ${targetVisibility.kind} with visibility ${targetVisibility.visibility.kind}`,
52
+ });
53
+ };
54
+ const publicModuleRuleViolation = (useFact, fromCrate, targetCrate, rule, targetVisibility) => {
55
+ const importedModule = importedModulePath(useFact.segments.slice(1), targetVisibility?.kind === "module");
56
+ const isAllowedModule = rule.publicModules.some((prefix) => prefix === "crate"
57
+ ? importedModule === "crate"
58
+ : importedModule === prefix || importedModule.startsWith(`${prefix}::`));
59
+ return isAllowedModule
60
+ ? undefined
61
+ : baseViolation(useFact, fromCrate, targetCrate, {
62
+ kind: "boundary-rule",
63
+ detail: `${useFact.path} bypasses declared public modules (${rule.publicModules.join(", ")})`,
64
+ });
65
+ };
66
+ const baseViolation = (useFact, fromCrate, targetCrate, violation) => ({
67
+ file: useFact.file,
68
+ line: useFact.line,
69
+ fromCrate: fromCrate.packageName ?? fromCrate.name,
70
+ toCrate: targetCrate.packageName ?? targetCrate.name,
71
+ importPath: useFact.path,
72
+ ...violation,
73
+ });
74
+ const crateIdentifiers = (manifest) => new Set([manifest.name, manifest.packageName].filter((value) => value !== undefined));
75
+ export const buildCrateIdentifierIndex = (manifests) => {
76
+ const index = new Map();
77
+ for (const manifest of manifests) {
78
+ for (const identifier of crateIdentifiers(manifest)) {
79
+ index.set(identifier, manifest);
80
+ }
81
+ }
82
+ return index;
83
+ };
84
+ const lookupBoundaryRule = (rules, manifest) => rules.get(manifest.packageName ?? "") ?? rules.get(manifest.name);
85
+ const importedModulePath = (segments, importingModule) => {
86
+ if (segments.length === 0)
87
+ return "crate";
88
+ if (importingModule) {
89
+ return `crate::${segments.join("::")}`;
90
+ }
91
+ if (segments.length === 1)
92
+ return "crate";
93
+ return `crate::${segments.slice(0, -1).join("::")}`;
94
+ };
95
+ const resolveTargetVisibility = (afterCrateSegments, crateName, modulesByPath, itemsByModuleAndName) => {
96
+ if (afterCrateSegments.length === 0) {
97
+ return { kind: "module", visibility: { kind: "pub" } };
98
+ }
99
+ const moduleCandidate = `${crateName}::crate::${afterCrateSegments.join("::")}`;
100
+ const module = modulesByPath.get(moduleCandidate);
101
+ if (module !== undefined) {
102
+ return { kind: "module", visibility: module.visibility };
103
+ }
104
+ const itemModulePath = afterCrateSegments.length === 1
105
+ ? `${crateName}::crate`
106
+ : `${crateName}::crate::${afterCrateSegments.slice(0, -1).join("::")}`;
107
+ const itemModule = modulesByPath.get(itemModulePath);
108
+ if (itemModule !== undefined && !isExternallyVisible(itemModule.visibility)) {
109
+ return { kind: "module", visibility: itemModule.visibility };
110
+ }
111
+ const item = itemsByModuleAndName.get(`${itemModulePath}::${afterCrateSegments[afterCrateSegments.length - 1]}`);
112
+ if (item !== undefined) {
113
+ return { kind: "item", visibility: item.visibility };
114
+ }
115
+ return undefined;
116
+ };
117
+ //# sourceMappingURL=rs-ad-02-crate-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-crate-analysis.js","sourceRoot":"","sources":["../../src/signals/rs-ad-02-crate-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type Signal } from "@skastr0/pulsar-core/signal";
2
+ import { ReferenceDataTag } from "@skastr0/pulsar-core/reference-data";
3
+ import { RustProjectTag } from "../project.js";
4
+ import { type RsAd02Config as RsAd02ConfigType, type RsAd02Output } from "./rs-ad-02-types.js";
5
+ export declare const RsAd02: Signal<RsAd02ConfigType, RsAd02Output, RustProjectTag | ReferenceDataTag>;
6
+ //# sourceMappingURL=rs-ad-02-crate-boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-crate-boundaries.d.ts","sourceRoot":"","sources":["../../src/signals/rs-ad-02-crate-boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAEL,gBAAgB,EACjB,MAAM,qCAAqC,CAAA;AAW5C,OAAO,EAEL,cAAc,EACf,MAAM,eAAe,CAAA;AAOtB,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAA;AAE5B,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,YAAY,EAAE,cAAc,GAAG,gBAAgB,CAgD5F,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { SignalComputeError, } from "@skastr0/pulsar-core/signal";
2
+ import { ReferenceDataTag, } from "@skastr0/pulsar-core/reference-data";
3
+ import { Option, Effect, } from "effect";
4
+ import { computeDiagnosticHash, } from "@skastr0/pulsar-core/reference-data";
5
+ import { collectRustProjectFacts, } from "../rust-analysis.js";
6
+ import { RustProjectTag, } from "../project.js";
7
+ import { normalizeBoundaryRules } from "./rs-ad-02-boundary-rules.js";
8
+ import { buildCrateIdentifierIndex, collectCrossCrateImports, evaluateCrateBoundaryViolations, } from "./rs-ad-02-crate-analysis.js";
9
+ import { RsAd02Config, } from "./rs-ad-02-types.js";
10
+ export const RsAd02 = {
11
+ id: "RS-AD-02-crate-boundaries",
12
+ title: "Crate boundary violations",
13
+ aliases: ["RS-AD-02"],
14
+ tier: 2,
15
+ category: "architectural-drift",
16
+ kind: "structural",
17
+ configSchema: RsAd02Config,
18
+ defaultConfig: {
19
+ exclude_globs: ["**/target/**", "**/tests/**", "**/examples/**", "**/benches/**"],
20
+ top_n_diagnostics: 10,
21
+ },
22
+ inputs: [],
23
+ compute: (config) => Effect.gen(function* () {
24
+ const project = yield* RustProjectTag;
25
+ const referenceData = yield* ReferenceDataTag;
26
+ return yield* Effect.tryPromise({
27
+ try: () => computeRsAd02Output(project, referenceData, config),
28
+ catch: (cause) => new SignalComputeError({ signalId: "RS-AD-02-crate-boundaries", message: String(cause), cause }),
29
+ });
30
+ }),
31
+ score: (out) => {
32
+ if (out.checkedImports === 0)
33
+ return 1;
34
+ return Math.max(0, 1 - (out.violations.length / out.checkedImports) * 2);
35
+ },
36
+ diagnose: (out) => {
37
+ if (out.referenceDataStatus === "missing") {
38
+ return [
39
+ {
40
+ severity: "warn",
41
+ message: "RS-AD-02 requires schema-conventions reference data; no Rust boundary rules were loaded",
42
+ },
43
+ ];
44
+ }
45
+ return out.violations.slice(0, 10).map((violation) => ({
46
+ severity: "block",
47
+ message: `Crate boundary violation: ${violation.importPath} (${violation.detail})`,
48
+ location: { file: violation.file, line: violation.line },
49
+ data: {
50
+ hash: hashViolation(violation),
51
+ ...violation,
52
+ },
53
+ }));
54
+ },
55
+ };
56
+ const computeRsAd02Output = async (project, referenceData, config) => {
57
+ if (project.sourceFiles.length === 0)
58
+ return missingReferenceDataOutput(0);
59
+ const facts = await collectRustProjectFacts(project);
60
+ const crateByIdentifier = buildCrateIdentifierIndex(project.manifests);
61
+ const crossCrateImports = collectCrossCrateImports(facts, crateByIdentifier, config);
62
+ const rawConventions = await Effect.runPromise(referenceData.get("schema-conventions"));
63
+ if (Option.isNone(rawConventions))
64
+ return missingReferenceDataOutput(crossCrateImports.length);
65
+ const rules = normalizeBoundaryRules(rawConventions.value);
66
+ return {
67
+ checkedImports: crossCrateImports.length,
68
+ violations: evaluateCrateBoundaryViolations(crossCrateImports, project.manifests, crateByIdentifier, rules, facts),
69
+ referenceDataStatus: "loaded",
70
+ };
71
+ };
72
+ const missingReferenceDataOutput = (checkedImports) => ({
73
+ checkedImports,
74
+ violations: [],
75
+ referenceDataStatus: "missing",
76
+ });
77
+ const hashViolation = (violation) => computeDiagnosticHash([
78
+ violation.fromCrate,
79
+ violation.toCrate,
80
+ violation.file,
81
+ violation.importPath,
82
+ violation.kind,
83
+ ].join("|"));
84
+ //# sourceMappingURL=rs-ad-02-crate-boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-crate-boundaries.js","sourceRoot":"","sources":["../../src/signals/rs-ad-02-crate-boundaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Schema } from "effect";
2
+ export declare const RsAd02Config: Schema.Struct<{
3
+ exclude_globs: Schema.Array$<typeof Schema.String>;
4
+ top_n_diagnostics: typeof Schema.Number;
5
+ }>;
6
+ export type RsAd02Config = typeof RsAd02Config.Type;
7
+ export interface RustBoundaryRule {
8
+ readonly visibility: string;
9
+ readonly allowedDependents: ReadonlyArray<string>;
10
+ readonly publicModules: ReadonlyArray<string>;
11
+ }
12
+ export interface RsAd02Violation {
13
+ readonly file: string;
14
+ readonly line: number;
15
+ readonly fromCrate: string;
16
+ readonly toCrate: string;
17
+ readonly importPath: string;
18
+ readonly kind: "dependent-not-allowed" | "non-public-target" | "boundary-rule";
19
+ readonly detail: string;
20
+ }
21
+ export interface RsAd02Output {
22
+ readonly checkedImports: number;
23
+ readonly violations: ReadonlyArray<RsAd02Violation>;
24
+ readonly referenceDataStatus: "loaded" | "missing";
25
+ }
26
+ //# sourceMappingURL=rs-ad-02-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-types.d.ts","sourceRoot":"","sources":["../../src/signals/rs-ad-02-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACjD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB,GAAG,eAAe,CAAA;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IACnD,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,GAAG,SAAS,CAAA;CACnD"}
@@ -0,0 +1,6 @@
1
+ import { Schema } from "effect";
2
+ export const RsAd02Config = Schema.Struct({
3
+ exclude_globs: Schema.Array(Schema.String),
4
+ top_n_diagnostics: Schema.Number,
5
+ });
6
+ //# sourceMappingURL=rs-ad-02-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-02-types.js","sourceRoot":"","sources":["../../src/signals/rs-ad-02-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM;CACjC,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { type Signal } from "@skastr0/pulsar-core/signal";
2
+ import { Schema } from "effect";
3
+ import { RustProjectTag } from "../project.js";
4
+ declare const RsAd03Config: Schema.Struct<{
5
+ top_n_diagnostics: typeof Schema.Number;
6
+ }>;
7
+ type RsAd03Config = typeof RsAd03Config.Type;
8
+ interface CrateEdge {
9
+ readonly from: string;
10
+ readonly to: string;
11
+ readonly kind: string;
12
+ readonly optional: boolean;
13
+ readonly featureDriven: boolean;
14
+ }
15
+ interface CrateCycle {
16
+ readonly crates: ReadonlyArray<string>;
17
+ readonly edges: ReadonlyArray<CrateEdge>;
18
+ readonly architecturalSpan: string;
19
+ readonly featureInduced: boolean;
20
+ readonly manifestPaths: ReadonlyArray<string>;
21
+ }
22
+ interface RsAd03Output {
23
+ readonly cycles: ReadonlyArray<CrateCycle>;
24
+ readonly cycleCount: number;
25
+ readonly largestCycleSize: number;
26
+ readonly metadataStatus: "loaded" | "missing";
27
+ }
28
+ export declare const RsAd03: Signal<RsAd03Config, RsAd03Output, RustProjectTag>;
29
+ export {};
30
+ //# sourceMappingURL=rs-ad-03-circular-crate-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-03-circular-crate-deps.d.ts","sourceRoot":"","sources":["../../src/signals/rs-ad-03-circular-crate-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEZ,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAKvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,QAAA,MAAM,YAAY;;EAEhB,CAAA;AACF,KAAK,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAE5C,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;CAChC;AAED,UAAU,UAAU;IAClB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC9C;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAwFrE,CAAA"}
@@ -0,0 +1,185 @@
1
+ import { SignalComputeError, } from "@skastr0/pulsar-core/signal";
2
+ import { computeDiagnosticHash } from "@skastr0/pulsar-core/reference-data";
3
+ import { Effect, Schema } from "effect";
4
+ import { workspacePackages, } from "../cargo-metadata.js";
5
+ import { RustProjectTag } from "../project.js";
6
+ const RsAd03Config = Schema.Struct({
7
+ top_n_diagnostics: Schema.Number,
8
+ });
9
+ export const RsAd03 = {
10
+ id: "RS-AD-03-circular-crate-dependencies",
11
+ title: "Circular crate dependencies",
12
+ aliases: ["RS-AD-03"],
13
+ tier: 1,
14
+ category: "architectural-drift",
15
+ kind: "structural",
16
+ configSchema: RsAd03Config,
17
+ defaultConfig: {
18
+ top_n_diagnostics: 10,
19
+ },
20
+ inputs: [],
21
+ compute: () => Effect.gen(function* () {
22
+ const project = yield* RustProjectTag;
23
+ return yield* Effect.try({
24
+ try: () => {
25
+ const metadata = project.cargoMetadata;
26
+ if (metadata === undefined) {
27
+ return {
28
+ cycles: [],
29
+ cycleCount: 0,
30
+ largestCycleSize: 0,
31
+ metadataStatus: "missing",
32
+ };
33
+ }
34
+ const packages = workspacePackages(metadata);
35
+ const packageByName = new Map(packages.map((pkg) => [pkg.name, pkg]));
36
+ const graph = new Map();
37
+ for (const pkg of packages) {
38
+ const edges = [];
39
+ for (const dep of pkg.dependencies) {
40
+ const target = packageByName.get(dep.name);
41
+ if (target === undefined)
42
+ continue;
43
+ edges.push({
44
+ from: pkg.name,
45
+ to: target.name,
46
+ kind: dep.kind ?? "normal",
47
+ optional: dep.optional,
48
+ featureDriven: dep.optional || dep.features.length > 0,
49
+ });
50
+ }
51
+ graph.set(pkg.name, edges);
52
+ }
53
+ const sccs = tarjan(graph);
54
+ const cycles = sccs
55
+ .filter((scc) => scc.length > 1 || hasSelfLoop(scc[0], graph))
56
+ .map((scc) => toCycle(scc, graph, packageByName))
57
+ .sort((a, b) => b.crates.length - a.crates.length || a.architecturalSpan.localeCompare(b.architecturalSpan));
58
+ return {
59
+ cycles,
60
+ cycleCount: cycles.length,
61
+ largestCycleSize: cycles.reduce((max, cycle) => Math.max(max, cycle.crates.length), 0),
62
+ metadataStatus: "loaded",
63
+ };
64
+ },
65
+ catch: (cause) => new SignalComputeError({ signalId: "RS-AD-03-circular-crate-dependencies", message: String(cause), cause }),
66
+ });
67
+ }),
68
+ score: (out) => {
69
+ if (out.cycleCount === 0)
70
+ return 1;
71
+ const countPenalty = Math.min(1, out.cycleCount * 0.15);
72
+ const sizePenalty = Math.min(0.5, Math.max(0, out.largestCycleSize - 2) * 0.1);
73
+ return Math.max(0, 1 - countPenalty - sizePenalty);
74
+ },
75
+ diagnose: (out) => {
76
+ if (out.metadataStatus === "missing") {
77
+ return [{ severity: "warn", message: "RS-AD-03 could not load cargo metadata for this repo" }];
78
+ }
79
+ return out.cycles.slice(0, 10).map((cycle) => ({
80
+ severity: "block",
81
+ message: `Circular crate dependency (${cycle.crates.length} crates): ${cycle.architecturalSpan}`,
82
+ location: { file: cycle.manifestPaths[0] ?? "Cargo.toml" },
83
+ data: {
84
+ hash: computeDiagnosticHash(cycle.architecturalSpan),
85
+ crates: [...cycle.crates],
86
+ edges: cycle.edges.map((edge) => ({ ...edge })),
87
+ architecturalSpan: cycle.architecturalSpan,
88
+ featureInduced: cycle.featureInduced,
89
+ manifestPaths: [...cycle.manifestPaths],
90
+ },
91
+ }));
92
+ },
93
+ };
94
+ const hasSelfLoop = (node, graph) => (node === undefined ? false : (graph.get(node) ?? []).some((edge) => edge.to === node));
95
+ const toCycle = (scc, graph, packageByName) => {
96
+ const cycleSet = new Set(scc);
97
+ const edges = scc.flatMap((from) => (graph.get(from) ?? []).filter((edge) => cycleSet.has(edge.to)));
98
+ const ordered = [...scc].sort();
99
+ const architecturalSpan = `${ordered.join("→")}→${ordered[0] ?? ""}`;
100
+ return {
101
+ crates: ordered,
102
+ edges,
103
+ architecturalSpan,
104
+ featureInduced: edges.some((edge) => edge.featureDriven || edge.optional || edge.kind !== "normal"),
105
+ manifestPaths: ordered.flatMap((crate) => {
106
+ const manifestPath = packageByName.get(crate)?.manifestPath;
107
+ return manifestPath === undefined ? [] : [manifestPath];
108
+ }),
109
+ };
110
+ };
111
+ const tarjan = (graph) => {
112
+ let index = 0;
113
+ const indices = new Map();
114
+ const lowlinks = new Map();
115
+ const onStack = new Set();
116
+ const stack = [];
117
+ const sccs = [];
118
+ const visit = (start) => {
119
+ const frames = [];
120
+ const enter = (node) => {
121
+ indices.set(node, index);
122
+ lowlinks.set(node, index);
123
+ index += 1;
124
+ stack.push(node);
125
+ onStack.add(node);
126
+ frames.push({
127
+ node,
128
+ neighbors: (graph.get(node) ?? []).map((edge) => edge.to),
129
+ cursor: 0,
130
+ });
131
+ };
132
+ const popComponent = (root) => {
133
+ const scc = [];
134
+ while (true) {
135
+ const value = stack.pop();
136
+ if (value === undefined)
137
+ break;
138
+ onStack.delete(value);
139
+ scc.push(value);
140
+ if (value === root)
141
+ break;
142
+ }
143
+ return scc;
144
+ };
145
+ const propagateLowlinkToParent = (frame) => {
146
+ const parent = frames[frames.length - 1];
147
+ if (parent === undefined)
148
+ return;
149
+ lowlinks.set(parent.node, Math.min(lowlinks.get(parent.node) ?? 0, lowlinks.get(frame.node) ?? 0));
150
+ };
151
+ const finishFrame = (frame) => {
152
+ if (lowlinks.get(frame.node) === indices.get(frame.node)) {
153
+ sccs.push(popComponent(frame.node));
154
+ }
155
+ frames.pop();
156
+ propagateLowlinkToParent(frame);
157
+ };
158
+ const visitNeighbor = (frame) => {
159
+ const neighbor = frame.neighbors[frame.cursor];
160
+ frame.cursor += 1;
161
+ if (!indices.has(neighbor)) {
162
+ enter(neighbor);
163
+ return;
164
+ }
165
+ if (!onStack.has(neighbor))
166
+ return;
167
+ lowlinks.set(frame.node, Math.min(lowlinks.get(frame.node) ?? 0, indices.get(neighbor) ?? 0));
168
+ };
169
+ enter(start);
170
+ while (frames.length > 0) {
171
+ const frame = frames[frames.length - 1];
172
+ if (frame.cursor >= frame.neighbors.length) {
173
+ finishFrame(frame);
174
+ continue;
175
+ }
176
+ visitNeighbor(frame);
177
+ }
178
+ };
179
+ for (const node of graph.keys()) {
180
+ if (!indices.has(node))
181
+ visit(node);
182
+ }
183
+ return sccs;
184
+ };
185
+ //# sourceMappingURL=rs-ad-03-circular-crate-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-ad-03-circular-crate-deps.js","sourceRoot":"","sources":["../../src/signals/rs-ad-03-circular-crate-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAEL,iBAAiB,GAClB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC,MAAM;CACjC,CAAC,CAAA;AA0BF,MAAM,CAAC,MAAM,MAAM,GAAuD;IACxE,EAAE,EAAE,sCAAsC;IAC1C,KAAK,EAAE,6BAA6B;IACpC,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,qBAAqB;IAC/B,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,YAAY;IAC1B,aAAa,EAAE;QACb,iBAAiB,EAAE,EAAE;KACtB;IACD,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,GAAG,EAAE,CACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;QACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACvB,GAAG,EAAE,GAAiB,EAAE;gBACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAA;gBACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO;wBACL,MAAM,EAAE,EAAE;wBACV,UAAU,EAAE,CAAC;wBACb,gBAAgB,EAAE,CAAC;wBACnB,cAAc,EAAE,SAAS;qBAC1B,CAAA;gBACH,CAAC;gBAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;gBAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC,CAAC,CAAA;gBAC9E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAA;gBAEjD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAqB,EAAE,CAAA;oBAClC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;wBACnC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;wBAC1C,IAAI,MAAM,KAAK,SAAS;4BAAE,SAAQ;wBAClC,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,EAAE,EAAE,MAAM,CAAC,IAAI;4BACf,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;4BAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,aAAa,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;yBACvD,CAAC,CAAA;oBACJ,CAAC;oBACD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;gBAC5B,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC1B,MAAM,MAAM,GAAG,IAAI;qBAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;qBAC7D,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;qBAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;gBAE9G,OAAO;oBACL,MAAM;oBACN,UAAU,EAAE,MAAM,CAAC,MAAM;oBACzB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACtF,cAAc,EAAE,QAAQ;iBACzB,CAAA;YACH,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC,EAAE,QAAQ,EAAE,sCAAsC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;SAC9G,CAAC,CAAA;IACJ,CAAC,CAAC;IACJ,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACb,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;QAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,WAAW,CAAC,CAAA;IACpD,CAAC;IACD,QAAQ,EAAE,CAAC,GAAG,EAA6B,EAAE;QAC3C,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC,CAAA;QAChG,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7C,QAAQ,EAAE,OAAgB;YAC1B,OAAO,EAAE,8BAA8B,KAAK,CAAC,MAAM,CAAC,MAAM,aAAa,KAAK,CAAC,iBAAiB,EAAE;YAChG,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE;YAC1D,IAAI,EAAE;gBACJ,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,iBAAiB,CAAC;gBACpD,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;gBACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC/C,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,aAAa,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;aACxC;SACF,CAAC,CAAC,CAAA;IACL,CAAC;CACF,CAAA;AAED,MAAM,WAAW,GAAG,CAClB,IAAwB,EACxB,KAAoD,EAC3C,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;AAErG,MAAM,OAAO,GAAG,CACd,GAA0B,EAC1B,KAAoD,EACpD,aAAwD,EAC5C,EAAE;IACd,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAChE,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/B,MAAM,iBAAiB,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;IACpE,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK;QACL,iBAAiB;QACjB,cAAc,EAAE,KAAK,CAAC,IAAI,CACxB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CACxE;QACD,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;YAC3D,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACzD,CAAC,CAAC;KACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CACb,KAAoD,EAC9B,EAAE;IAGxB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAyB,EAAE,CAAA;IAErC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAQ,EAAE;QACpC,MAAM,MAAM,GAAiB,EAAE,CAAA;QAE/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACxB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACzB,KAAK,IAAI,CAAC,CAAA;YACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,EAAE,CAAC;aACV,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,MAAM,YAAY,GAAG,CAAC,IAAY,EAAiB,EAAE;YACnD,MAAM,GAAG,GAAkB,EAAE,CAAA;YAC7B,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;gBACzB,IAAI,KAAK,KAAK,SAAS;oBAAE,MAAK;gBAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACf,IAAI,KAAK,KAAK,IAAI;oBAAE,MAAK;YAC3B,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,CAAA;QAED,MAAM,wBAAwB,GAAG,CAAC,KAAY,EAAQ,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACxC,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAM;YAChC,QAAQ,CAAC,GAAG,CACV,MAAM,CAAC,IAAI,EACX,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxE,CAAA;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,KAAY,EAAQ,EAAE;YACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACrC,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAA;YACZ,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC,CAAA;QAED,MAAM,aAAa,GAAG,CAAC,KAAY,EAAQ,EAAE;YAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAE,CAAA;YAC/C,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;YACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACf,OAAM;YACR,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAM;YAClC,QAAQ,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,EACV,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACpE,CAAA;QACH,CAAC,CAAA;QAED,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;YACxC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC3C,WAAW,CAAC,KAAK,CAAC,CAAA;gBAClB,SAAQ;YACV,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -0,0 +1,43 @@
1
+ import { type Signal } from "@skastr0/pulsar-core/signal";
2
+ import { Schema } from "effect";
3
+ import { RustProjectTag } from "../project.js";
4
+ declare const RsDe01Config: Schema.Struct<{
5
+ exclude_globs: Schema.Array$<typeof Schema.String>;
6
+ top_n_diagnostics: typeof Schema.Number;
7
+ }>;
8
+ type RsDe01Config = typeof RsDe01Config.Type;
9
+ interface TraitCouplingDetail {
10
+ readonly trait: string;
11
+ readonly type: string;
12
+ readonly file: string;
13
+ readonly line: number;
14
+ readonly traitLocal: boolean;
15
+ readonly typeLocal: boolean;
16
+ readonly orphanWorkaroundCandidate: boolean;
17
+ readonly family: TraitCouplingFamily;
18
+ readonly concerning: boolean;
19
+ }
20
+ type TraitCouplingFamily = "standard-library-ergonomic" | "serialization" | "framework-adapter" | "application-external";
21
+ interface TraitCouplingModuleSummary {
22
+ readonly module: string;
23
+ readonly file: string;
24
+ readonly foreignTraitImpls: number;
25
+ readonly concerningForeignTraitImpls: number;
26
+ readonly ordinaryForeignTraitImpls: number;
27
+ readonly details: ReadonlyArray<TraitCouplingDetail>;
28
+ }
29
+ interface RsDe01Output {
30
+ readonly byModule: ReadonlyMap<string, {
31
+ readonly foreignTraitImpls: number;
32
+ readonly concerningForeignTraitImpls: number;
33
+ readonly ordinaryForeignTraitImpls: number;
34
+ readonly details: ReadonlyArray<TraitCouplingDetail>;
35
+ }>;
36
+ readonly modules: ReadonlyArray<TraitCouplingModuleSummary>;
37
+ readonly totalForeignTraitImpls: number;
38
+ readonly totalConcerningForeignTraitImpls: number;
39
+ readonly analysisMode: "syntax-and-local-name-resolution";
40
+ }
41
+ export declare const RsDe01: Signal<RsDe01Config, RsDe01Output, RustProjectTag>;
42
+ export {};
43
+ //# sourceMappingURL=rs-de-01-trait-coupling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rs-de-01-trait-coupling.d.ts","sourceRoot":"","sources":["../../src/signals/rs-de-01-trait-coupling.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAY9C,QAAA,MAAM,YAAY;;;EAGhB,CAAA;AACF,KAAK,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAE5C,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED,KAAK,mBAAmB,GACpB,4BAA4B,GAC5B,eAAe,GACf,mBAAmB,GACnB,sBAAsB,CAAA;AAE1B,UAAU,0BAA0B;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAA;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;CACrD;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAC5B,MAAM,EACN;QACE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;QAClC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAA;QAC5C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAA;QAC1C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;KACrD,CACF,CAAA;IACD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,0BAA0B,CAAC,CAAA;IAC3D,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,kCAAkC,CAAA;CAC1D;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAiKrE,CAAA"}