@ryanstark24/sfgraph-core 1.1.0 → 1.1.4
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__/audit-graph.test.d.ts +2 -0
- package/dist/analyze/__tests__/audit-graph.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/audit-graph.test.js +122 -0
- package/dist/analyze/__tests__/audit-graph.test.js.map +1 -0
- package/dist/analyze/audit-graph.d.ts +48 -0
- package/dist/analyze/audit-graph.d.ts.map +1 -0
- package/dist/analyze/audit-graph.js +50 -0
- package/dist/analyze/audit-graph.js.map +1 -0
- package/dist/analyze/index.d.ts +1 -0
- package/dist/analyze/index.d.ts.map +1 -1
- package/dist/analyze/index.js +1 -0
- package/dist/analyze/index.js.map +1 -1
- package/dist/domain/rel-types.d.ts +7 -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/extractors/live-org/__tests__/rate-limit.test.js +46 -1
- package/dist/extractors/live-org/__tests__/rate-limit.test.js.map +1 -1
- package/dist/extractors/live-org/capabilities.d.ts.map +1 -1
- package/dist/extractors/live-org/capabilities.js +21 -3
- package/dist/extractors/live-org/capabilities.js.map +1 -1
- package/dist/extractors/live-org/discovery.d.ts.map +1 -1
- package/dist/extractors/live-org/discovery.js +2 -4
- package/dist/extractors/live-org/discovery.js.map +1 -1
- package/dist/extractors/live-org/extractors/apex.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/apex.js +4 -4
- package/dist/extractors/live-org/extractors/apex.js.map +1 -1
- package/dist/extractors/live-org/extractors/generic-sobject.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/generic-sobject.js +2 -2
- package/dist/extractors/live-org/extractors/generic-sobject.js.map +1 -1
- package/dist/extractors/live-org/extractors/lwc.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/lwc.js +3 -3
- package/dist/extractors/live-org/extractors/lwc.js.map +1 -1
- package/dist/extractors/live-org/extractors/object.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/object.js +4 -4
- package/dist/extractors/live-org/extractors/object.js.map +1 -1
- package/dist/extractors/live-org/extractors/omnistudio.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/omnistudio.js +3 -3
- package/dist/extractors/live-org/extractors/omnistudio.js.map +1 -1
- package/dist/extractors/live-org/rate-limit.d.ts +18 -11
- package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
- package/dist/extractors/live-org/rate-limit.js +51 -19
- package/dist/extractors/live-org/rate-limit.js.map +1 -1
- package/dist/extractors/live-org/source-member.d.ts.map +1 -1
- package/dist/extractors/live-org/source-member.js +3 -3
- package/dist/extractors/live-org/source-member.js.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.d.ts.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.js +71 -38
- 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 +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js +4 -0
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js.map +1 -1
- package/dist/ingest/live-ingest.d.ts +16 -0
- package/dist/ingest/live-ingest.d.ts.map +1 -1
- package/dist/ingest/live-ingest.js +93 -0
- package/dist/ingest/live-ingest.js.map +1 -1
- package/dist/parsers/__tests__/lwc-bindings.test.d.ts +2 -0
- package/dist/parsers/__tests__/lwc-bindings.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js +74 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js.map +1 -0
- package/dist/parsers/apex/__tests__/arity-resolver.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/arity-resolver.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/arity-resolver.test.js +135 -0
- package/dist/parsers/apex/__tests__/arity-resolver.test.js.map +1 -0
- package/dist/parsers/apex/__tests__/ast-extractor.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/ast-extractor.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/ast-extractor.test.js +146 -0
- package/dist/parsers/apex/__tests__/ast-extractor.test.js.map +1 -0
- package/dist/parsers/apex/arity-resolver.d.ts +42 -0
- package/dist/parsers/apex/arity-resolver.d.ts.map +1 -0
- package/dist/parsers/apex/arity-resolver.js +111 -0
- package/dist/parsers/apex/arity-resolver.js.map +1 -0
- package/dist/parsers/apex/ast-extractor.d.ts +42 -0
- package/dist/parsers/apex/ast-extractor.d.ts.map +1 -0
- package/dist/parsers/apex/ast-extractor.js +402 -0
- package/dist/parsers/apex/ast-extractor.js.map +1 -0
- package/dist/parsers/apex/class.d.ts.map +1 -1
- package/dist/parsers/apex/class.js +56 -2
- package/dist/parsers/apex/class.js.map +1 -1
- package/dist/parsers/flow/__tests__/invocable-resolver.test.d.ts +2 -0
- package/dist/parsers/flow/__tests__/invocable-resolver.test.d.ts.map +1 -0
- package/dist/parsers/flow/__tests__/invocable-resolver.test.js +91 -0
- package/dist/parsers/flow/__tests__/invocable-resolver.test.js.map +1 -0
- package/dist/parsers/flow/invocable-resolver.d.ts +30 -0
- package/dist/parsers/flow/invocable-resolver.d.ts.map +1 -0
- package/dist/parsers/flow/invocable-resolver.js +67 -0
- package/dist/parsers/flow/invocable-resolver.js.map +1 -0
- package/dist/parsers/index.d.ts +2 -0
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +2 -0
- package/dist/parsers/index.js.map +1 -1
- package/dist/parsers/lwc/bundle.d.ts.map +1 -1
- package/dist/parsers/lwc/bundle.js +19 -4
- package/dist/parsers/lwc/bundle.js.map +1 -1
- package/dist/parsers/lwc/html-visitor.d.ts +2 -1
- package/dist/parsers/lwc/html-visitor.d.ts.map +1 -1
- package/dist/parsers/lwc/html-visitor.js +67 -3
- package/dist/parsers/lwc/html-visitor.js.map +1 -1
- package/dist/parsers/lwc/js-visitor.d.ts +22 -0
- package/dist/parsers/lwc/js-visitor.d.ts.map +1 -1
- package/dist/parsers/lwc/js-visitor.js +86 -2
- package/dist/parsers/lwc/js-visitor.js.map +1 -1
- package/dist/storage/interfaces.d.ts +9 -0
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.d.ts +10 -0
- package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.js +56 -0
- package/dist/storage/sqlite/graph-store.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-graph.test.d.ts","sourceRoot":"","sources":["../../../src/analyze/__tests__/audit-graph.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { asOrgId, asQualifiedName, asSha256 } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { REL_TYPES } from "../../domain/index.js";
|
|
4
|
+
import { SqliteGraphStore } from "../../storage/sqlite/graph-store.js";
|
|
5
|
+
import { auditDanglingEdges, deleteDanglingEdges } from "../audit-graph.js";
|
|
6
|
+
async function seed() {
|
|
7
|
+
const store = new SqliteGraphStore({ dbPath: ":memory:" });
|
|
8
|
+
await store.init();
|
|
9
|
+
const orgId = asOrgId("org_audit");
|
|
10
|
+
store.upsertOrg({
|
|
11
|
+
id: orgId,
|
|
12
|
+
alias: "test",
|
|
13
|
+
instanceUrl: "https://example.test",
|
|
14
|
+
apiVersion: "59.0",
|
|
15
|
+
createdAt: Date.now(),
|
|
16
|
+
});
|
|
17
|
+
const ts = Date.now();
|
|
18
|
+
// Two real nodes
|
|
19
|
+
store.mergeNodes([
|
|
20
|
+
{
|
|
21
|
+
orgId,
|
|
22
|
+
qualifiedName: asQualifiedName("ApexClass:Foo"),
|
|
23
|
+
label: "ApexClass",
|
|
24
|
+
attributes: {},
|
|
25
|
+
sourceHash: asSha256("foo"),
|
|
26
|
+
firstSeenAt: ts,
|
|
27
|
+
lastSeenAt: ts,
|
|
28
|
+
lastModifiedAt: ts,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
orgId,
|
|
32
|
+
qualifiedName: asQualifiedName("ApexMethod:Foo.bar(2)"),
|
|
33
|
+
label: "ApexMethod",
|
|
34
|
+
attributes: {},
|
|
35
|
+
sourceHash: asSha256("foobar"),
|
|
36
|
+
firstSeenAt: ts,
|
|
37
|
+
lastSeenAt: ts,
|
|
38
|
+
lastModifiedAt: ts,
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
// Three edges: one good, two dangling
|
|
42
|
+
store.mergeEdges([
|
|
43
|
+
{
|
|
44
|
+
orgId,
|
|
45
|
+
srcQualifiedName: asQualifiedName("ApexClass:Foo"),
|
|
46
|
+
dstQualifiedName: asQualifiedName("ApexMethod:Foo.bar(2)"),
|
|
47
|
+
relType: REL_TYPES.CONTAINS_METHOD,
|
|
48
|
+
attributes: {},
|
|
49
|
+
firstSeenAt: ts,
|
|
50
|
+
lastSeenAt: ts,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
orgId,
|
|
54
|
+
srcQualifiedName: asQualifiedName("ApexMethod:Foo.bar(2)"),
|
|
55
|
+
dstQualifiedName: asQualifiedName("ApexMethod:Ghost.notReal(?)"),
|
|
56
|
+
relType: REL_TYPES.CALLS,
|
|
57
|
+
attributes: {},
|
|
58
|
+
firstSeenAt: ts,
|
|
59
|
+
lastSeenAt: ts,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
orgId,
|
|
63
|
+
srcQualifiedName: asQualifiedName("ApexMethod:Foo.bar(2)"),
|
|
64
|
+
dstQualifiedName: asQualifiedName("CustomField:Account.Phantom__c"),
|
|
65
|
+
relType: REL_TYPES.READS_FIELD,
|
|
66
|
+
attributes: {},
|
|
67
|
+
firstSeenAt: ts,
|
|
68
|
+
lastSeenAt: ts,
|
|
69
|
+
},
|
|
70
|
+
]);
|
|
71
|
+
return { store, orgId };
|
|
72
|
+
}
|
|
73
|
+
describe("auditDanglingEdges", () => {
|
|
74
|
+
it("reports dangling edges grouped by relType and dst prefix", async () => {
|
|
75
|
+
const { store, orgId } = await seed();
|
|
76
|
+
const result = auditDanglingEdges(store, orgId);
|
|
77
|
+
expect(result.totalEdges).toBe(3);
|
|
78
|
+
expect(result.danglingCount).toBe(2);
|
|
79
|
+
expect(result.byRel).toMatchObject({ CALLS: 1, READS_FIELD: 1 });
|
|
80
|
+
expect(result.byDstPrefix).toMatchObject({ ApexMethod: 1, CustomField: 1 });
|
|
81
|
+
expect(result.sample).toHaveLength(2);
|
|
82
|
+
await store.close();
|
|
83
|
+
});
|
|
84
|
+
it("respects sampleSize", async () => {
|
|
85
|
+
const { store, orgId } = await seed();
|
|
86
|
+
const result = auditDanglingEdges(store, orgId, { sampleSize: 1 });
|
|
87
|
+
expect(result.danglingCount).toBe(2);
|
|
88
|
+
expect(result.sample).toHaveLength(1);
|
|
89
|
+
await store.close();
|
|
90
|
+
});
|
|
91
|
+
it("returns empty histograms when there are no dangling edges", async () => {
|
|
92
|
+
const store = new SqliteGraphStore({ dbPath: ":memory:" });
|
|
93
|
+
await store.init();
|
|
94
|
+
const orgId = asOrgId("org_empty");
|
|
95
|
+
store.upsertOrg({
|
|
96
|
+
id: orgId,
|
|
97
|
+
alias: "test",
|
|
98
|
+
instanceUrl: "https://example.test",
|
|
99
|
+
apiVersion: "59.0",
|
|
100
|
+
createdAt: Date.now(),
|
|
101
|
+
});
|
|
102
|
+
const result = auditDanglingEdges(store, orgId);
|
|
103
|
+
expect(result.totalEdges).toBe(0);
|
|
104
|
+
expect(result.danglingCount).toBe(0);
|
|
105
|
+
expect(result.sample).toHaveLength(0);
|
|
106
|
+
await store.close();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("deleteDanglingEdges", () => {
|
|
110
|
+
it("removes dangling edges and leaves good ones intact", async () => {
|
|
111
|
+
const { store, orgId } = await seed();
|
|
112
|
+
const before = auditDanglingEdges(store, orgId);
|
|
113
|
+
expect(before.danglingCount).toBe(2);
|
|
114
|
+
const { deleted } = deleteDanglingEdges(store, orgId);
|
|
115
|
+
expect(deleted).toBe(2);
|
|
116
|
+
const after = auditDanglingEdges(store, orgId);
|
|
117
|
+
expect(after.danglingCount).toBe(0);
|
|
118
|
+
expect(after.totalEdges).toBe(1); // good edge survives
|
|
119
|
+
await store.close();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=audit-graph.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-graph.test.js","sourceRoot":"","sources":["../../../src/analyze/__tests__/audit-graph.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { OrgId } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
import type { EdgeFact } from "../domain/index.js";
|
|
3
|
+
import type { GraphStore } from "../storage/interfaces.js";
|
|
4
|
+
/**
|
|
5
|
+
* Edges whose `dst` qualified name has no matching node row. Surfaced
|
|
6
|
+
* post-ingest so the user can see what the parsers reference but the
|
|
7
|
+
* extractors never materialized (managed-package methods, third-party
|
|
8
|
+
* imports, dotted refs to fields whose CustomObject was filtered out).
|
|
9
|
+
*
|
|
10
|
+
* Counts are emitted in two histograms:
|
|
11
|
+
* - byRel: which relationship types are most affected (e.g. CALLS,
|
|
12
|
+
* GRANTS_APEX_ACCESS) — points at parsers that emit speculative targets.
|
|
13
|
+
* - byDstPrefix: which qname prefixes are most common (e.g. `ApexMethod:`,
|
|
14
|
+
* `Remote:`, `CustomField:`) — points at unparsed metadata categories.
|
|
15
|
+
*
|
|
16
|
+
* A bounded `sample` of the actual dangling edges is included so users can
|
|
17
|
+
* eyeball whether they're "expected" (managed packages, ghost references)
|
|
18
|
+
* or "fixable" (an extractor that should have emitted a target node).
|
|
19
|
+
*/
|
|
20
|
+
export interface DanglingEdgeSample {
|
|
21
|
+
src: string;
|
|
22
|
+
rel: string;
|
|
23
|
+
dst: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AuditResult {
|
|
26
|
+
totalEdges: number;
|
|
27
|
+
danglingCount: number;
|
|
28
|
+
byRel: Record<string, number>;
|
|
29
|
+
byDstPrefix: Record<string, number>;
|
|
30
|
+
sample: DanglingEdgeSample[];
|
|
31
|
+
}
|
|
32
|
+
export interface AuditOpts {
|
|
33
|
+
/** How many dangling edges to keep in `sample`. Default 25. */
|
|
34
|
+
sampleSize?: number;
|
|
35
|
+
/** Hard upper bound on rows scanned per edge table. Default unlimited. */
|
|
36
|
+
scanLimit?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function auditDanglingEdges(store: GraphStore, orgIdIn: OrgId | string, opts?: AuditOpts): AuditResult;
|
|
39
|
+
/**
|
|
40
|
+
* Destructive companion to `auditDanglingEdges`: deletes every dangling edge.
|
|
41
|
+
* Reserved for the CLI `--delete-dangling --yes` flag; callers must own the
|
|
42
|
+
* authorization decision (we just do the work).
|
|
43
|
+
*/
|
|
44
|
+
export declare function deleteDanglingEdges(store: GraphStore, orgIdIn: OrgId | string): {
|
|
45
|
+
deleted: number;
|
|
46
|
+
};
|
|
47
|
+
export type { EdgeFact };
|
|
48
|
+
//# sourceMappingURL=audit-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-graph.d.ts","sourceRoot":"","sources":["../../src/analyze/audit-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,KAAK,GAAG,MAAM,EACvB,IAAI,GAAE,SAAc,GACnB,WAAW,CA8Bb;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,KAAK,GAAG,MAAM,GACtB;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAgBrB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { asOrgId } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
function prefix(qname) {
|
|
3
|
+
const idx = qname.indexOf(":");
|
|
4
|
+
return idx > 0 ? qname.slice(0, idx) : "(unlabeled)";
|
|
5
|
+
}
|
|
6
|
+
export function auditDanglingEdges(store, orgIdIn, opts = {}) {
|
|
7
|
+
const orgId = typeof orgIdIn === "string" ? asOrgId(orgIdIn) : orgIdIn;
|
|
8
|
+
// Clamp to ≥0; a negative slice index would silently return a tail of the
|
|
9
|
+
// dangling array rather than an empty sample.
|
|
10
|
+
const sampleSize = Math.max(0, opts.sampleSize ?? 25);
|
|
11
|
+
const totalEdges = store.countEdges(orgId);
|
|
12
|
+
const dangling = store.listDanglingEdges(orgId, opts.scanLimit);
|
|
13
|
+
const byRel = {};
|
|
14
|
+
const byDstPrefix = {};
|
|
15
|
+
for (const e of dangling) {
|
|
16
|
+
byRel[e.relType] = (byRel[e.relType] ?? 0) + 1;
|
|
17
|
+
const p = prefix(String(e.dstQualifiedName));
|
|
18
|
+
byDstPrefix[p] = (byDstPrefix[p] ?? 0) + 1;
|
|
19
|
+
}
|
|
20
|
+
const sample = dangling.slice(0, sampleSize).map((e) => ({
|
|
21
|
+
src: String(e.srcQualifiedName),
|
|
22
|
+
rel: String(e.relType),
|
|
23
|
+
dst: String(e.dstQualifiedName),
|
|
24
|
+
}));
|
|
25
|
+
return {
|
|
26
|
+
totalEdges,
|
|
27
|
+
danglingCount: dangling.length,
|
|
28
|
+
byRel,
|
|
29
|
+
byDstPrefix,
|
|
30
|
+
sample,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Destructive companion to `auditDanglingEdges`: deletes every dangling edge.
|
|
35
|
+
* Reserved for the CLI `--delete-dangling --yes` flag; callers must own the
|
|
36
|
+
* authorization decision (we just do the work).
|
|
37
|
+
*/
|
|
38
|
+
export function deleteDanglingEdges(store, orgIdIn) {
|
|
39
|
+
const orgId = typeof orgIdIn === "string" ? asOrgId(orgIdIn) : orgIdIn;
|
|
40
|
+
const dangling = store.listDanglingEdges(orgId);
|
|
41
|
+
let deleted = 0;
|
|
42
|
+
store.transaction(() => {
|
|
43
|
+
for (const e of dangling) {
|
|
44
|
+
store.deleteEdge(orgId, e.srcQualifiedName, e.dstQualifiedName, e.relType);
|
|
45
|
+
deleted += 1;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return { deleted };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=audit-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-graph.js","sourceRoot":"","sources":["../../src/analyze/audit-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AA0CtD,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAiB,EACjB,OAAuB,EACvB,OAAkB,EAAE;IAEpB,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,0EAA0E;IAC1E,8CAA8C;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEhE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC7C,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAyB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC/B,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;KAChC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,UAAU;QACV,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,KAAK;QACL,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,OAAuB;IAEvB,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACrB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,UAAU,CACd,KAAK,EACL,CAAC,CAAC,gBAAiC,EACnC,CAAC,CAAC,gBAAiC,EACnC,CAAC,CAAC,OAAkB,CACrB,CAAC;YACF,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
package/dist/analyze/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mCAAmC,CAAC;AAClD,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mCAAmC,CAAC;AAClD,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
package/dist/analyze/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mCAAmC,CAAC;AAClD,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mCAAmC,CAAC;AAClD,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
|
@@ -29,7 +29,14 @@ export declare const REL_TYPES: {
|
|
|
29
29
|
readonly EMBEDS_LWC: "EMBEDS_LWC";
|
|
30
30
|
readonly EMBEDS_AURA: "EMBEDS_AURA";
|
|
31
31
|
readonly CONTAINS_COMPONENT: "CONTAINS_COMPONENT";
|
|
32
|
+
/** Phase 5: LWC template binding `{var.field}` resolved to a CustomField. */
|
|
33
|
+
readonly LWC_BINDS_FIELD: "LWC_BINDS_FIELD";
|
|
34
|
+
/** Phase 5: LWC template binding whose target couldn't be resolved to a field. */
|
|
35
|
+
readonly LWC_BINDS_PROPERTY: "LWC_BINDS_PROPERTY";
|
|
32
36
|
readonly FLOW_INVOKES_APEX: "FLOW_INVOKES_APEX";
|
|
37
|
+
/** Resolved by Phase 6 invocable-resolver: edge from Flow to the specific
|
|
38
|
+
* ApexMethod annotated @InvocableMethod on the action's class. */
|
|
39
|
+
readonly FLOW_INVOKES_APEX_METHOD: "FLOW_INVOKES_APEX_METHOD";
|
|
33
40
|
readonly FLOW_INVOKES_SUBFLOW: "FLOW_INVOKES_SUBFLOW";
|
|
34
41
|
readonly FLOW_INVOKES_ACTION: "FLOW_INVOKES_ACTION";
|
|
35
42
|
readonly REFERENCES_OBJECT: "REFERENCES_OBJECT";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rel-types.d.ts","sourceRoot":"","sources":["../../src/domain/rel-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS
|
|
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"}
|
package/dist/domain/rel-types.js
CHANGED
|
@@ -32,8 +32,15 @@ export const REL_TYPES = {
|
|
|
32
32
|
EMBEDS_LWC: "EMBEDS_LWC",
|
|
33
33
|
EMBEDS_AURA: "EMBEDS_AURA",
|
|
34
34
|
CONTAINS_COMPONENT: "CONTAINS_COMPONENT",
|
|
35
|
+
/** Phase 5: LWC template binding `{var.field}` resolved to a CustomField. */
|
|
36
|
+
LWC_BINDS_FIELD: "LWC_BINDS_FIELD",
|
|
37
|
+
/** Phase 5: LWC template binding whose target couldn't be resolved to a field. */
|
|
38
|
+
LWC_BINDS_PROPERTY: "LWC_BINDS_PROPERTY",
|
|
35
39
|
// Flow
|
|
36
40
|
FLOW_INVOKES_APEX: "FLOW_INVOKES_APEX",
|
|
41
|
+
/** Resolved by Phase 6 invocable-resolver: edge from Flow to the specific
|
|
42
|
+
* ApexMethod annotated @InvocableMethod on the action's class. */
|
|
43
|
+
FLOW_INVOKES_APEX_METHOD: "FLOW_INVOKES_APEX_METHOD",
|
|
37
44
|
FLOW_INVOKES_SUBFLOW: "FLOW_INVOKES_SUBFLOW",
|
|
38
45
|
FLOW_INVOKES_ACTION: "FLOW_INVOKES_ACTION",
|
|
39
46
|
REFERENCES_OBJECT: "REFERENCES_OBJECT",
|
|
@@ -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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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Bottleneck from "bottleneck";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { queryLimit, scheduleQuery } from "../rate-limit.js";
|
|
3
|
+
import { queryLimit, readMetadataBatchAdaptive, scheduleQuery } from "../rate-limit.js";
|
|
4
4
|
describe("rate-limit", () => {
|
|
5
5
|
it("retries once on REQUEST_LIMIT_EXCEEDED and ultimately resolves", async () => {
|
|
6
6
|
let calls = 0;
|
|
@@ -29,5 +29,50 @@ describe("rate-limit", () => {
|
|
|
29
29
|
const r = await scheduleQuery(async () => 7);
|
|
30
30
|
expect(r).toBe(7);
|
|
31
31
|
});
|
|
32
|
+
it("readMetadataBatchAdaptive bisects on timeout and resolves singletons", async () => {
|
|
33
|
+
const items = [
|
|
34
|
+
{ fullName: "a" },
|
|
35
|
+
{ fullName: "b" },
|
|
36
|
+
{ fullName: "c" },
|
|
37
|
+
{ fullName: "d" },
|
|
38
|
+
];
|
|
39
|
+
const POISON = "c";
|
|
40
|
+
const conn = {
|
|
41
|
+
metadata: {
|
|
42
|
+
read: async (_type, names) => {
|
|
43
|
+
if (names.includes(POISON) && names.length > 1) {
|
|
44
|
+
// Simulate Salesforce timing out the multi-item read whenever the
|
|
45
|
+
// poison record is in the batch.
|
|
46
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
47
|
+
throw new Error("metadata.read CustomObject: timeout (5ms)");
|
|
48
|
+
}
|
|
49
|
+
if (names.length === 1 && names[0] === POISON) {
|
|
50
|
+
throw new Error("metadata.read CustomObject: timeout (single)");
|
|
51
|
+
}
|
|
52
|
+
// Return one record per name in the same order.
|
|
53
|
+
return names.map((n) => ({ fullName: n }));
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const result = await readMetadataBatchAdaptive(conn, "CustomObject", items);
|
|
58
|
+
expect(result).toHaveLength(4);
|
|
59
|
+
// a, b, d survive — c is dropped after recursive bisect.
|
|
60
|
+
expect(result[0]?.fullName).toBe("a");
|
|
61
|
+
expect(result[1]?.fullName).toBe("b");
|
|
62
|
+
expect(result[2]).toBeNull();
|
|
63
|
+
expect(result[3]?.fullName).toBe("d");
|
|
64
|
+
});
|
|
65
|
+
it("readMetadataBatchAdaptive returns nulls when every slice times out", async () => {
|
|
66
|
+
const items = [{ fullName: "a" }, { fullName: "b" }];
|
|
67
|
+
const conn = {
|
|
68
|
+
metadata: {
|
|
69
|
+
read: async () => {
|
|
70
|
+
throw new Error("metadata.read CustomObject: timeout (everything)");
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
const result = await readMetadataBatchAdaptive(conn, "CustomObject", items);
|
|
75
|
+
expect(result).toEqual([null, null]);
|
|
76
|
+
});
|
|
32
77
|
});
|
|
33
78
|
//# sourceMappingURL=rate-limit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.test.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/rate-limit.test.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.test.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/__tests__/rate-limit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/capabilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,iGAY/B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,aAAa,EAAE,OAAO,CAAC;IACvB,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/capabilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,iGAY/B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,aAAa,EAAE,OAAO,CAAC;IACvB,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AA0DD,4FAA4F;AAC5F,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAqC3E"}
|
|
@@ -11,9 +11,27 @@ export const VLOCITY_NAMESPACE_CANDIDATES = [
|
|
|
11
11
|
// OmniStudio-managed orgs without writing a parallel extractor.
|
|
12
12
|
"omnistudio",
|
|
13
13
|
];
|
|
14
|
+
// All capability probes use a SHORT 15s timeout — they're tiny single-row
|
|
15
|
+
// queries against well-known SObjects, and probeCapabilities is the very
|
|
16
|
+
// first thing every ingest does. If the connection's dead at this stage,
|
|
17
|
+
// we want to surface that within seconds, not hang the whole startup
|
|
18
|
+
// hoping for a response that's never coming.
|
|
19
|
+
const CAPS_PROBE_TIMEOUT_MS = 15_000;
|
|
20
|
+
async function withCapsTimeout(p, label) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const t = setTimeout(() => reject(new Error(`capabilities probe ${label} timeout (${CAPS_PROBE_TIMEOUT_MS}ms)`)), CAPS_PROBE_TIMEOUT_MS);
|
|
23
|
+
p.then((v) => {
|
|
24
|
+
clearTimeout(t);
|
|
25
|
+
resolve(v);
|
|
26
|
+
}, (e) => {
|
|
27
|
+
clearTimeout(t);
|
|
28
|
+
reject(e);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
14
32
|
async function safeQuery(conn, soql) {
|
|
15
33
|
try {
|
|
16
|
-
return (await conn.query(soql));
|
|
34
|
+
return (await withCapsTimeout(conn.query(soql), `query ${soql.slice(0, 40)}`));
|
|
17
35
|
}
|
|
18
36
|
catch {
|
|
19
37
|
return null;
|
|
@@ -21,7 +39,7 @@ async function safeQuery(conn, soql) {
|
|
|
21
39
|
}
|
|
22
40
|
async function safeToolingQuery(conn, soql) {
|
|
23
41
|
try {
|
|
24
|
-
return (await conn.tooling.query(soql));
|
|
42
|
+
return (await withCapsTimeout(conn.tooling.query(soql), `tooling ${soql.slice(0, 40)}`));
|
|
25
43
|
}
|
|
26
44
|
catch {
|
|
27
45
|
return null;
|
|
@@ -30,7 +48,7 @@ async function safeToolingQuery(conn, soql) {
|
|
|
30
48
|
async function describeExists(conn, name, useTooling = false) {
|
|
31
49
|
try {
|
|
32
50
|
const root = useTooling ? conn.tooling : conn;
|
|
33
|
-
await root.sobject(name).describe();
|
|
51
|
+
await withCapsTimeout(root.sobject(name).describe(), `describe ${name}`);
|
|
34
52
|
return true;
|
|
35
53
|
}
|
|
36
54
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/extractors/live-org/capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,aAAa;IACb,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,sEAAsE;IACtE,uEAAuE;IACvE,oEAAoE;IACpE,0DAA0D;IAC1D,gEAAgE;IAChE,YAAY;CACJ,CAAC;AAkBX,KAAK,UAAU,SAAS,CAAC,IAAS,EAAE,IAAY;IAC9C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/extractors/live-org/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/discovery.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,GAAG,EACT,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/discovery.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,GAAG,EACT,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB1B"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { scheduleMetadata } from "./rate-limit.js";
|
|
1
|
+
import { METADATA_DESCRIBE_TIMEOUT_MS, scheduleMetadata, withTimeout } from "./rate-limit.js";
|
|
2
2
|
/**
|
|
3
3
|
* Call `conn.metadata.describe(apiVersion)` and normalize the result into a
|
|
4
4
|
* stable `DescribedType[]`. Entries with empty xmlName are filtered out.
|
|
5
5
|
*/
|
|
6
6
|
export async function discoverMetadataTypes(conn, apiVersion) {
|
|
7
|
-
const result = await scheduleMetadata(
|
|
8
|
-
return await conn.metadata.describe(apiVersion);
|
|
9
|
-
});
|
|
7
|
+
const result = (await scheduleMetadata(() => withTimeout(conn.metadata.describe(apiVersion), METADATA_DESCRIBE_TIMEOUT_MS, "metadata.describe")));
|
|
10
8
|
const arr = Array.isArray(result?.metadataObjects) ? result.metadataObjects : [];
|
|
11
9
|
return arr
|
|
12
10
|
.map((o) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/extractors/live-org/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/extractors/live-org/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAW9F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAS,EACT,UAAmB;IAEnB,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAC1C,WAAW,CACT,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAClC,4BAA4B,EAC5B,mBAAmB,CACpB,CACF,CAAuD,CAAC;IACzD,MAAM,GAAG,GAAU,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,EAAE,MAAM;QACjB,aAAa,EAAE,CAAC,EAAE,aAAa;QAC/B,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACjF,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC9B,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC;KAC/B,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apex.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/apex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AA2CrE,wBAAuB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"apex.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/apex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AA2CrE,wBAAuB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CAiEnE;AAED,4EAA4E;AAC5E,wBAAsB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA2BhF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { METADATA_CATEGORY } from "../../../domain/index.js";
|
|
2
|
-
import { scheduleQuery } from "../rate-limit.js";
|
|
2
|
+
import { scheduleQuery, soqlWithTimeout } from "../rate-limit.js";
|
|
3
3
|
const APEX_CLASS_SOQL = "SELECT Id, Name, Body, NamespacePrefix, LastModifiedDate, ApiVersion, Status FROM ApexClass";
|
|
4
4
|
const APEX_TRIGGER_SOQL = "SELECT Id, Name, Body, NamespacePrefix, LastModifiedDate, ApiVersion, Status, TableEnumOrId FROM ApexTrigger";
|
|
5
5
|
/**
|
|
@@ -27,8 +27,8 @@ export async function* iterApex(conn) {
|
|
|
27
27
|
// doesn't poison the other's promise into an unhandled rejection (which
|
|
28
28
|
// crashes node 24+).
|
|
29
29
|
const [classesS, triggersS] = await Promise.allSettled([
|
|
30
|
-
scheduleQuery(() => conn.tooling.query(APEX_CLASS_SOQL)),
|
|
31
|
-
scheduleQuery(() => conn.tooling.query(APEX_TRIGGER_SOQL)),
|
|
30
|
+
scheduleQuery(() => soqlWithTimeout(conn.tooling.query(APEX_CLASS_SOQL), "tooling ApexClass")),
|
|
31
|
+
scheduleQuery(() => soqlWithTimeout(conn.tooling.query(APEX_TRIGGER_SOQL), "tooling ApexTrigger")),
|
|
32
32
|
]);
|
|
33
33
|
const classes = classesS.status === "fulfilled" ? classesS.value : null;
|
|
34
34
|
const triggers = triggersS.status === "fulfilled" ? triggersS.value : null;
|
|
@@ -83,7 +83,7 @@ export async function* iterApex(conn) {
|
|
|
83
83
|
export async function iterOne(conn, name) {
|
|
84
84
|
const escaped = name.replace(/'/g, "\\'");
|
|
85
85
|
const tryQuery = async (soql, type) => {
|
|
86
|
-
const res = (await scheduleQuery(() => conn.tooling.query(soql)));
|
|
86
|
+
const res = (await scheduleQuery(() => soqlWithTimeout(conn.tooling.query(soql), `tooling ${type} ${name}`)));
|
|
87
87
|
const r = res?.records?.[0];
|
|
88
88
|
if (!r)
|
|
89
89
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apex.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/apex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"apex.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/apex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-sobject.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/generic-sobject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAGrE;;;GAGG;AACH,wBAAuB,kBAAkB,CACvC,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,EAAuC,GACpD,aAAa,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"generic-sobject.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/generic-sobject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAGrE;;;GAGG;AACH,wBAAuB,kBAAkB,CACvC,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,EAAuC,GACpD,aAAa,CAAC,SAAS,CAAC,CAwB1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { METADATA_CATEGORY } from "../../../domain/index.js";
|
|
2
|
-
import { scheduleData } from "../rate-limit.js";
|
|
2
|
+
import { scheduleData, soqlWithTimeout } from "../rate-limit.js";
|
|
3
3
|
/**
|
|
4
4
|
* Generic SOQL iterator for SObject-backed types (CMDT records, etc.).
|
|
5
5
|
* Errors are silent — caller may have routed an SObject that doesn't exist.
|
|
@@ -8,7 +8,7 @@ export async function* iterGenericSObject(conn, orgId, sobject, fields = ["Id",
|
|
|
8
8
|
const soql = `SELECT ${fields.join(", ")} FROM ${sobject}`;
|
|
9
9
|
let result = null;
|
|
10
10
|
try {
|
|
11
|
-
result = (await scheduleData(() => conn.query(soql)));
|
|
11
|
+
result = (await scheduleData(() => soqlWithTimeout(conn.query(soql), `data ${sobject}`)));
|
|
12
12
|
}
|
|
13
13
|
catch {
|
|
14
14
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-sobject.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/generic-sobject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"generic-sobject.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/generic-sobject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;GAGG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CACvC,IAAS,EACT,KAAa,EACb,OAAe,EACf,SAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC;IAErD,MAAM,IAAI,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC;IAC3D,IAAI,MAAM,GAA+B,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,CAChC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,CAAC,CACrD,CAA+B,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAU,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM;YACJ,GAAG,EAAE;gBACH,QAAQ,EAAE,iBAAiB,CAAC,MAAM;gBAClC,UAAU,EAAE,OAAO;gBACnB,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;gBACvE,SAAS,EAAE,QAAQ,KAAK,IAAI,OAAO,IAAI,IAAI,EAAE;aAC9C;YACD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lwc.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/lwc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAerE,wBAAuB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"lwc.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/lwc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAerE,wBAAuB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CA4HlE"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { METADATA_CATEGORY } from "../../../domain/index.js";
|
|
2
|
-
import { scheduleQuery } from "../rate-limit.js";
|
|
2
|
+
import { scheduleQuery, soqlWithTimeout } from "../rate-limit.js";
|
|
3
3
|
export async function* iterLwc(conn) {
|
|
4
4
|
const debug = process.env.SFGRAPH_DEBUG_INGEST === "1";
|
|
5
|
-
const bundles = (await scheduleQuery(() => conn.tooling.query("SELECT Id, DeveloperName, NamespacePrefix, LastModifiedDate FROM LightningComponentBundle")));
|
|
5
|
+
const bundles = (await scheduleQuery(() => soqlWithTimeout(conn.tooling.query("SELECT Id, DeveloperName, NamespacePrefix, LastModifiedDate FROM LightningComponentBundle"), "tooling LightningComponentBundle list")));
|
|
6
6
|
const allBundles = bundles?.records ?? [];
|
|
7
7
|
if (debug) {
|
|
8
8
|
const managedCount = allBundles.filter((b) => b.NamespacePrefix).length;
|
|
@@ -62,7 +62,7 @@ export async function* iterLwc(conn) {
|
|
|
62
62
|
let files = {};
|
|
63
63
|
try {
|
|
64
64
|
const escapedId = b.Id.replace(/'/g, "\\'");
|
|
65
|
-
const resources = (await scheduleQuery(() => conn.tooling.query(`SELECT FilePath, Source FROM LightningComponentResource WHERE LightningComponentBundleId = '${escapedId}'`)));
|
|
65
|
+
const resources = (await scheduleQuery(() => soqlWithTimeout(conn.tooling.query(`SELECT FilePath, Source FROM LightningComponentResource WHERE LightningComponentBundleId = '${escapedId}'`), `tooling LightningComponentResource ${b.DeveloperName}`)));
|
|
66
66
|
let totalSourceBytes = 0;
|
|
67
67
|
for (const r of resources?.records ?? []) {
|
|
68
68
|
const src = r.Source ?? "";
|