@simplysf/simply-aep-core
v0.4.0
Published
Apex Enterprise Patterns (fflib, force-di, AT4DX) scan and resolution logic — the library layer behind @simplysf/simply-aep, published separately for direct consumption (e.g. editor tooling) without the CLI framework
Readme
@simplysf/simply-aep-core
Apex Enterprise Patterns (fflib, force-di, AT4DX) binding scan and resolution logic. This is not a Salesforce CLI plugin — it's the library layer behind @simplysf/simply-aep's sf simply aep at4dx ... commands, published separately so it can be imported directly by anything that wants the same data (an editor extension, a CI check, a script) without pulling in the CLI framework.
Unlike the other internal libraries in this monorepo (@simplysf/simply-core, @simplysf/simply-plugin-kit, @simplysf/simply-report), this package is meant to be depended on by projects outside this repo, not only by other simply-* packages.
Install
npm install @simplysf/simply-aep-coreRequires Node.js >=22 and either "type": "module" or a dynamic import() — this package ships ESM only.
API
Everything below is exported from the package root. Removing or renaming an export is a breaking change; see src/index.ts.
AT4DX Application Factory bindings
The four ApplicationFactory_{Service,Selector,Domain,UnitOfWork}Binding__mdt Custom Metadata Types — "which class implements interface/SObject X" — resolved down to which record wins per key. See simply-aep's design doc for the resolution rules this ports from AT4DX's own di_Module subclasses.
| Export | Description |
| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| scanOrgBindings(connection, types) | Queries a live org (plain REST, no Tooling API) for the requested binding types. |
| scanLocalBindings(sourceDirs, types) | Scans local Salesforce DX source directories for the same data, parsing CustomMetadata component XML directly. |
| resolveBindings(records) | Pure function: applies AT4DX's per-type resolution rules (priority ordering, Domain ambiguity, UnitOfWork ordering). |
| bindingTypeForLocalObjectName(name) | Maps a local CustomMetadata component's object half back to a BindingType. |
| ALL_BINDING_TYPES, AT4DX_BINDING_OBJECTS, AT4DX_BINDING_LOCAL_OBJECT_NAMES, BINDING_TYPE_BY_FLAG | Constants mapping BindingType to its Custom Metadata Type API name, local object name, and CLI flag spelling. |
| AepConnection | The minimal connection shape scanOrgBindings needs (autoFetchQuery, getUsername) — accept this instead of a full @salesforce/core Connection if you're constructing one yourself. |
| At4dxBindingRow, RawBindingRecord, At4dxBindingListResult, BindingType, BindingTypeFlag | Types for the row shapes above. |
import { scanOrgBindings, resolveBindings, ALL_BINDING_TYPES } from '@simplysf/simply-aep-core';
const { records, missingTypes } = await scanOrgBindings(connection, ALL_BINDING_TYPES);
const rows = resolveBindings(records);
// rows[n].effective tells you which record AT4DX actually resolves to for that binding keyAT4DX domain-process (trigger routing) bindings
DomainProcessBinding__mdt — AT4DX's Trigger Action Framework metadata wiring an SObject's trigger events to ordered criteria/action Apex classes. See simply-aep's design doc for the resolution model.
| Export | Description |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| scanOrgDomainProcessBindings(connection) | Queries a live org for DomainProcessBinding__mdt records. |
| scanLocalDomainProcessBindings(sourceDirs) | Scans local DX source for the same data. |
| resolveDomainProcessBindings(records) | Pure function: orders bindings per SObject/process context by execution order. |
| validateDomainProcessBindings(records, diagnostics) | Pure function: checks a scan's records/diagnostics for order collisions, dead bindings, duplicate DeveloperNames, and SObject-reference problems. See design doc 0010. |
| ALL_TRIGGER_OPERATIONS, DOMAIN_PROCESS_BINDING_OBJECT, DOMAIN_PROCESS_BINDING_LOCAL_OBJECT_NAME | Constants for the Custom Metadata Type's API name, local object name, and trigger operation values. |
| DomainProcessBindingRow, RawDomainProcessBindingRecord, At4dxDomainProcessBindingListResult, DomainProcessType, ProcessContext, TriggerOperation | Types for the row shapes above. |
| DomainProcessBindingIssue, DomainProcessBindingIssueRule, DomainProcessBindingIssueSeverity, At4dxDomainProcessBindingValidateResult | Types for validateDomainProcessBindings's output. |
| MalformedDomainProcessBindingRecord, AmbiguousDomainProcessBindingRecord | The diagnostics a scan reports alongside records — pass both to validateDomainProcessBindings. |
import {
scanLocalDomainProcessBindings,
resolveDomainProcessBindings,
validateDomainProcessBindings,
} from '@simplysf/simply-aep-core';
const { records, malformed, ambiguous } = scanLocalDomainProcessBindings(['force-app/main/default']);
const rows = resolveDomainProcessBindings(records);
// rows filtered/sorted by sobject give you Account's Before_Insert handler order, for example
const issues = validateDomainProcessBindings(records, { malformed, ambiguous });
// issues.some(issue => issue.severity === 'error') tells you whether this project's AT4DX wiring is brokenIssues
Please report any issues at https://github.com/SimplySF/simply-node/issues
Contributing
This package is part of the @simplysf/simply monorepo. See CONTRIBUTING.md for what's specific to this package, and the repo's root CONTRIBUTING.md for repo structure, setup, commit conventions, and how to submit a pull request. Please also read our Code of Conduct.
License
Licensed under the Apache-2.0 license.
