@ryanstark24/sfgraph-core 1.1.8 → 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.
- package/dist/analyze/__tests__/find-nodes.test.d.ts +2 -0
- package/dist/analyze/__tests__/find-nodes.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/find-nodes.test.js +129 -0
- package/dist/analyze/__tests__/find-nodes.test.js.map +1 -0
- package/dist/analyze/__tests__/findings.test.d.ts +2 -0
- package/dist/analyze/__tests__/findings.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/findings.test.js +90 -0
- package/dist/analyze/__tests__/findings.test.js.map +1 -0
- package/dist/analyze/find-nodes.d.ts +38 -0
- package/dist/analyze/find-nodes.d.ts.map +1 -0
- package/dist/analyze/find-nodes.js +51 -0
- package/dist/analyze/find-nodes.js.map +1 -0
- package/dist/analyze/findings.d.ts +86 -0
- package/dist/analyze/findings.d.ts.map +1 -0
- package/dist/analyze/findings.js +143 -0
- package/dist/analyze/findings.js.map +1 -0
- package/dist/analyze/index.d.ts +2 -0
- package/dist/analyze/index.d.ts.map +1 -1
- package/dist/analyze/index.js +2 -0
- package/dist/analyze/index.js.map +1 -1
- package/dist/domain/edge-fact.d.ts +25 -0
- package/dist/domain/edge-fact.d.ts.map +1 -1
- package/dist/domain/rel-types.d.ts +4 -0
- package/dist/domain/rel-types.d.ts.map +1 -1
- package/dist/domain/rel-types.js +7 -0
- package/dist/domain/rel-types.js.map +1 -1
- package/dist/embedding/__tests__/embed.test.d.ts +2 -0
- package/dist/embedding/__tests__/embed.test.d.ts.map +1 -0
- package/dist/embedding/__tests__/embed.test.js +72 -0
- package/dist/embedding/__tests__/embed.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/liveness.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/liveness.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/liveness.test.js +148 -0
- package/dist/extractors/live-org/__tests__/liveness.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.js +174 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js +75 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js +135 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.js +118 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/vlocity-runner.test.js +27 -0
- package/dist/extractors/live-org/__tests__/vlocity-runner.test.js.map +1 -1
- package/dist/extractors/live-org/bulk-retrieve.d.ts +7 -0
- package/dist/extractors/live-org/bulk-retrieve.d.ts.map +1 -1
- package/dist/extractors/live-org/bulk-retrieve.js +10 -1
- package/dist/extractors/live-org/bulk-retrieve.js.map +1 -1
- package/dist/extractors/live-org/extractors/mcd-baseline.d.ts +60 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.js +120 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.js.map +1 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts +23 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.js +172 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.js.map +1 -0
- package/dist/extractors/live-org/rate-limit.d.ts +57 -0
- package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
- package/dist/extractors/live-org/rate-limit.js +93 -8
- package/dist/extractors/live-org/rate-limit.js.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.d.ts +1 -1
- package/dist/extractors/live-org/vlocity/runner.d.ts.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.js +20 -9
- package/dist/extractors/live-org/vlocity/runner.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js +3 -0
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js.map +1 -1
- package/dist/ingest/live-ingest.d.ts +70 -0
- package/dist/ingest/live-ingest.d.ts.map +1 -1
- package/dist/ingest/live-ingest.js +108 -1
- package/dist/ingest/live-ingest.js.map +1 -1
- package/dist/parsers/__tests__/edge-provenance.test.d.ts +2 -0
- package/dist/parsers/__tests__/edge-provenance.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/edge-provenance.test.js +44 -0
- package/dist/parsers/__tests__/edge-provenance.test.js.map +1 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js +72 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js.map +1 -1
- package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts +2 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.js +75 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.js.map +1 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts +2 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.js +163 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.js.map +1 -0
- package/dist/parsers/__tests__/reflection-walker.test.d.ts +2 -0
- package/dist/parsers/__tests__/reflection-walker.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/reflection-walker.test.js +162 -0
- package/dist/parsers/__tests__/reflection-walker.test.js.map +1 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.js +54 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.js.map +1 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.js +82 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.js.map +1 -0
- package/dist/parsers/apex/class.d.ts.map +1 -1
- package/dist/parsers/apex/class.js +103 -5
- package/dist/parsers/apex/class.js.map +1 -1
- package/dist/parsers/common.d.ts +4 -1
- package/dist/parsers/common.d.ts.map +1 -1
- package/dist/parsers/common.js +15 -2
- package/dist/parsers/common.js.map +1 -1
- package/dist/parsers/generic/reflection-walker.d.ts +90 -0
- package/dist/parsers/generic/reflection-walker.d.ts.map +1 -0
- package/dist/parsers/generic/reflection-walker.js +195 -0
- package/dist/parsers/generic/reflection-walker.js.map +1 -0
- package/dist/parsers/lwc/html-visitor.d.ts.map +1 -1
- package/dist/parsers/lwc/html-visitor.js +81 -3
- package/dist/parsers/lwc/html-visitor.js.map +1 -1
- package/dist/parsers/object/object.d.ts.map +1 -1
- package/dist/parsers/object/object.js +34 -0
- package/dist/parsers/object/object.js.map +1 -1
- package/dist/parsers/omnistudio/overlap-detector.d.ts +50 -0
- package/dist/parsers/omnistudio/overlap-detector.d.ts.map +1 -0
- package/dist/parsers/omnistudio/overlap-detector.js +129 -0
- package/dist/parsers/omnistudio/overlap-detector.js.map +1 -0
- package/dist/render/__tests__/sarif.test.d.ts +2 -0
- package/dist/render/__tests__/sarif.test.d.ts.map +1 -0
- package/dist/render/__tests__/sarif.test.js +129 -0
- package/dist/render/__tests__/sarif.test.js.map +1 -0
- package/dist/render/sarif.d.ts +94 -0
- package/dist/render/sarif.d.ts.map +1 -0
- package/dist/render/sarif.js +133 -0
- package/dist/render/sarif.js.map +1 -0
- package/dist/storage/__tests__/analysis-tables-migration.test.js +1 -1
- package/dist/storage/__tests__/migrations.test.js +4 -4
- package/dist/storage/__tests__/rename-stability.test.d.ts +2 -0
- package/dist/storage/__tests__/rename-stability.test.d.ts.map +1 -0
- package/dist/storage/__tests__/rename-stability.test.js +135 -0
- package/dist/storage/__tests__/rename-stability.test.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/interfaces.d.ts +3 -0
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.d.ts +6 -0
- package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.js +8 -0
- package/dist/storage/sqlite/graph-store.js.map +1 -1
- package/dist/storage/sqlite/migrations.d.ts.map +1 -1
- package/dist/storage/sqlite/migrations.js +19 -0
- package/dist/storage/sqlite/migrations.js.map +1 -1
- package/dist/storage/sqlite/rename-stability.d.ts +94 -0
- package/dist/storage/sqlite/rename-stability.d.ts.map +1 -0
- package/dist/storage/sqlite/rename-stability.js +96 -0
- package/dist/storage/sqlite/rename-stability.js.map +1 -0
- package/package.json +4 -1
|
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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"}
|
package/dist/domain/rel-types.js
CHANGED
|
@@ -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":"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
|
|
1
|
+
{"version":3,"file":"rel-types.js","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-read-batch.test.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/metadata-read-batch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { METADATA_READ_BATCH_SIZE, limiter, readMetadataBatchAdaptive, } from "../rate-limit.js";
|
|
3
|
+
function items(n) {
|
|
4
|
+
return Array.from({ length: n }, (_, i) => ({ fullName: `Item${i}` }));
|
|
5
|
+
}
|
|
6
|
+
function recordingConn() {
|
|
7
|
+
const calls = [];
|
|
8
|
+
return {
|
|
9
|
+
calls,
|
|
10
|
+
conn: {
|
|
11
|
+
metadata: {
|
|
12
|
+
read: async (_type, names) => {
|
|
13
|
+
calls.push([...names]);
|
|
14
|
+
return names.map((n) => ({ fullName: n, payload: n }));
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe("W2-06: readMetadataBatchAdaptive pre-chunks to the Metadata API per-call limit", () => {
|
|
21
|
+
beforeEach(async () => {
|
|
22
|
+
await limiter.incrementReservoir(10_000);
|
|
23
|
+
});
|
|
24
|
+
it("sends a single call when items.length ≤ METADATA_READ_BATCH_SIZE", async () => {
|
|
25
|
+
const { conn, calls } = recordingConn();
|
|
26
|
+
const out = await readMetadataBatchAdaptive(conn, "Flow", items(METADATA_READ_BATCH_SIZE));
|
|
27
|
+
expect(calls.length).toBe(1);
|
|
28
|
+
expect(calls[0]?.length).toBe(METADATA_READ_BATCH_SIZE);
|
|
29
|
+
expect(out.length).toBe(METADATA_READ_BATCH_SIZE);
|
|
30
|
+
});
|
|
31
|
+
it("splits oversized inputs into ceil(n/limit) parallel sub-calls", async () => {
|
|
32
|
+
const { conn, calls } = recordingConn();
|
|
33
|
+
// 25 items @ limit 10 → 3 sub-calls (10, 10, 5)
|
|
34
|
+
const out = await readMetadataBatchAdaptive(conn, "Flow", items(25));
|
|
35
|
+
expect(out.length).toBe(25);
|
|
36
|
+
expect(calls.length).toBe(3);
|
|
37
|
+
expect(calls.map((c) => c.length).sort((a, b) => a - b)).toEqual([5, 10, 10]);
|
|
38
|
+
// Result order must match input order across all chunks.
|
|
39
|
+
expect(out.map((r) => r.fullName)).toEqual(Array.from({ length: 25 }, (_, i) => `Item${i}`));
|
|
40
|
+
});
|
|
41
|
+
it("METADATA_READ_BATCH_SIZE is 10 by default (the Salesforce documented per-call cap)", () => {
|
|
42
|
+
// Guard against accidental bumps to 25 — that value belongs to the
|
|
43
|
+
// Composite REST API, not the SOAP Metadata API path this helper uses.
|
|
44
|
+
expect(METADATA_READ_BATCH_SIZE).toBeLessThanOrEqual(10);
|
|
45
|
+
expect(METADATA_READ_BATCH_SIZE).toBeGreaterThanOrEqual(1);
|
|
46
|
+
});
|
|
47
|
+
it("on per-chunk failure, only the failing chunk bisects (healthy peers unaffected)", async () => {
|
|
48
|
+
const calls = [];
|
|
49
|
+
const conn = {
|
|
50
|
+
metadata: {
|
|
51
|
+
read: async (_type, names) => {
|
|
52
|
+
// Fail the SECOND chunk (Item10..Item19), succeed on others.
|
|
53
|
+
// The bisection will halve, eventually succeeding on smaller slices.
|
|
54
|
+
const failsChunk = names.length > 1 && names[0] === "Item10";
|
|
55
|
+
calls.push({ names: [...names], ok: !failsChunk });
|
|
56
|
+
if (failsChunk) {
|
|
57
|
+
throw new Error("simulated transient failure");
|
|
58
|
+
}
|
|
59
|
+
return names.map((n) => ({ fullName: n }));
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
const out = await readMetadataBatchAdaptive(conn, "Flow", items(25));
|
|
64
|
+
expect(out.length).toBe(25);
|
|
65
|
+
// Verify chunks 1 (Item0..Item9) and 3 (Item20..Item24) were single-call,
|
|
66
|
+
// while chunk 2 (Item10..Item19) bisected at least once.
|
|
67
|
+
const chunk1Calls = calls.filter((c) => c.names[0] === "Item0");
|
|
68
|
+
const chunk3Calls = calls.filter((c) => c.names[0] === "Item20");
|
|
69
|
+
const chunk2Calls = calls.filter((c) => c.names[0]?.startsWith("Item1") && c.names[0] !== "Item20");
|
|
70
|
+
expect(chunk1Calls.length).toBe(1);
|
|
71
|
+
expect(chunk3Calls.length).toBe(1);
|
|
72
|
+
expect(chunk2Calls.length).toBeGreaterThan(1);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=metadata-read-batch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-read-batch.test.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/metadata-read-batch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,wBAAwB,EACxB,OAAO,EACP,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAM1B,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,OAAO;QACL,KAAK;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,KAAe,EAAsB,EAAE;oBACjE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;oBACvB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC9F,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;QACxC,gDAAgD;QAChD,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9E,yDAAyD;QACzD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAClE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,mEAAmE;QACnE,uEAAuE;QACvE,MAAM,CAAC,wBAAwB,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,wBAAwB,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,KAAK,GAAuC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE;gBACR,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,KAAe,EAAsB,EAAE;oBACjE,6DAA6D;oBAC7D,qEAAqE;oBACrE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;oBAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;oBACnD,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACjD,CAAC;oBACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7C,CAAC;aACF;SACF,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,0EAA0E;QAC1E,yDAAyD;QACzD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnistudio-retrieve.test.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/omnistudio-retrieve.test.ts"],"names":[],"mappings":""}
|