@ryanstark24/sfgraph-core 1.1.8 → 1.4.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__/audit-graph.test.js +79 -0
- package/dist/analyze/__tests__/audit-graph.test.js.map +1 -1
- package/dist/analyze/__tests__/edge-filters.test.d.ts +2 -0
- package/dist/analyze/__tests__/edge-filters.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/edge-filters.test.js +66 -0
- package/dist/analyze/__tests__/edge-filters.test.js.map +1 -0
- 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 +100 -0
- package/dist/analyze/__tests__/findings.test.js.map +1 -0
- package/dist/analyze/__tests__/governor-risks-detection.test.js +90 -0
- package/dist/analyze/__tests__/governor-risks-detection.test.js.map +1 -1
- package/dist/analyze/__tests__/security-fls-filter.test.d.ts +2 -0
- package/dist/analyze/__tests__/security-fls-filter.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/security-fls-filter.test.js +23 -0
- package/dist/analyze/__tests__/security-fls-filter.test.js.map +1 -0
- package/dist/analyze/audit-graph.d.ts +26 -2
- package/dist/analyze/audit-graph.d.ts.map +1 -1
- package/dist/analyze/audit-graph.js +52 -5
- package/dist/analyze/audit-graph.js.map +1 -1
- package/dist/analyze/dependencies.d.ts +2 -2
- package/dist/analyze/dependencies.d.ts.map +1 -1
- package/dist/analyze/dependencies.js +9 -3
- package/dist/analyze/dependencies.js.map +1 -1
- package/dist/analyze/dependents.d.ts +6 -1
- package/dist/analyze/dependents.d.ts.map +1 -1
- package/dist/analyze/dependents.js +12 -2
- package/dist/analyze/dependents.js.map +1 -1
- package/dist/analyze/edge-filters.d.ts +37 -0
- package/dist/analyze/edge-filters.d.ts.map +1 -0
- package/dist/analyze/edge-filters.js +51 -0
- package/dist/analyze/edge-filters.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 +141 -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/analyze/populate.d.ts.map +1 -1
- package/dist/analyze/populate.js +55 -10
- package/dist/analyze/populate.js.map +1 -1
- package/dist/analyze/security.d.ts +15 -0
- package/dist/analyze/security.d.ts.map +1 -1
- package/dist/analyze/security.js +59 -3
- package/dist/analyze/security.js.map +1 -1
- package/dist/analyze/wip-impact.d.ts.map +1 -1
- package/dist/analyze/wip-impact.js +12 -2
- package/dist/analyze/wip-impact.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/metadata-category.d.ts +1 -0
- package/dist/domain/metadata-category.d.ts.map +1 -1
- package/dist/domain/metadata-category.js +1 -0
- package/dist/domain/metadata-category.js.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/embedding/embed.d.ts.map +1 -1
- package/dist/embedding/embed.js +14 -1
- package/dist/embedding/embed.js.map +1 -1
- package/dist/extractors/interfaces/metadata-source.d.ts +11 -0
- package/dist/extractors/interfaces/metadata-source.d.ts.map +1 -1
- package/dist/extractors/live-org/__tests__/bulk-retrieve.test.js.map +1 -1
- package/dist/extractors/live-org/__tests__/custom-settings.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/custom-settings.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/custom-settings.test.js +79 -0
- package/dist/extractors/live-org/__tests__/custom-settings.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/extractor-enrichment.test.js +70 -8
- package/dist/extractors/live-org/__tests__/extractor-enrichment.test.js.map +1 -1
- 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 +177 -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__/pools.test.js +4 -1
- package/dist/extractors/live-org/__tests__/pools.test.js.map +1 -1
- package/dist/extractors/live-org/__tests__/rate-limit.test.js +1 -6
- package/dist/extractors/live-org/__tests__/rate-limit.test.js.map +1 -1
- 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__/stop-waiting.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/stop-waiting.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/stop-waiting.test.js +243 -0
- package/dist/extractors/live-org/__tests__/stop-waiting.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/__tests__/watchdog-budgets.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/watchdog-budgets.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/watchdog-budgets.test.js +40 -0
- package/dist/extractors/live-org/__tests__/watchdog-budgets.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/wedge-isolation.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/wedge-isolation.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/wedge-isolation.test.js +270 -0
- package/dist/extractors/live-org/__tests__/wedge-isolation.test.js.map +1 -0
- package/dist/extractors/live-org/bulk-retrieve.d.ts +176 -0
- package/dist/extractors/live-org/bulk-retrieve.d.ts.map +1 -1
- package/dist/extractors/live-org/bulk-retrieve.js +509 -71
- package/dist/extractors/live-org/bulk-retrieve.js.map +1 -1
- package/dist/extractors/live-org/capabilities.d.ts.map +1 -1
- package/dist/extractors/live-org/capabilities.js.map +1 -1
- package/dist/extractors/live-org/extractors/__tests__/apex.test.d.ts +2 -0
- package/dist/extractors/live-org/extractors/__tests__/apex.test.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/__tests__/apex.test.js +73 -0
- package/dist/extractors/live-org/extractors/__tests__/apex.test.js.map +1 -0
- package/dist/extractors/live-org/extractors/__tests__/lwc.parallel.test.d.ts +2 -0
- package/dist/extractors/live-org/extractors/__tests__/lwc.parallel.test.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/__tests__/lwc.parallel.test.js +183 -0
- package/dist/extractors/live-org/extractors/__tests__/lwc.parallel.test.js.map +1 -0
- package/dist/extractors/live-org/extractors/apex.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/apex.js +76 -51
- package/dist/extractors/live-org/extractors/apex.js.map +1 -1
- package/dist/extractors/live-org/extractors/custom-settings.d.ts +3 -0
- package/dist/extractors/live-org/extractors/custom-settings.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/custom-settings.js +66 -0
- package/dist/extractors/live-org/extractors/custom-settings.js.map +1 -0
- package/dist/extractors/live-org/extractors/flow.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/flow.js.map +1 -1
- package/dist/extractors/live-org/extractors/generic-metadata.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/generic-metadata.js.map +1 -1
- 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 +81 -41
- package/dist/extractors/live-org/extractors/lwc.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 +118 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.js.map +1 -0
- package/dist/extractors/live-org/extractors/object.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/object.js.map +1 -1
- 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/extractors/omnistudio.d.ts +8 -1
- package/dist/extractors/live-org/extractors/omnistudio.d.ts.map +1 -1
- package/dist/extractors/live-org/extractors/omnistudio.js +59 -6
- package/dist/extractors/live-org/extractors/omnistudio.js.map +1 -1
- package/dist/extractors/live-org/rate-limit.d.ts +98 -15
- package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
- package/dist/extractors/live-org/rate-limit.js +278 -41
- 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 +49 -14
- 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__/config-values.test.d.ts +2 -0
- package/dist/ingest/__tests__/config-values.test.d.ts.map +1 -0
- package/dist/ingest/__tests__/config-values.test.js +65 -0
- package/dist/ingest/__tests__/config-values.test.js.map +1 -0
- package/dist/ingest/__tests__/full-sync-deletion.test.js +11 -4
- package/dist/ingest/__tests__/full-sync-deletion.test.js.map +1 -1
- package/dist/ingest/__tests__/live-ingest.detect-deletions-guard.test.d.ts +10 -0
- package/dist/ingest/__tests__/live-ingest.detect-deletions-guard.test.d.ts.map +1 -0
- package/dist/ingest/__tests__/live-ingest.detect-deletions-guard.test.js +251 -0
- package/dist/ingest/__tests__/live-ingest.detect-deletions-guard.test.js.map +1 -0
- package/dist/ingest/__tests__/live-ingest.test.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/__tests__/parser-dispatch.test.d.ts +2 -0
- package/dist/ingest/__tests__/parser-dispatch.test.d.ts.map +1 -0
- package/dist/ingest/__tests__/parser-dispatch.test.js +55 -0
- package/dist/ingest/__tests__/parser-dispatch.test.js.map +1 -0
- package/dist/ingest/__tests__/vlocity-dispatch-integration.test.d.ts +2 -0
- package/dist/ingest/__tests__/vlocity-dispatch-integration.test.d.ts.map +1 -0
- package/dist/ingest/__tests__/vlocity-dispatch-integration.test.js +134 -0
- package/dist/ingest/__tests__/vlocity-dispatch-integration.test.js.map +1 -0
- package/dist/ingest/detect-deletions-guard.d.ts +45 -0
- package/dist/ingest/detect-deletions-guard.d.ts.map +1 -0
- package/dist/ingest/detect-deletions-guard.js +63 -0
- package/dist/ingest/detect-deletions-guard.js.map +1 -0
- package/dist/ingest/live-ingest.d.ts +86 -0
- package/dist/ingest/live-ingest.d.ts.map +1 -1
- package/dist/ingest/live-ingest.js +783 -449
- package/dist/ingest/live-ingest.js.map +1 -1
- package/dist/parsers/__tests__/datatransform-structured.test.d.ts +2 -0
- package/dist/parsers/__tests__/datatransform-structured.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/datatransform-structured.test.js +147 -0
- package/dist/parsers/__tests__/datatransform-structured.test.js.map +1 -0
- 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 +47 -0
- package/dist/parsers/__tests__/edge-provenance.test.js.map +1 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js +78 -3
- 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__/object-inline-fields.test.js +2 -2
- package/dist/parsers/__tests__/object-inline-fields.test.js.map +1 -1
- 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__/omnistudio.golden.test.js +5 -6
- package/dist/parsers/__tests__/omnistudio.golden.test.js.map +1 -1
- 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/__tests__/vlocity.golden.test.js +9 -13
- package/dist/parsers/__tests__/vlocity.golden.test.js.map +1 -1
- package/dist/parsers/apex/__tests__/ast-extractor.test.js +64 -4
- package/dist/parsers/apex/__tests__/ast-extractor.test.js.map +1 -1
- package/dist/parsers/apex/__tests__/empty-body.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/empty-body.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/empty-body.test.js +40 -0
- package/dist/parsers/apex/__tests__/empty-body.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 +56 -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/__tests__/regex-inloop.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/regex-inloop.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/regex-inloop.test.js +70 -0
- package/dist/parsers/apex/__tests__/regex-inloop.test.js.map +1 -0
- package/dist/parsers/apex/arity-resolver.d.ts.map +1 -1
- package/dist/parsers/apex/arity-resolver.js.map +1 -1
- package/dist/parsers/apex/ast-extractor.d.ts.map +1 -1
- package/dist/parsers/apex/ast-extractor.js +33 -1
- package/dist/parsers/apex/ast-extractor.js.map +1 -1
- package/dist/parsers/apex/class.d.ts.map +1 -1
- package/dist/parsers/apex/class.js +162 -5
- package/dist/parsers/apex/class.js.map +1 -1
- package/dist/parsers/apex/trigger.d.ts.map +1 -1
- package/dist/parsers/apex/trigger.js +10 -0
- package/dist/parsers/apex/trigger.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/flow/__tests__/invocable-resolver.test.js.map +1 -1
- package/dist/parsers/flow/invocable-resolver.d.ts.map +1 -1
- package/dist/parsers/flow/invocable-resolver.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 +193 -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 +82 -3
- package/dist/parsers/lwc/html-visitor.js.map +1 -1
- package/dist/parsers/lwc/js-visitor.d.ts.map +1 -1
- package/dist/parsers/lwc/js-visitor.js +6 -2
- package/dist/parsers/lwc/js-visitor.js.map +1 -1
- package/dist/parsers/object/object.d.ts.map +1 -1
- package/dist/parsers/object/object.js +35 -5
- package/dist/parsers/object/object.js.map +1 -1
- package/dist/parsers/omnistudio/data-transform.d.ts.map +1 -1
- package/dist/parsers/omnistudio/data-transform.js +39 -6
- package/dist/parsers/omnistudio/data-transform.js.map +1 -1
- package/dist/parsers/omnistudio/integration-procedure.d.ts.map +1 -1
- package/dist/parsers/omnistudio/integration-procedure.js +3 -2
- package/dist/parsers/omnistudio/integration-procedure.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 +122 -0
- package/dist/parsers/omnistudio/overlap-detector.js.map +1 -0
- package/dist/parsers/omnistudio/process.d.ts.map +1 -1
- package/dist/parsers/omnistudio/process.js +3 -2
- package/dist/parsers/omnistudio/process.js.map +1 -1
- package/dist/parsers/omnistudio/ui-card.d.ts.map +1 -1
- package/dist/parsers/omnistudio/ui-card.js +3 -2
- package/dist/parsers/omnistudio/ui-card.js.map +1 -1
- package/dist/parsers/rules/custom-metadata-type.yml +7 -0
- package/dist/parsers/rules/custom-setting.yml +24 -0
- package/dist/parsers/vlocity/common.d.ts +16 -0
- package/dist/parsers/vlocity/common.d.ts.map +1 -1
- package/dist/parsers/vlocity/common.js +62 -0
- package/dist/parsers/vlocity/common.js.map +1 -1
- package/dist/parsers/vlocity/data-raptor.d.ts.map +1 -1
- package/dist/parsers/vlocity/data-raptor.js +43 -14
- package/dist/parsers/vlocity/data-raptor.js.map +1 -1
- 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 +126 -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 +131 -0
- package/dist/render/sarif.js.map +1 -0
- package/dist/storage/__tests__/analysis-tables-migration.test.js +1 -1
- package/dist/storage/__tests__/graph-store.test.js +13 -0
- package/dist/storage/__tests__/graph-store.test.js.map +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/__tests__/sync-generation.test.d.ts +2 -0
- package/dist/storage/__tests__/sync-generation.test.d.ts.map +1 -0
- package/dist/storage/__tests__/sync-generation.test.js +159 -0
- package/dist/storage/__tests__/sync-generation.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 +60 -0
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.d.ts +21 -1
- package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.js +86 -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 +38 -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 +92 -0
- package/dist/storage/sqlite/rename-stability.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import JSZip from "jszip";
|
|
3
|
+
import { METADATA_CATEGORY } from "../../../domain/index.js";
|
|
4
|
+
import { withTimeout } from "../rate-limit.js";
|
|
5
|
+
/**
|
|
6
|
+
* OmniStudio-on-Core retrieval via Metadata API `retrieve()` rather than
|
|
7
|
+
* SOQL on the standard SObjects. SOQL gives you `OmniProcess.PropertySet`
|
|
8
|
+
* and `OmniProcessElement.PropertySet` as JSON blobs — useful, but the
|
|
9
|
+
* platform omits design-time XML constructs that only the Metadata API
|
|
10
|
+
* envelope carries (conditional branches inside IPs, layout config on
|
|
11
|
+
* UI cards, embedded server-script references on DataTransforms).
|
|
12
|
+
*
|
|
13
|
+
* This extractor runs **alongside** the SOQL path rather than replacing
|
|
14
|
+
* it: SOQL has lower latency for "what processes exist + their element
|
|
15
|
+
* graph"; retrieve() has higher fidelity for "what does this process
|
|
16
|
+
* actually do." Parsers can choose which input to consume per use case.
|
|
17
|
+
*
|
|
18
|
+
* Constraints, all from W2-02's research:
|
|
19
|
+
* - Metadata API has a documented org-wide quota of 10,000 retrieve
|
|
20
|
+
* calls per 24h. We track the response's `Sforce-Limit-Info` header
|
|
21
|
+
* when available and bail out at 90% utilisation rather than blow
|
|
22
|
+
* the budget on a single ingest.
|
|
23
|
+
* - retrieve() is async — call returns a locator with an async process
|
|
24
|
+
* ID; we poll via `checkRetrieveStatus`. jsforce's
|
|
25
|
+
* `RetrieveResultLocator.complete()` wraps the polling loop.
|
|
26
|
+
* - `package.xml` can list up to 5,000 components per call. Our types
|
|
27
|
+
* are wildcards (`<members>*</members>`), which DOES count against
|
|
28
|
+
* the cap if the org has 5k+ of any one type — chunk by listing
|
|
29
|
+
* first and slicing.
|
|
30
|
+
*
|
|
31
|
+
* Capability-gated by `caps.omnistudioOncore`; the caller (bulk-retrieve)
|
|
32
|
+
* additionally gates on the opt-in `enableOmnistudioRetrieve` flag from
|
|
33
|
+
* LiveIngestOpts.
|
|
34
|
+
*/
|
|
35
|
+
/** OmniStudio-on-Core Metadata API type names. These differ from the
|
|
36
|
+
* Vlocity DataPack type vocabulary — the cross-flavor resolver and
|
|
37
|
+
* overlap detector understand both. */
|
|
38
|
+
const RETRIEVE_TYPES = ["OmniUiCard", "OmniIntegrationProcedure", "OmniDataTransform"];
|
|
39
|
+
/** Polling cadence for `retrieve()` job status. Salesforce typically
|
|
40
|
+
* finishes within 5-15s for small types; aggressive polling burns
|
|
41
|
+
* rate-limit headroom for no value. */
|
|
42
|
+
const POLL_INTERVAL_MS = 3_000;
|
|
43
|
+
/** Hard ceiling on per-retrieve wall time. Large orgs (5k+ components
|
|
44
|
+
* of a single type) legitimately take 60-90s; the bisection / quota
|
|
45
|
+
* guard handles the catastrophic case. */
|
|
46
|
+
const RETRIEVE_TIMEOUT_MS = 180_000;
|
|
47
|
+
/** Conservative quota utilisation threshold. When usage exceeds this
|
|
48
|
+
* fraction of the daily 10k limit, skip remaining retrieves and
|
|
49
|
+
* surface a warning. Leaves headroom for downstream operations. */
|
|
50
|
+
const QUOTA_SKIP_THRESHOLD = 0.9;
|
|
51
|
+
/** Parse the `Sforce-Limit-Info` header which Salesforce attaches to most
|
|
52
|
+
* REST/SOAP responses: `api-usage=12345/15000`. Returns null if absent
|
|
53
|
+
* or malformed — caller assumes "enough quota" in that case rather
|
|
54
|
+
* than refusing to proceed. */
|
|
55
|
+
function parseLimitInfo(header) {
|
|
56
|
+
if (!header)
|
|
57
|
+
return null;
|
|
58
|
+
const m = header.match(/api-usage=(\d+)\/(\d+)/);
|
|
59
|
+
if (!m)
|
|
60
|
+
return null;
|
|
61
|
+
const current = Number.parseInt(m[1] ?? "", 10);
|
|
62
|
+
const limit = Number.parseInt(m[2] ?? "", 10);
|
|
63
|
+
if (!Number.isFinite(current) || !Number.isFinite(limit) || limit <= 0)
|
|
64
|
+
return null;
|
|
65
|
+
return { current, limit };
|
|
66
|
+
}
|
|
67
|
+
/** Decide whether to skip a retrieve based on current quota utilisation.
|
|
68
|
+
* Conservative: when in doubt (no limit info available) we proceed. */
|
|
69
|
+
export function shouldSkipForQuota(limit) {
|
|
70
|
+
if (!limit)
|
|
71
|
+
return false;
|
|
72
|
+
return limit.current / limit.limit >= QUOTA_SKIP_THRESHOLD;
|
|
73
|
+
}
|
|
74
|
+
/** Yield one RawMember per file extracted from the retrieve zip. The
|
|
75
|
+
* `category` is set to OMNI_PROCESS uniformly — the parser layer
|
|
76
|
+
* discriminates on the file path / XML root element. */
|
|
77
|
+
async function* yieldFromZip(zipBase64, orgId, type) {
|
|
78
|
+
const buf = Buffer.from(zipBase64, "base64");
|
|
79
|
+
const zip = await JSZip.loadAsync(buf);
|
|
80
|
+
for (const [path, file] of Object.entries(zip.files)) {
|
|
81
|
+
if (file.dir)
|
|
82
|
+
continue;
|
|
83
|
+
// Skip the manifest file — it's metadata about the retrieve, not a
|
|
84
|
+
// component definition. Path looks like `unpackaged/package.xml`.
|
|
85
|
+
if (path.endsWith("/package.xml") || path === "package.xml")
|
|
86
|
+
continue;
|
|
87
|
+
// Each file is `unpackaged/<typeFolder>/<name>.<ext>`. The parsed
|
|
88
|
+
// name is just the file basename without extension.
|
|
89
|
+
const segments = path.split("/");
|
|
90
|
+
const filename = segments[segments.length - 1] ?? path;
|
|
91
|
+
const memberName = filename.replace(/\.[^.]+$/, "");
|
|
92
|
+
const content = await file.async("string");
|
|
93
|
+
yield {
|
|
94
|
+
ref: {
|
|
95
|
+
category: METADATA_CATEGORY.OMNI_PROCESS,
|
|
96
|
+
memberType: type,
|
|
97
|
+
memberName,
|
|
98
|
+
lastModifiedAt: "",
|
|
99
|
+
sourceUri: `sf://${orgId}/${type}/${memberName}.xml`,
|
|
100
|
+
namespace: null,
|
|
101
|
+
},
|
|
102
|
+
content,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Async iterator yielding XML envelopes for OmniStudio-on-Core types via
|
|
108
|
+
* Metadata API `retrieve()`. Falls back silently (yields nothing) on
|
|
109
|
+
* orgs without the capability or when quota would be exhausted.
|
|
110
|
+
*/
|
|
111
|
+
export async function* iterOmnistudioRetrieve(conn, orgId, opts) {
|
|
112
|
+
// Check quota up-front (single call to limits endpoint via REST). If the
|
|
113
|
+
// helper isn't available we proceed and let per-call failures surface.
|
|
114
|
+
let limit = null;
|
|
115
|
+
try {
|
|
116
|
+
const limitInfo = conn._sforceLimitInfo;
|
|
117
|
+
limit = parseLimitInfo(limitInfo);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// jsforce holds the most-recent limit header on the conn after any
|
|
121
|
+
// call; if no calls have happened yet, we have no signal and proceed.
|
|
122
|
+
}
|
|
123
|
+
if (shouldSkipForQuota(limit)) {
|
|
124
|
+
opts.onError?.("omnistudio-retrieve:quota-guard", new Error(`metadata API quota at ${limit?.current}/${limit?.limit} (>=${QUOTA_SKIP_THRESHOLD * 100}%) — skipping retrieve()`));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const type of RETRIEVE_TYPES) {
|
|
128
|
+
const label = `omnistudio-retrieve:${type}`;
|
|
129
|
+
try {
|
|
130
|
+
const request = {
|
|
131
|
+
apiVersion: opts.apiVersion,
|
|
132
|
+
unpackaged: {
|
|
133
|
+
types: [{ name: type, members: ["*"] }],
|
|
134
|
+
version: opts.apiVersion,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
const locator = conn.metadata.retrieve(request);
|
|
138
|
+
const result = (await withTimeout(locator.complete({ details: false }), RETRIEVE_TIMEOUT_MS, label));
|
|
139
|
+
if (result.status && result.status !== "Succeeded") {
|
|
140
|
+
opts.onError?.(label, new Error(`retrieve() status=${result.status} ${result.errorMessage ?? ""}`));
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!result.zipFile) {
|
|
144
|
+
opts.onError?.(label, new Error("retrieve() returned no zipFile"));
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
for await (const member of yieldFromZip(result.zipFile, orgId, type)) {
|
|
148
|
+
yield member;
|
|
149
|
+
}
|
|
150
|
+
// Re-check quota between types — a single retrieve can return
|
|
151
|
+
// thousands of components and shift utilisation significantly.
|
|
152
|
+
const nextLimit = (() => {
|
|
153
|
+
try {
|
|
154
|
+
return parseLimitInfo(conn._sforceLimitInfo);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
})();
|
|
160
|
+
if (shouldSkipForQuota(nextLimit)) {
|
|
161
|
+
opts.onError?.("omnistudio-retrieve:quota-guard", new Error(`metadata API quota crossed ${QUOTA_SKIP_THRESHOLD * 100}% after ${type} — skipping remaining types`));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
opts.onError?.(label, e);
|
|
167
|
+
// continue to next type — one type failing (e.g. permission gap on
|
|
168
|
+
// OmniUiCard) shouldn't disable retrieval of the other two.
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=omnistudio-retrieve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnistudio-retrieve.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio-retrieve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import type { RawMember } from "../../interfaces/metadata-source.js";
|
|
2
|
-
export
|
|
2
|
+
export interface IterOmnistudioOpts {
|
|
3
|
+
/** Member types to skip on the SOQL path. Used by bulk-retrieve to avoid
|
|
4
|
+
* double-ingesting types the Metadata-API retrieve path already covers
|
|
5
|
+
* with higher fidelity (OmniDataTransform, OmniUiCard) when
|
|
6
|
+
* enableOmnistudioRetrieve is on. */
|
|
7
|
+
skipTypes?: Set<string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function iterOmnistudio(conn: any, opts?: IterOmnistudioOpts): AsyncIterable<RawMember>;
|
|
3
10
|
//# sourceMappingURL=omnistudio.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnistudio.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"omnistudio.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AA+JrE,MAAM,WAAW,kBAAkB;IACjC;;;0CAGsC;IACtC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,wBAAuB,cAAc,CACnC,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,kBAAuB,GAC5B,aAAa,CAAC,SAAS,CAAC,CAsF1B"}
|
|
@@ -16,6 +16,7 @@ const QUERIES = [
|
|
|
16
16
|
memberType: "OmniDataTransform",
|
|
17
17
|
category: METADATA_CATEGORY.OMNI_DATA_TRANSFORM,
|
|
18
18
|
soql: "SELECT Id, Name, LastModifiedDate FROM OmniDataTransform",
|
|
19
|
+
fetchItems: true,
|
|
19
20
|
},
|
|
20
21
|
{
|
|
21
22
|
memberType: "OmniUiCard",
|
|
@@ -71,7 +72,45 @@ async function fetchElementsByProcess(conn, processIds) {
|
|
|
71
72
|
}
|
|
72
73
|
return byProcess;
|
|
73
74
|
}
|
|
74
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Fetch every OmniDataTransformItem mapping row for the given transform Ids,
|
|
77
|
+
* grouped by OmniDataTransformationId. These rows carry the structured
|
|
78
|
+
* field mappings (InputObjectName/InputFieldName, Output*, Lookup*) that
|
|
79
|
+
* the OmniDataTransform parser turns into DR_READS_FIELD / DR_WRITES_FIELD
|
|
80
|
+
* edges. Wrapped in its own try/catch per chunk so field-name drift on a
|
|
81
|
+
* newer org version degrades to "no items" with a breadcrumb, never a
|
|
82
|
+
* failed source.
|
|
83
|
+
*/
|
|
84
|
+
async function fetchItemsByTransform(conn, transformIds) {
|
|
85
|
+
const byTransform = new Map();
|
|
86
|
+
if (transformIds.length === 0)
|
|
87
|
+
return byTransform;
|
|
88
|
+
const CHUNK = 200;
|
|
89
|
+
for (let i = 0; i < transformIds.length; i += CHUNK) {
|
|
90
|
+
const slice = transformIds.slice(i, i + CHUNK);
|
|
91
|
+
const idList = slice.map((id) => `'${id.replace(/'/g, "\\'")}'`).join(",");
|
|
92
|
+
const ITEM_FIELDS = "Id, Name, InputObjectName, InputFieldName, OutputObjectName, OutputFieldName, LookupObjectName, LookupByFieldName, FilterValue, FilterOperator, OmniDataTransformationId";
|
|
93
|
+
const soql = `SELECT ${ITEM_FIELDS} FROM OmniDataTransformItem WHERE OmniDataTransformationId IN (${idList})`;
|
|
94
|
+
let res = null;
|
|
95
|
+
try {
|
|
96
|
+
res = (await scheduleData(() => soqlWithTimeout(conn.query(soql), "data OmniDataTransformItem")));
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
console.log(`ingest: omnistudio item query failed for OmniDataTransformItem: ${e.message?.slice(0, 200) ?? String(e)}`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const r of res?.records ?? []) {
|
|
103
|
+
const parentId = String(r.OmniDataTransformationId ?? "");
|
|
104
|
+
if (!parentId)
|
|
105
|
+
continue;
|
|
106
|
+
const arr = byTransform.get(parentId) ?? [];
|
|
107
|
+
arr.push(r);
|
|
108
|
+
byTransform.set(parentId, arr);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return byTransform;
|
|
112
|
+
}
|
|
113
|
+
export async function* iterOmnistudio(conn, opts = {}) {
|
|
75
114
|
// Fire all 4 Tooling SOQL queries in parallel — they're independent and
|
|
76
115
|
// the Tooling pool throttles concurrency.
|
|
77
116
|
// Each mapped task wraps scheduleQuery in try/catch so allSettled is
|
|
@@ -82,7 +121,8 @@ export async function* iterOmnistudio(conn) {
|
|
|
82
121
|
// how capabilities.ts detects them). They are NOT Tooling objects, so
|
|
83
122
|
// routing through `conn.tooling.query` silently returned zero rows on
|
|
84
123
|
// orgs that actually had data. Use regular SOQL via the data pool.
|
|
85
|
-
const
|
|
124
|
+
const activeQueries = QUERIES.filter((q) => !opts.skipTypes?.has(q.memberType));
|
|
125
|
+
const settled = await Promise.allSettled(activeQueries.map(async (q) => {
|
|
86
126
|
try {
|
|
87
127
|
const res = (await scheduleData(() => soqlWithTimeout(conn.query(q.soql), `data ${q.memberType}`)));
|
|
88
128
|
return { q, res, err: null };
|
|
@@ -110,20 +150,33 @@ export async function* iterOmnistudio(conn) {
|
|
|
110
150
|
// pass those edges never get emitted (parent-only rows have no nested
|
|
111
151
|
// configuration to walk).
|
|
112
152
|
const parentIds = [];
|
|
153
|
+
const transformIds = [];
|
|
113
154
|
for (const { q, res } of results) {
|
|
114
|
-
if (!q.fetchElements)
|
|
155
|
+
if (!q.fetchElements && !q.fetchItems)
|
|
115
156
|
continue;
|
|
116
157
|
for (const r of res?.records ?? []) {
|
|
117
|
-
if (r.Id)
|
|
158
|
+
if (!r.Id)
|
|
159
|
+
continue;
|
|
160
|
+
if (q.fetchElements)
|
|
118
161
|
parentIds.push(String(r.Id));
|
|
162
|
+
if (q.fetchItems)
|
|
163
|
+
transformIds.push(String(r.Id));
|
|
119
164
|
}
|
|
120
165
|
}
|
|
121
|
-
const elementsByProcess = await
|
|
166
|
+
const [elementsByProcess, itemsByTransform] = await Promise.all([
|
|
167
|
+
fetchElementsByProcess(conn, parentIds),
|
|
168
|
+
fetchItemsByTransform(conn, transformIds),
|
|
169
|
+
]);
|
|
122
170
|
for (const { q, res } of results) {
|
|
123
171
|
for (const r of res?.records ?? []) {
|
|
124
172
|
const name = String(r.DeveloperName ?? r.Name ?? r.Id ?? "");
|
|
125
173
|
const elements = q.fetchElements && r.Id ? (elementsByProcess.get(String(r.Id)) ?? []) : [];
|
|
126
|
-
const
|
|
174
|
+
const items = q.fetchItems && r.Id ? (itemsByTransform.get(String(r.Id)) ?? []) : [];
|
|
175
|
+
let enriched = r;
|
|
176
|
+
if (elements.length > 0)
|
|
177
|
+
enriched = { ...enriched, elements };
|
|
178
|
+
if (items.length > 0)
|
|
179
|
+
enriched = { ...enriched, items };
|
|
127
180
|
yield {
|
|
128
181
|
ref: {
|
|
129
182
|
category: q.category,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnistudio.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"omnistudio.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAkCjE,uEAAuE;AACvE,4EAA4E;AAC5E,sEAAsE;AACtE,wEAAwE;AACxE,+BAA+B;AAC/B,MAAM,OAAO,GAAa;IACxB;QACE,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,iBAAiB,CAAC,YAAY;QACxC,IAAI,EAAE,oDAAoD;QAC1D,aAAa,EAAE,IAAI;KACpB;IACD;QACE,UAAU,EAAE,mBAAmB;QAC/B,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB;QAC/C,IAAI,EAAE,0DAA0D;QAChE,UAAU,EAAE,IAAI;KACjB;IACD;QACE,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,iBAAiB,CAAC,YAAY;QACxC,IAAI,EAAE,mDAAmD;KAC1D;CACF,CAAC;AAEF;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CACnC,IAAS,EACT,UAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAGtB,CAAC;IACJ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,wDAAwD;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,qIAAqI,MAAM,GAAG,CAAC;QAC5J,sEAAsE;QACtE,0EAA0E;QAC1E,IAAI,GAAG,GAAuC,IAAI,CAAC;QACnD,IAAI,CAAC;YACH,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,CAC7B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAC7D,CAEO,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,CAAC,aAAa;gBAAE,SAAS;YAC/B,IAAI,WAAW,GAAY,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,IAAI,CAAC;oBACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACxC,CAAC;YACH,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC1B,WAAW;gBACX,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;aACrB,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,qBAAqB,CAClC,IAAS,EACT,YAAsB;IAEtB,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0C,CAAC;IACtE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,MAAM,WAAW,GACf,0KAA0K,CAAC;QAC7K,MAAM,IAAI,GAAG,UAAU,WAAW,kEAAkE,MAAM,GAAG,CAAC;QAC9G,IAAI,GAAG,GAAwD,IAAI,CAAC;QACpE,IAAI,CAAC;YACH,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,CAC7B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,4BAA4B,CAAC,CAChE,CAAwD,CAAC;QAC5D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CACT,qEAAsE,CAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CACxH,CAAC;YACF,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAUD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,IAAS,EACT,OAA2B,EAAE;IAE7B,wEAAwE;IACxE,0CAA0C;IAC1C,qEAAqE;IACrE,qEAAqE;IACrE,sEAAsE;IACtE,wEAAwE;IACxE,0EAA0E;IAC1E,sEAAsE;IACtE,sEAAsE;IACtE,mEAAmE;IACnE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,CACnC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC,CAC5D,CAEO,CAAC;YACT,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAoB,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAU,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,MAAM,OAAO,GAAG,OAAO;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACvD,MAAM,CACL,CAAC,CAAC,EAA2E,EAAE,CAAC,CAAC,KAAK,IAAI,CAC3F,CAAC;IAEJ,sEAAsE;IACtE,uEAAuE;IACvE,oEAAoE;IACpE,yDAAyD;IACzD,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CACT,yCAAyC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CACtG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,yEAAyE;IACzE,wEAAwE;IACxE,wEAAwE;IACxE,sEAAsE;IACtE,0BAA0B;IAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,UAAU;YAAE,SAAS;QAChD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,SAAS;YACpB,IAAI,CAAC,CAAC,aAAa;gBAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,UAAU;gBAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC;QACvC,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC;KAC1C,CAAC,CAAC;IAEH,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,IAAI,QAAQ,GAA4B,CAAC,CAAC;YAC1C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC;YACxD,MAAM;gBACJ,GAAG,EAAE;oBACH,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,UAAU,EAAE,IAAI;oBAChB,cAAc,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;oBAC1C,SAAS,EAAE,mBAAmB,CAAC,CAAC,UAAU,IAAI,IAAI,EAAE;oBACpD,SAAS,EAAE,IAAI;iBAChB;gBACD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,33 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import Bottleneck from "bottleneck";
|
|
2
3
|
/** Cap concurrent query invocations against a single org connection. */
|
|
3
4
|
export declare const queryLimit: import("p-limit").LimitFunction;
|
|
5
|
+
/** Mutable cell observed by every rate-limit wrapper. The merger (W1.5-02)
|
|
6
|
+
* flips `.value = true` to instruct callers to abandon the current await.
|
|
7
|
+
* Compatible with `BackgroundWedgeEntry.stopWaitingRef` (same shape). */
|
|
8
|
+
export interface StopSignal {
|
|
9
|
+
value: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Typed sentinel surfaced by the rate-limit wrappers when a stop-signal
|
|
12
|
+
* is observed mid-race. Distinct from a real timeout so callers (e.g. the
|
|
13
|
+
* late-drain loop in bulk-retrieve.ts) can branch on the kind of failure.
|
|
14
|
+
*
|
|
15
|
+
* This is a voluntary stop on the caller side — it is NOT a wedge, and it
|
|
16
|
+
* is NOT proof that the underlying HTTP request was cancelled (see
|
|
17
|
+
* socket-leak limitation above). */
|
|
18
|
+
export declare class StopWaitingError extends Error {
|
|
19
|
+
readonly stopWaiting: true;
|
|
20
|
+
constructor(label: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* AsyncLocalStorage context channel — the merger's `failSoft` wrapper
|
|
24
|
+
* `.run()`s the body inside `stopSignalContext.run(stopSignal, ...)` so any
|
|
25
|
+
* downstream call into a rate-limit wrapper that did not receive an
|
|
26
|
+
* explicit stopSignal can still pick one up. Tradeoff: implicit, but the
|
|
27
|
+
* alternative is threading a new optional param through every extractor
|
|
28
|
+
* signature (~13 files). Documented as a deviation in the W1.5-03 SUMMARY.
|
|
29
|
+
*/
|
|
30
|
+
export declare const stopSignalContext: AsyncLocalStorage<StopSignal>;
|
|
4
31
|
/**
|
|
5
32
|
* Hard upper bound on a single jsforce call. Used to wrap metadata.list /
|
|
6
33
|
* metadata.read calls in extractors so a Salesforce-side stall can't park
|
|
@@ -8,8 +35,14 @@ export declare const queryLimit: import("p-limit").LimitFunction;
|
|
|
8
35
|
* Rejects with a descriptive error after `ms`; the failSoft wrapper one
|
|
9
36
|
* level up surfaces it as a skip. The underlying jsforce HTTP request may
|
|
10
37
|
* continue until libuv tears it down — we just stop waiting.
|
|
38
|
+
*
|
|
39
|
+
* Phase 1.5 W1.5-03: accepts an optional `stopSignal` cell. When the cell's
|
|
40
|
+
* `.value` flips to `true` mid-race, the timer is cleared and the returned
|
|
41
|
+
* promise rejects with `StopWaitingError`. The underlying jsforce request
|
|
42
|
+
* is NOT cancelled — see the socket-leak limitation block at the top of
|
|
43
|
+
* this file.
|
|
11
44
|
*/
|
|
12
|
-
export declare function withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T>;
|
|
45
|
+
export declare function withTimeout<T>(p: Promise<T>, ms: number, label: string, stopSignal?: StopSignal): Promise<T>;
|
|
13
46
|
/** Per-call ceilings — kept here so all extractors apply them consistently.
|
|
14
47
|
* Read timeout raised 45s -> 120s. A single metadata.read of a heavy
|
|
15
48
|
* Profile / Layout / Workflow legitimately takes 60-90s on production orgs;
|
|
@@ -35,7 +68,21 @@ export declare const METADATA_DESCRIBE_TIMEOUT_MS = 60000;
|
|
|
35
68
|
* with a SOQL-flavoured withTimeout. Centralizes the timeout value so
|
|
36
69
|
* callers don't drift; centralizes the label format so failures are
|
|
37
70
|
* greppable. */
|
|
38
|
-
export declare function soqlWithTimeout<T>(p: Promise<T>, label: string, ms?: number): Promise<T>;
|
|
71
|
+
export declare function soqlWithTimeout<T>(p: Promise<T>, label: string, ms?: number, stopSignal?: StopSignal): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Maximum items per `metadata.read` Salesforce SOAP call. The platform docs
|
|
74
|
+
* cap this at 10 — passing more makes jsforce either error or silently
|
|
75
|
+
* truncate depending on version. Most callers already hand-chunk at 10
|
|
76
|
+
* (see extractors/generic-metadata, flow, integration); this constant
|
|
77
|
+
* centralises that value and lets readMetadataBatchAdaptive enforce it
|
|
78
|
+
* defensively for callers that don't.
|
|
79
|
+
*
|
|
80
|
+
* NOTE: The Salesforce Composite REST API allows 25 subrequests per call,
|
|
81
|
+
* but that's a different API (REST, not SOAP Metadata) which sfgraph does
|
|
82
|
+
* not currently use. Don't conflate the two — bumping this to 25 against
|
|
83
|
+
* the Metadata SOAP path is silently broken on real orgs.
|
|
84
|
+
*/
|
|
85
|
+
export declare const METADATA_READ_BATCH_SIZE: number;
|
|
39
86
|
export declare function readMetadataBatchAdaptive<TItem extends {
|
|
40
87
|
fullName: string;
|
|
41
88
|
}>(conn: {
|
|
@@ -55,9 +102,9 @@ export interface RateLimitPools {
|
|
|
55
102
|
toolingPool: Bottleneck;
|
|
56
103
|
metadataPool: Bottleneck;
|
|
57
104
|
dataPool: Bottleneck;
|
|
58
|
-
scheduleQuery<T>(fn: () => Promise<T
|
|
59
|
-
scheduleMetadata<T>(fn: () => Promise<T
|
|
60
|
-
scheduleData<T>(fn: () => Promise<T
|
|
105
|
+
scheduleQuery<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
106
|
+
scheduleMetadata<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
107
|
+
scheduleData<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
61
108
|
}
|
|
62
109
|
/**
|
|
63
110
|
* Per-pool concurrency overrides. Each value, when provided, replaces the
|
|
@@ -80,13 +127,6 @@ export declare const DEFAULT_POOL_CONCURRENCY: {
|
|
|
80
127
|
readonly metadata: 10;
|
|
81
128
|
readonly data: 10;
|
|
82
129
|
};
|
|
83
|
-
/**
|
|
84
|
-
* Build a fresh independent {@link RateLimitPools} set. Each pool has its own
|
|
85
|
-
* Bottleneck reservoir, so two pool sets do not contend for budget.
|
|
86
|
-
*
|
|
87
|
-
* Concurrency resolution order: explicit `overrides` arg > `SFGRAPH_*_POOL`
|
|
88
|
-
* env vars > {@link DEFAULT_POOL_CONCURRENCY}.
|
|
89
|
-
*/
|
|
90
130
|
export declare function createRateLimitPools(overrides?: PoolConcurrencyOverrides): RateLimitPools;
|
|
91
131
|
export declare const toolingPool: Bottleneck;
|
|
92
132
|
export declare const metadataPool: Bottleneck;
|
|
@@ -98,11 +138,11 @@ export declare const dataPool: Bottleneck;
|
|
|
98
138
|
*/
|
|
99
139
|
export declare const limiter: Bottleneck;
|
|
100
140
|
/** Helper that runs a single SOQL/Tooling callable through both gates. */
|
|
101
|
-
export declare function scheduleQuery<T>(fn: () => Promise<T
|
|
141
|
+
export declare function scheduleQuery<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
102
142
|
/** Schedule a Metadata API call (list/read/retrieve/deploy). */
|
|
103
|
-
export declare function scheduleMetadata<T>(fn: () => Promise<T
|
|
143
|
+
export declare function scheduleMetadata<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
104
144
|
/** Schedule a SObject SOQL / Bulk query (Vlocity, CMDT, generic records). */
|
|
105
|
-
export declare function scheduleData<T>(fn: () => Promise<T
|
|
145
|
+
export declare function scheduleData<T>(fn: () => Promise<T>, stopSignal?: StopSignal): Promise<T>;
|
|
106
146
|
/**
|
|
107
147
|
* Mutate the *default* (process-level) pools' concurrency caps at runtime.
|
|
108
148
|
* Used by the CLI when `--tooling-pool` / `--metadata-pool` / `--data-pool`
|
|
@@ -113,6 +153,49 @@ export declare function scheduleData<T>(fn: () => Promise<T>): Promise<T>;
|
|
|
113
153
|
* Returns the concurrency caps actually applied (after merging defaults +
|
|
114
154
|
* env vars + overrides), so callers can log what the user got.
|
|
115
155
|
*/
|
|
156
|
+
export interface SoqlRebatchOpts<TRecord> {
|
|
157
|
+
/** Quoted, comma-joined ID list. The caller has already escaped each id. */
|
|
158
|
+
ids: string[];
|
|
159
|
+
/** SOQL template containing `${IDS}` exactly once — replaced with the
|
|
160
|
+
* quoted, comma-joined list at execution time. */
|
|
161
|
+
template: string;
|
|
162
|
+
/** Greppable label for timeouts + warning messages. */
|
|
163
|
+
label: string;
|
|
164
|
+
/** Maximum IDs per request before the helper pre-splits. Default 300 —
|
|
165
|
+
* conservative below the documented SOQL `IN()` 4000 cap but above the
|
|
166
|
+
* 200 most extractors hand-chunked at. */
|
|
167
|
+
rebatchAt?: number;
|
|
168
|
+
/** Maximum recursive split depth before giving up on a slice. Default 6 —
|
|
169
|
+
* enough to cover (300 × 2^6 = 19200) IDs in a single starting batch. */
|
|
170
|
+
maxDepth?: number;
|
|
171
|
+
/**
|
|
172
|
+
* Pool to schedule each individual SOQL call through. Defaults to the
|
|
173
|
+
* Tooling pool; pass `scheduleQuery`/`scheduleData` for non-Tooling
|
|
174
|
+
* paths. The helper does NOT pick a pool based on the SOQL itself —
|
|
175
|
+
* staying explicit avoids "this call went to the wrong pool, why is
|
|
176
|
+
* Tooling starved" surprises.
|
|
177
|
+
*/
|
|
178
|
+
scheduler?: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
179
|
+
/** Per-call timeout label override. Defaults to SOQL_TIMEOUT_MS. */
|
|
180
|
+
timeoutMs?: number;
|
|
181
|
+
/** Function that runs the actual SOQL on the right API surface
|
|
182
|
+
* (`conn.tooling.query` or `conn.query`). Returning a value with a
|
|
183
|
+
* `records` array is required. */
|
|
184
|
+
runner: (soql: string) => Promise<{
|
|
185
|
+
records?: TRecord[];
|
|
186
|
+
}>;
|
|
187
|
+
}
|
|
188
|
+
/** Detect errors that should trigger a smaller-batch retry rather than
|
|
189
|
+
* failing the whole call. Tries the canonical jsforce error shape first
|
|
190
|
+
* (`statusCode` / `errorCode`) then falls back to message matching. */
|
|
191
|
+
export declare function isRebatchableSoqlError(err: unknown): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Execute `template` against `ids`, splitting the ID set on a rebatchable
|
|
194
|
+
* error or when it exceeds `rebatchAt`. Returns the merged record set.
|
|
195
|
+
* Throws only on non-rebatchable errors (the caller's existing failSoft /
|
|
196
|
+
* onError plumbing handles those).
|
|
197
|
+
*/
|
|
198
|
+
export declare function runSoqlInRebatchable<TRecord>(opts: SoqlRebatchOpts<TRecord>): Promise<TRecord[]>;
|
|
116
199
|
export declare function configureDefaultPools(overrides?: PoolConcurrencyOverrides): Promise<{
|
|
117
200
|
tooling: number;
|
|
118
201
|
metadata: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,wEAAwE;AACxE,eAAO,MAAM,UAAU,iCAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"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"}
|