@ryanstark24/sfgraph-core 1.1.6 → 1.2.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 (195) hide show
  1. package/dist/analyze/__tests__/find-nodes.test.d.ts +2 -0
  2. package/dist/analyze/__tests__/find-nodes.test.d.ts.map +1 -0
  3. package/dist/analyze/__tests__/find-nodes.test.js +129 -0
  4. package/dist/analyze/__tests__/find-nodes.test.js.map +1 -0
  5. package/dist/analyze/__tests__/findings.test.d.ts +2 -0
  6. package/dist/analyze/__tests__/findings.test.d.ts.map +1 -0
  7. package/dist/analyze/__tests__/findings.test.js +90 -0
  8. package/dist/analyze/__tests__/findings.test.js.map +1 -0
  9. package/dist/analyze/find-nodes.d.ts +38 -0
  10. package/dist/analyze/find-nodes.d.ts.map +1 -0
  11. package/dist/analyze/find-nodes.js +51 -0
  12. package/dist/analyze/find-nodes.js.map +1 -0
  13. package/dist/analyze/findings.d.ts +86 -0
  14. package/dist/analyze/findings.d.ts.map +1 -0
  15. package/dist/analyze/findings.js +143 -0
  16. package/dist/analyze/findings.js.map +1 -0
  17. package/dist/analyze/index.d.ts +2 -0
  18. package/dist/analyze/index.d.ts.map +1 -1
  19. package/dist/analyze/index.js +2 -0
  20. package/dist/analyze/index.js.map +1 -1
  21. package/dist/analyze/test-coverage.d.ts +0 -2
  22. package/dist/analyze/test-coverage.d.ts.map +1 -1
  23. package/dist/analyze/test-coverage.js +0 -10
  24. package/dist/analyze/test-coverage.js.map +1 -1
  25. package/dist/domain/edge-fact.d.ts +25 -0
  26. package/dist/domain/edge-fact.d.ts.map +1 -1
  27. package/dist/domain/rel-types.d.ts +4 -0
  28. package/dist/domain/rel-types.d.ts.map +1 -1
  29. package/dist/domain/rel-types.js +7 -0
  30. package/dist/domain/rel-types.js.map +1 -1
  31. package/dist/embedding/__tests__/embed.test.d.ts +2 -0
  32. package/dist/embedding/__tests__/embed.test.d.ts.map +1 -0
  33. package/dist/embedding/__tests__/embed.test.js +72 -0
  34. package/dist/embedding/__tests__/embed.test.js.map +1 -0
  35. package/dist/extractors/live-org/__tests__/liveness.test.d.ts +2 -0
  36. package/dist/extractors/live-org/__tests__/liveness.test.d.ts.map +1 -0
  37. package/dist/extractors/live-org/__tests__/liveness.test.js +148 -0
  38. package/dist/extractors/live-org/__tests__/liveness.test.js.map +1 -0
  39. package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts +2 -0
  40. package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts.map +1 -0
  41. package/dist/extractors/live-org/__tests__/mcd-baseline.test.js +174 -0
  42. package/dist/extractors/live-org/__tests__/mcd-baseline.test.js.map +1 -0
  43. package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts +2 -0
  44. package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts.map +1 -0
  45. package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js +75 -0
  46. package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js.map +1 -0
  47. package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts +2 -0
  48. package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts.map +1 -0
  49. package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js +135 -0
  50. package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js.map +1 -0
  51. package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts +2 -0
  52. package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts.map +1 -0
  53. package/dist/extractors/live-org/__tests__/soql-rebatch.test.js +118 -0
  54. package/dist/extractors/live-org/__tests__/soql-rebatch.test.js.map +1 -0
  55. package/dist/extractors/live-org/__tests__/vlocity-runner.test.js +27 -0
  56. package/dist/extractors/live-org/__tests__/vlocity-runner.test.js.map +1 -1
  57. package/dist/extractors/live-org/bulk-retrieve.d.ts +7 -0
  58. package/dist/extractors/live-org/bulk-retrieve.d.ts.map +1 -1
  59. package/dist/extractors/live-org/bulk-retrieve.js +10 -1
  60. package/dist/extractors/live-org/bulk-retrieve.js.map +1 -1
  61. package/dist/extractors/live-org/extractors/mcd-baseline.d.ts +60 -0
  62. package/dist/extractors/live-org/extractors/mcd-baseline.d.ts.map +1 -0
  63. package/dist/extractors/live-org/extractors/mcd-baseline.js +120 -0
  64. package/dist/extractors/live-org/extractors/mcd-baseline.js.map +1 -0
  65. package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts +23 -0
  66. package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts.map +1 -0
  67. package/dist/extractors/live-org/extractors/omnistudio-retrieve.js +172 -0
  68. package/dist/extractors/live-org/extractors/omnistudio-retrieve.js.map +1 -0
  69. package/dist/extractors/live-org/rate-limit.d.ts +57 -0
  70. package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
  71. package/dist/extractors/live-org/rate-limit.js +93 -8
  72. package/dist/extractors/live-org/rate-limit.js.map +1 -1
  73. package/dist/extractors/live-org/vlocity/runner.d.ts +1 -1
  74. package/dist/extractors/live-org/vlocity/runner.d.ts.map +1 -1
  75. package/dist/extractors/live-org/vlocity/runner.js +20 -9
  76. package/dist/extractors/live-org/vlocity/runner.js.map +1 -1
  77. package/dist/index.d.ts +1 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/ingest/__tests__/multi-org-orchestrator.test.js +3 -0
  82. package/dist/ingest/__tests__/multi-org-orchestrator.test.js.map +1 -1
  83. package/dist/ingest/live-ingest.d.ts +70 -1
  84. package/dist/ingest/live-ingest.d.ts.map +1 -1
  85. package/dist/ingest/live-ingest.js +109 -7
  86. package/dist/ingest/live-ingest.js.map +1 -1
  87. package/dist/parsers/__tests__/edge-provenance.test.d.ts +2 -0
  88. package/dist/parsers/__tests__/edge-provenance.test.d.ts.map +1 -0
  89. package/dist/parsers/__tests__/edge-provenance.test.js +44 -0
  90. package/dist/parsers/__tests__/edge-provenance.test.js.map +1 -0
  91. package/dist/parsers/__tests__/lwc-bindings.test.js +72 -0
  92. package/dist/parsers/__tests__/lwc-bindings.test.js.map +1 -1
  93. package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts +2 -0
  94. package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts.map +1 -0
  95. package/dist/parsers/__tests__/mcd-gap-fills.test.js +75 -0
  96. package/dist/parsers/__tests__/mcd-gap-fills.test.js.map +1 -0
  97. package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts +2 -0
  98. package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts.map +1 -0
  99. package/dist/parsers/__tests__/omnistudio-overlap.test.js +163 -0
  100. package/dist/parsers/__tests__/omnistudio-overlap.test.js.map +1 -0
  101. package/dist/parsers/__tests__/omnistudio.golden.test.js +51 -3
  102. package/dist/parsers/__tests__/omnistudio.golden.test.js.map +1 -1
  103. package/dist/parsers/__tests__/reflection-walker.test.d.ts +2 -0
  104. package/dist/parsers/__tests__/reflection-walker.test.d.ts.map +1 -0
  105. package/dist/parsers/__tests__/reflection-walker.test.js +162 -0
  106. package/dist/parsers/__tests__/reflection-walker.test.js.map +1 -0
  107. package/dist/parsers/__tests__/vlocity.golden.test.js +106 -5
  108. package/dist/parsers/__tests__/vlocity.golden.test.js.map +1 -1
  109. package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts +2 -0
  110. package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts.map +1 -0
  111. package/dist/parsers/apex/__tests__/is-test-attribute.test.js +54 -0
  112. package/dist/parsers/apex/__tests__/is-test-attribute.test.js.map +1 -0
  113. package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts +2 -0
  114. package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts.map +1 -0
  115. package/dist/parsers/apex/__tests__/regex-arg-count.test.js +82 -0
  116. package/dist/parsers/apex/__tests__/regex-arg-count.test.js.map +1 -0
  117. package/dist/parsers/apex/class.d.ts.map +1 -1
  118. package/dist/parsers/apex/class.js +103 -5
  119. package/dist/parsers/apex/class.js.map +1 -1
  120. package/dist/parsers/common.d.ts +4 -1
  121. package/dist/parsers/common.d.ts.map +1 -1
  122. package/dist/parsers/common.js +15 -2
  123. package/dist/parsers/common.js.map +1 -1
  124. package/dist/parsers/contract.d.ts +0 -2
  125. package/dist/parsers/contract.d.ts.map +1 -1
  126. package/dist/parsers/contract.js +0 -7
  127. package/dist/parsers/contract.js.map +1 -1
  128. package/dist/parsers/generic/reflection-walker.d.ts +90 -0
  129. package/dist/parsers/generic/reflection-walker.d.ts.map +1 -0
  130. package/dist/parsers/generic/reflection-walker.js +195 -0
  131. package/dist/parsers/generic/reflection-walker.js.map +1 -0
  132. package/dist/parsers/lwc/html-visitor.d.ts.map +1 -1
  133. package/dist/parsers/lwc/html-visitor.js +81 -3
  134. package/dist/parsers/lwc/html-visitor.js.map +1 -1
  135. package/dist/parsers/object/object.d.ts.map +1 -1
  136. package/dist/parsers/object/object.js +34 -0
  137. package/dist/parsers/object/object.js.map +1 -1
  138. package/dist/parsers/omnistudio/integration-procedure.d.ts.map +1 -1
  139. package/dist/parsers/omnistudio/integration-procedure.js +6 -3
  140. package/dist/parsers/omnistudio/integration-procedure.js.map +1 -1
  141. package/dist/parsers/omnistudio/overlap-detector.d.ts +50 -0
  142. package/dist/parsers/omnistudio/overlap-detector.d.ts.map +1 -0
  143. package/dist/parsers/omnistudio/overlap-detector.js +129 -0
  144. package/dist/parsers/omnistudio/overlap-detector.js.map +1 -0
  145. package/dist/parsers/omnistudio/process.d.ts.map +1 -1
  146. package/dist/parsers/omnistudio/process.js +17 -4
  147. package/dist/parsers/omnistudio/process.js.map +1 -1
  148. package/dist/parsers/omnistudio/ui-card.d.ts.map +1 -1
  149. package/dist/parsers/omnistudio/ui-card.js +6 -3
  150. package/dist/parsers/omnistudio/ui-card.js.map +1 -1
  151. package/dist/parsers/vlocity/common.d.ts +1 -2
  152. package/dist/parsers/vlocity/common.d.ts.map +1 -1
  153. package/dist/parsers/vlocity/common.js +0 -3
  154. package/dist/parsers/vlocity/common.js.map +1 -1
  155. package/dist/parsers/vlocity/integration-procedure.d.ts.map +1 -1
  156. package/dist/parsers/vlocity/integration-procedure.js +19 -3
  157. package/dist/parsers/vlocity/integration-procedure.js.map +1 -1
  158. package/dist/parsers/vlocity/omni-script.d.ts.map +1 -1
  159. package/dist/parsers/vlocity/omni-script.js +5 -2
  160. package/dist/parsers/vlocity/omni-script.js.map +1 -1
  161. package/dist/parsers/vlocity/vlocity-card.d.ts.map +1 -1
  162. package/dist/parsers/vlocity/vlocity-card.js +5 -2
  163. package/dist/parsers/vlocity/vlocity-card.js.map +1 -1
  164. package/dist/render/__tests__/sarif.test.d.ts +2 -0
  165. package/dist/render/__tests__/sarif.test.d.ts.map +1 -0
  166. package/dist/render/__tests__/sarif.test.js +129 -0
  167. package/dist/render/__tests__/sarif.test.js.map +1 -0
  168. package/dist/render/sarif.d.ts +94 -0
  169. package/dist/render/sarif.d.ts.map +1 -0
  170. package/dist/render/sarif.js +133 -0
  171. package/dist/render/sarif.js.map +1 -0
  172. package/dist/storage/__tests__/analysis-tables-migration.test.js +1 -1
  173. package/dist/storage/__tests__/migrations.test.js +4 -4
  174. package/dist/storage/__tests__/rename-stability.test.d.ts +2 -0
  175. package/dist/storage/__tests__/rename-stability.test.d.ts.map +1 -0
  176. package/dist/storage/__tests__/rename-stability.test.js +135 -0
  177. package/dist/storage/__tests__/rename-stability.test.js.map +1 -0
  178. package/dist/storage/index.d.ts +1 -0
  179. package/dist/storage/index.d.ts.map +1 -1
  180. package/dist/storage/index.js +1 -0
  181. package/dist/storage/index.js.map +1 -1
  182. package/dist/storage/interfaces.d.ts +3 -0
  183. package/dist/storage/interfaces.d.ts.map +1 -1
  184. package/dist/storage/sqlite/graph-store.d.ts +6 -0
  185. package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
  186. package/dist/storage/sqlite/graph-store.js +8 -0
  187. package/dist/storage/sqlite/graph-store.js.map +1 -1
  188. package/dist/storage/sqlite/migrations.d.ts.map +1 -1
  189. package/dist/storage/sqlite/migrations.js +19 -0
  190. package/dist/storage/sqlite/migrations.js.map +1 -1
  191. package/dist/storage/sqlite/rename-stability.d.ts +94 -0
  192. package/dist/storage/sqlite/rename-stability.d.ts.map +1 -0
  193. package/dist/storage/sqlite/rename-stability.js +96 -0
  194. package/dist/storage/sqlite/rename-stability.js.map +1 -0
  195. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"test-coverage.d.ts","sourceRoot":"","sources":["../../src/analyze/test-coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,CAQ9F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE9F"}
1
+ {"version":3,"file":"test-coverage.d.ts","sourceRoot":"","sources":["../../src/analyze/test-coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE9F"}
@@ -1,14 +1,4 @@
1
1
  import { REL_TYPES } from "../domain/rel-types.js";
2
- export function findTestsFor(store, orgId, qname) {
3
- const edges = store.listEdgesTo(orgId, qname, REL_TYPES.IS_TEST_FOR);
4
- const out = [];
5
- for (const e of edges) {
6
- const n = store.getNode(orgId, e.srcQualifiedName);
7
- if (n)
8
- out.push(n);
9
- }
10
- return out;
11
- }
12
2
  export function hasTestCoverage(store, orgId, qname) {
13
3
  return store.listEdgesTo(orgId, qname, REL_TYPES.IS_TEST_FOR).length > 0;
14
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-coverage.js","sourceRoot":"","sources":["../../src/analyze/test-coverage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,KAAY,EAAE,KAAoB;IAChF,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACrE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,KAAY,EAAE,KAAoB;IACnF,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"test-coverage.js","sourceRoot":"","sources":["../../src/analyze/test-coverage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,KAAY,EAAE,KAAoB;IACnF,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC"}
@@ -1,10 +1,35 @@
1
1
  import type { OrgId, QualifiedName } from "@ryanstark24/sfgraph-shared";
2
2
  import type { RelType } from "./rel-types.js";
3
+ /**
4
+ * Optional source-location citation attached to an edge. When set, downstream
5
+ * consumers can answer "why does X depend on Y" by pointing at a specific
6
+ * file (and line/column when the parser walked an AST with positions).
7
+ *
8
+ * Stored inside `attributes` rather than as top-level columns so adding
9
+ * provenance doesn't require a schema migration on existing edge tables.
10
+ * Mirrors how nodes carry `attributes.sourceUri` via makeNode in
11
+ * `parsers/common.ts`. See EdgeProvenance type for the read shape.
12
+ */
13
+ export interface EdgeProvenance {
14
+ /** Absolute URI / path of the source artifact the edge was parsed from. */
15
+ sourceUri?: string;
16
+ /** 1-indexed line of the producing token, when the parser had AST positions. */
17
+ line?: number;
18
+ /** 1-indexed column of the producing token. */
19
+ column?: number;
20
+ }
3
21
  export interface EdgeFact {
4
22
  orgId: OrgId;
5
23
  srcQualifiedName: QualifiedName;
6
24
  dstQualifiedName: QualifiedName;
7
25
  relType: RelType;
26
+ /**
27
+ * Edge attributes. Provenance fields `sourceUri`, `line`, `column` may be
28
+ * populated automatically by `makeEdge` (from ParseContext.sourceUri); the
29
+ * EdgeProvenance type documents that subset. Parsers can also write
30
+ * relation-specific attributes (e.g. `dynamic: true`, `signaturesMatch:
31
+ * false`, `source: 'mcd'`).
32
+ */
8
33
  attributes: Record<string, unknown>;
9
34
  firstSeenAt: number;
10
35
  lastSeenAt: number;
@@ -1 +1 @@
1
- {"version":3,"file":"edge-fact.d.ts","sourceRoot":"","sources":["../../src/domain/edge-fact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,aAAa,CAAC;IAChC,gBAAgB,EAAE,aAAa,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"edge-fact.d.ts","sourceRoot":"","sources":["../../src/domain/edge-fact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,aAAa,CAAC;IAChC,gBAAgB,EAAE,aAAa,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -91,6 +91,10 @@ export declare const REL_TYPES: {
91
91
  readonly INSTANCE_OF: "INSTANCE_OF";
92
92
  readonly REFERENCES_LABEL: "REFERENCES_LABEL";
93
93
  readonly GRANTS_USER_PERMISSION: "GRANTS_USER_PERMISSION";
94
+ /** Picklist CustomField references a GlobalValueSet for its picklist values. */
95
+ readonly USES_GLOBAL_VALUE_SET: "USES_GLOBAL_VALUE_SET";
96
+ /** Dependent-picklist CustomField depends on a controlling CustomField. */
97
+ readonly DEPENDS_ON_FIELD: "DEPENDS_ON_FIELD";
94
98
  };
95
99
  export type RelType = (typeof REL_TYPES)[keyof typeof REL_TYPES];
96
100
  //# sourceMappingURL=rel-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rel-types.d.ts","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCpB,6EAA6E;;IAE7E,kFAAkF;;;IAKlF;uEACmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsE3D,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"rel-types.d.ts","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCpB,6EAA6E;;IAE7E,kFAAkF;;;IAKlF;uEACmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0EnE,gFAAgF;;IAEhF,2EAA2E;;CAEnE,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC"}
@@ -102,5 +102,12 @@ export const REL_TYPES = {
102
102
  INSTANCE_OF: "INSTANCE_OF",
103
103
  REFERENCES_LABEL: "REFERENCES_LABEL",
104
104
  GRANTS_USER_PERMISSION: "GRANTS_USER_PERMISSION",
105
+ // W2-04: MCD gap-fill edges. Salesforce's MetadataComponentDependency
106
+ // SObject silently omits these three classes (verified against the
107
+ // platform docs); the object parser fills them in from describe payloads.
108
+ /** Picklist CustomField references a GlobalValueSet for its picklist values. */
109
+ USES_GLOBAL_VALUE_SET: "USES_GLOBAL_VALUE_SET",
110
+ /** Dependent-picklist CustomField depends on a controlling CustomField. */
111
+ DEPENDS_ON_FIELD: "DEPENDS_ON_FIELD",
105
112
  };
106
113
  //# sourceMappingURL=rel-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rel-types.js","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,kCAAkC;IAClC,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAElB,OAAO;IACP,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,qBAAqB,EAAE,uBAAuB;IAC9C,sBAAsB,EAAE,wBAAwB;IAChD,WAAW,EAAE,aAAa;IAE1B,MAAM;IACN,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,mBAAmB,EAAE,qBAAqB;IAC1C,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,kBAAkB,EAAE,oBAAoB;IACxC,6EAA6E;IAC7E,eAAe,EAAE,iBAAiB;IAClC,kFAAkF;IAClF,kBAAkB,EAAE,oBAAoB;IAExC,OAAO;IACP,iBAAiB,EAAE,mBAAmB;IACtC;uEACmE;IACnE,wBAAwB,EAAE,0BAA0B;IACpD,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,kBAAkB;IAEpC,SAAS;IACT,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAE1C,UAAU;IACV,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,iBAAiB,EAAE,mBAAmB;IAEtC,aAAa;IACb,yBAAyB,EAAE,2BAA2B;IACtD,gCAAgC,EAAE,kCAAkC;IACpE,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,wBAAwB,EAAE,0BAA0B;IAEpD,WAAW;IACX,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,wBAAwB,EAAE,0BAA0B;IAEpD,cAAc;IACd,yBAAyB,EAAE,2BAA2B;IACtD,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAE1C,eAAe;IACf,YAAY,EAAE,cAAc;IAE5B,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAC9B,kBAAkB,EAAE,oBAAoB;IACxC,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,qBAAqB,EAAE,uBAAuB;IAC9C,mBAAmB,EAAE,qBAAqB;IAC1C,uBAAuB,EAAE,yBAAyB;IAClD,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,qBAAqB,EAAE,uBAAuB;IAC9C,WAAW,EAAE,aAAa;IAC1B,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;CACxC,CAAC"}
1
+ {"version":3,"file":"rel-types.js","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.test.d.ts","sourceRoot":"","sources":["../../../src/embedding/__tests__/embed.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { embedSingle, embedTexts } from "../embed.js";
3
+ /**
4
+ * Tests for the standalone embedder. The MiniLM runtime
5
+ * (`@xenova/transformers` + `@ryanstark24/sfgraph-models`) is an
6
+ * `optionalDependencies` — these tests intentionally don't require it
7
+ * to be present and instead validate the graceful-fallback contract.
8
+ *
9
+ * The two functions:
10
+ * embedTexts(texts) — always returns Float32Array[]; falls back to
11
+ * zero vectors when the runtime isn't available
12
+ * (so the ingest path can keep upserting
13
+ * placeholder embeddings without crashing).
14
+ * embedSingle(text) — returns null when the runtime is unavailable
15
+ * OR when the embedding is degenerate-all-zero.
16
+ * Lets callers (like find_similar's text mode)
17
+ * distinguish "no embedder" from "embedded fine
18
+ * but the vector happens to be empty."
19
+ *
20
+ * On CI runners where the optional deps ARE installed (most cases) the
21
+ * tests still pass because the contracts hold either way: shape is
22
+ * always Float32Array, length is always 384, and embedSingle either
23
+ * returns null OR a non-degenerate vector.
24
+ */
25
+ describe("embedTexts", () => {
26
+ it("always returns a Float32Array per input, length 384", async () => {
27
+ const out = await embedTexts(["hello", "world", "lorem ipsum"]);
28
+ expect(out).toHaveLength(3);
29
+ for (const v of out) {
30
+ expect(v).toBeInstanceOf(Float32Array);
31
+ expect(v.length).toBe(384);
32
+ }
33
+ });
34
+ it("handles an empty array", async () => {
35
+ const out = await embedTexts([]);
36
+ expect(out).toEqual([]);
37
+ });
38
+ it("never throws on missing runtime — returns zero-vectors as fallback", async () => {
39
+ // The fallback path returns Float32Array(384) per input (all zeros).
40
+ // We can't force the import to fail mid-test without monkey-patching,
41
+ // so we just confirm that the function reliably returns *something*
42
+ // shaped right and doesn't throw on a stress input.
43
+ const out = await embedTexts(["", "x".repeat(1024)]);
44
+ expect(out).toHaveLength(2);
45
+ expect(out[0]).toBeInstanceOf(Float32Array);
46
+ expect(out[1]).toBeInstanceOf(Float32Array);
47
+ });
48
+ });
49
+ describe("embedSingle", () => {
50
+ it("returns null OR a Float32Array (never throws)", async () => {
51
+ const v = await embedSingle("test query");
52
+ if (v === null) {
53
+ // No runtime — that's a valid outcome. Done.
54
+ return;
55
+ }
56
+ expect(v).toBeInstanceOf(Float32Array);
57
+ expect(v.length).toBe(384);
58
+ });
59
+ it("respects custom dim opt when runtime is unavailable", async () => {
60
+ // When runtime is missing, embedSingle returns null regardless of dim
61
+ // (the only way to surface "no real embedding" cleanly). When runtime
62
+ // IS available, dim defaults to 384 unless overridden; we don't
63
+ // assert non-default here because that would require a real model
64
+ // configured for the alternate dim.
65
+ const v = await embedSingle("test", { dim: 768 });
66
+ // Either null (no runtime) or a Float32Array (with whatever dim
67
+ // the active model produces — caller's responsibility to match
68
+ // their override).
69
+ expect(v === null || v instanceof Float32Array).toBe(true);
70
+ });
71
+ });
72
+ //# sourceMappingURL=embed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.test.js","sourceRoot":"","sources":["../../../src/embedding/__tests__/embed.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,qEAAqE;QACrE,sEAAsE;QACtE,oEAAoE;QACpE,oDAAoD;QACpD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,6CAA6C;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,gEAAgE;QAChE,kEAAkE;QAClE,oCAAoC;QACpC,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,gEAAgE;QAChE,+DAA+D;QAC/D,mBAAmB;QACnB,MAAM,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=liveness.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveness.test.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/liveness.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,148 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { startLivenessProbe } from "../liveness.js";
3
+ /**
4
+ * Liveness-probe tests. The probe runs an interval that polls
5
+ * `conn.identity()` and counts consecutive failures. The contract:
6
+ *
7
+ * - On success: counter resets, no log noise.
8
+ * - First N-1 failures: warning log "(N/maxFailures)", `isDead()` still false.
9
+ * - Nth consecutive failure: `dead` flips true, CONNECTION LOST log
10
+ * fires once, onDead callback invoked once.
11
+ * - After the dead flip: further failures don't re-log or re-fire onDead.
12
+ * - stop() clears the interval so the probe stops polling.
13
+ *
14
+ * Uses vitest fake timers + a stub conn whose identity() can be flipped
15
+ * between resolving/rejecting/hanging between ticks.
16
+ */
17
+ beforeEach(() => {
18
+ vi.useFakeTimers();
19
+ });
20
+ afterEach(() => {
21
+ vi.useRealTimers();
22
+ });
23
+ function makeConn(behavior) {
24
+ // Async function so the call returns a real Promise the probe can race
25
+ // its timeout against. `hang` mode never resolves.
26
+ return {
27
+ identity: vi.fn(async () => {
28
+ if (behavior.mode === "ok")
29
+ return { user_id: "0050x000000fake" };
30
+ if (behavior.mode === "reject")
31
+ throw new Error("simulated reject");
32
+ return new Promise(() => {
33
+ /* hang forever */
34
+ });
35
+ }),
36
+ };
37
+ }
38
+ describe("startLivenessProbe", () => {
39
+ it("never logs / never fires onDead while identity() succeeds", async () => {
40
+ const conn = makeConn({ mode: "ok" });
41
+ const logs = [];
42
+ const onDead = vi.fn();
43
+ const probe = startLivenessProbe(conn, {
44
+ intervalMs: 1000,
45
+ identityTimeoutMs: 200,
46
+ maxFailures: 2,
47
+ onDead,
48
+ log: (l) => logs.push(l),
49
+ });
50
+ // Advance 5 intervals.
51
+ for (let i = 0; i < 5; i++) {
52
+ await vi.advanceTimersByTimeAsync(1000);
53
+ }
54
+ expect(probe.isDead()).toBe(false);
55
+ expect(probe.failureCount()).toBe(0);
56
+ expect(onDead).not.toHaveBeenCalled();
57
+ expect(logs).toEqual([]);
58
+ probe.stop();
59
+ });
60
+ it("warns at consecutive-failure 1/2 then fires CONNECTION LOST at 2/2", async () => {
61
+ const conn = makeConn({ mode: "reject" });
62
+ const logs = [];
63
+ const onDead = vi.fn();
64
+ const probe = startLivenessProbe(conn, {
65
+ intervalMs: 1000,
66
+ identityTimeoutMs: 200,
67
+ maxFailures: 2,
68
+ onDead,
69
+ log: (l) => logs.push(l),
70
+ });
71
+ // First tick — soft warning.
72
+ await vi.advanceTimersByTimeAsync(1000);
73
+ expect(probe.failureCount()).toBe(1);
74
+ expect(probe.isDead()).toBe(false);
75
+ expect(onDead).not.toHaveBeenCalled();
76
+ expect(logs.some((l) => l.includes("(1/2)"))).toBe(true);
77
+ // Second tick — flips to dead, fires onDead once, logs banner.
78
+ await vi.advanceTimersByTimeAsync(1000);
79
+ expect(probe.isDead()).toBe(true);
80
+ expect(onDead).toHaveBeenCalledTimes(1);
81
+ expect(logs.some((l) => l.includes("CONNECTION LOST"))).toBe(true);
82
+ // Further ticks — probe is short-circuited via the `dead` check; no
83
+ // further log entries, no further onDead calls.
84
+ const logsAfterDead = logs.length;
85
+ const deadCalls = onDead.mock.calls.length;
86
+ await vi.advanceTimersByTimeAsync(5000);
87
+ expect(onDead.mock.calls.length).toBe(deadCalls);
88
+ expect(logs.length).toBe(logsAfterDead);
89
+ probe.stop();
90
+ });
91
+ it("counts a hung identity() (timeout) as a failure", async () => {
92
+ const conn = makeConn({ mode: "hang" });
93
+ const logs = [];
94
+ const probe = startLivenessProbe(conn, {
95
+ intervalMs: 1000,
96
+ identityTimeoutMs: 200,
97
+ maxFailures: 2,
98
+ log: (l) => logs.push(l),
99
+ });
100
+ // Each tick: probe fires at t=1000, identity hangs, 200ms later the
101
+ // withDeadline rejects. So we need to advance 1000 + 200 to let one
102
+ // failure register.
103
+ await vi.advanceTimersByTimeAsync(1200);
104
+ expect(probe.failureCount()).toBe(1);
105
+ await vi.advanceTimersByTimeAsync(1200);
106
+ expect(probe.isDead()).toBe(true);
107
+ expect(logs.some((l) => l.includes("CONNECTION LOST"))).toBe(true);
108
+ probe.stop();
109
+ });
110
+ it("resets the failure counter on a successful tick after a failure", async () => {
111
+ // Connection that fails the first 2 ticks then succeeds.
112
+ let n = 0;
113
+ const conn = {
114
+ identity: async () => {
115
+ n += 1;
116
+ if (n <= 1)
117
+ throw new Error("first one fails");
118
+ return { user_id: "ok" };
119
+ },
120
+ };
121
+ const logs = [];
122
+ const probe = startLivenessProbe(conn, {
123
+ intervalMs: 1000,
124
+ identityTimeoutMs: 200,
125
+ maxFailures: 3, // threshold higher than fail-count, so we don't trip
126
+ log: (l) => logs.push(l),
127
+ });
128
+ await vi.advanceTimersByTimeAsync(1000); // fail #1
129
+ expect(probe.failureCount()).toBe(1);
130
+ await vi.advanceTimersByTimeAsync(1000); // success → resets
131
+ expect(probe.failureCount()).toBe(0);
132
+ expect(probe.isDead()).toBe(false);
133
+ probe.stop();
134
+ });
135
+ it("stop() halts further polling", async () => {
136
+ const conn = makeConn({ mode: "ok" });
137
+ const probe = startLivenessProbe(conn, {
138
+ intervalMs: 1000,
139
+ identityTimeoutMs: 200,
140
+ });
141
+ await vi.advanceTimersByTimeAsync(1000);
142
+ const callsBefore = conn.identity.mock.calls.length;
143
+ probe.stop();
144
+ await vi.advanceTimersByTimeAsync(5000);
145
+ expect(conn.identity.mock.calls.length).toBe(callsBefore);
146
+ });
147
+ });
148
+ //# sourceMappingURL=liveness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveness.test.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/liveness.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcd-baseline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcd-baseline.test.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/mcd-baseline.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { makeTestCtx } from "../../../parsers/__tests__/_harness.js";
3
+ import { limiter } from "../rate-limit.js";
4
+ import { MCD_LONG_TAIL_TYPES, runMcdBaseline } from "../extractors/mcd-baseline.js";
5
+ function row(overrides) {
6
+ return {
7
+ Id: overrides.Id ?? "01q000",
8
+ MetadataComponentId: overrides.MetadataComponentId ?? "00h000",
9
+ MetadataComponentType: overrides.MetadataComponentType ?? "Layout",
10
+ MetadataComponentName: overrides.MetadataComponentName ?? "Account-Account Layout",
11
+ MetadataComponentNamespace: overrides.MetadataComponentNamespace ?? null,
12
+ RefMetadataComponentId: overrides.RefMetadataComponentId ?? "00N000",
13
+ RefMetadataComponentType: overrides.RefMetadataComponentType ?? "CustomField",
14
+ RefMetadataComponentName: overrides.RefMetadataComponentName ?? "Account.Phone",
15
+ RefMetadataComponentNamespace: overrides.RefMetadataComponentNamespace ?? null,
16
+ };
17
+ }
18
+ function connWithRows(rowsByPredicate) {
19
+ const queries = [];
20
+ return {
21
+ queries,
22
+ conn: {
23
+ tooling: {
24
+ query: async (soql) => {
25
+ queries.push(soql);
26
+ // Pick the right row set based on the WHERE clause prefix
27
+ // ("MetadataComponentType = 'X'" or "RefMetadataComponentType = 'X'").
28
+ for (const [predicate, rows] of rowsByPredicate.entries()) {
29
+ if (soql.includes(predicate))
30
+ return { records: [...rows] };
31
+ }
32
+ return { records: [] };
33
+ },
34
+ },
35
+ },
36
+ };
37
+ }
38
+ describe("W2-03: MCD baseline extractor", () => {
39
+ beforeEach(async () => {
40
+ await limiter.incrementReservoir(10_000);
41
+ });
42
+ it("emits REFERENCES edges with source='mcd' for the long-tail set", async () => {
43
+ const rows = new Map([
44
+ [
45
+ "MetadataComponentType = 'Layout'",
46
+ [row({ Id: "1", MetadataComponentName: "Account-Layout", RefMetadataComponentName: "Account.Phone" })],
47
+ ],
48
+ ]);
49
+ const { conn } = connWithRows(rows);
50
+ const result = await runMcdBaseline(conn, {
51
+ orgId: "00Dxx0000000001",
52
+ ctx: makeTestCtx(),
53
+ types: ["Layout"],
54
+ });
55
+ expect(result.edges.length).toBe(1);
56
+ const e = result.edges[0];
57
+ expect(e?.relType).toBe("REFERENCES");
58
+ expect(e?.attributes.source).toBe("mcd");
59
+ expect(String(e?.srcQualifiedName)).toBe("Layout:Account-Layout");
60
+ expect(String(e?.dstQualifiedName)).toBe("CustomField:Account.Phone");
61
+ expect(result.byType.Layout?.asSource).toBe(1);
62
+ });
63
+ it("paginates via Id > lastId when the first page hits the LIMIT cap", async () => {
64
+ // Two pages: first page 2 rows (LIMIT=2), second page 1 row.
65
+ let callIdx = 0;
66
+ const conn = {
67
+ tooling: {
68
+ query: async (soql) => {
69
+ callIdx += 1;
70
+ if (callIdx === 1) {
71
+ // First page — returns LIMIT rows so paginator continues.
72
+ return {
73
+ records: [
74
+ row({ Id: "01q001" }),
75
+ row({ Id: "01q002" }),
76
+ ],
77
+ };
78
+ }
79
+ if (callIdx === 2) {
80
+ // Second page — should filter by Id > '01q002'
81
+ expect(soql).toContain("Id > '01q002'");
82
+ return { records: [row({ Id: "01q003" })] };
83
+ }
84
+ // Third page (would only happen if we accidentally kept going)
85
+ return { records: [] };
86
+ },
87
+ },
88
+ };
89
+ const result = await runMcdBaseline(conn, {
90
+ orgId: "00Dxx0000000001",
91
+ ctx: makeTestCtx(),
92
+ types: ["Layout"],
93
+ pageSize: 2,
94
+ });
95
+ expect(result.byType.Layout?.asSource).toBe(3);
96
+ expect(result.byType.Layout?.asTarget).toBe(0);
97
+ });
98
+ it("dedupes edges that surface in both query directions", async () => {
99
+ // Edge: Layout:A → Group:B. Should appear once even though it surfaces
100
+ // in both `MetadataComponentType = 'Layout'` and
101
+ // `RefMetadataComponentType = 'Group'` queries.
102
+ const sharedRow = row({
103
+ Id: "01q001",
104
+ MetadataComponentType: "Layout",
105
+ MetadataComponentName: "A",
106
+ RefMetadataComponentType: "Group",
107
+ RefMetadataComponentName: "B",
108
+ });
109
+ const conn = {
110
+ tooling: {
111
+ query: async (soql) => {
112
+ if (soql.includes("MetadataComponentType = 'Layout'"))
113
+ return { records: [sharedRow] };
114
+ if (soql.includes("RefMetadataComponentType = 'Group'"))
115
+ return { records: [sharedRow] };
116
+ return { records: [] };
117
+ },
118
+ },
119
+ };
120
+ const result = await runMcdBaseline(conn, {
121
+ orgId: "00Dxx0000000001",
122
+ ctx: makeTestCtx(),
123
+ types: ["Layout", "Group"],
124
+ });
125
+ const layoutToGroup = result.edges.filter((e) => String(e.srcQualifiedName) === "Layout:A" && String(e.dstQualifiedName) === "Group:B");
126
+ expect(layoutToGroup.length).toBe(1);
127
+ });
128
+ it("flags dynamic references when MCD's Id and Name match (isDynamicReference heuristic)", async () => {
129
+ const dynamicRow = row({
130
+ Id: "01q001",
131
+ MetadataComponentId: "00hABC",
132
+ MetadataComponentName: "00hABC", // Id == Name → dynamic
133
+ RefMetadataComponentName: "Account.Phone",
134
+ });
135
+ const conn = connWithRows(new Map([["MetadataComponentType = 'Layout'", [dynamicRow]]]));
136
+ const result = await runMcdBaseline(conn.conn, {
137
+ orgId: "00Dxx0000000001",
138
+ ctx: makeTestCtx(),
139
+ types: ["Layout"],
140
+ });
141
+ expect(result.edges[0]?.attributes.dynamic).toBe(true);
142
+ });
143
+ it("surfaces per-type failures via onError instead of swallowing", async () => {
144
+ const errors = [];
145
+ const conn = {
146
+ tooling: {
147
+ query: async (soql) => {
148
+ if (soql.includes("MetadataComponentType = 'Layout'")) {
149
+ throw new Error("INSUFFICIENT_ACCESS_OR_READONLY: simulated");
150
+ }
151
+ return { records: [] };
152
+ },
153
+ },
154
+ };
155
+ await runMcdBaseline(conn, {
156
+ orgId: "00Dxx0000000001",
157
+ ctx: makeTestCtx(),
158
+ types: ["Layout"],
159
+ onError: (label, err) => errors.push({ label, message: err.message }),
160
+ });
161
+ expect(errors.length).toBeGreaterThan(0);
162
+ expect(errors[0]?.label).toContain("Layout");
163
+ expect(errors[0]?.message).toContain("INSUFFICIENT_ACCESS");
164
+ });
165
+ it("MCD_LONG_TAIL_TYPES covers the documented set", () => {
166
+ expect(MCD_LONG_TAIL_TYPES).toContain("Layout");
167
+ expect(MCD_LONG_TAIL_TYPES).toContain("FieldSet");
168
+ expect(MCD_LONG_TAIL_TYPES).toContain("EmailTemplate");
169
+ expect(MCD_LONG_TAIL_TYPES).toContain("CustomTab");
170
+ expect(MCD_LONG_TAIL_TYPES).toContain("Group");
171
+ expect(MCD_LONG_TAIL_TYPES).toContain("Queue");
172
+ });
173
+ });
174
+ //# sourceMappingURL=mcd-baseline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcd-baseline.test.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/mcd-baseline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metadata-read-batch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-read-batch.test.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/metadata-read-batch.test.ts"],"names":[],"mappings":""}