sf-decomposer
Version:
Split large Salesforce metadata files into version-control-friendly pieces and rebuild deployment-ready files.
126 lines (125 loc) • 4.6 kB
TypeScript
import { Command, Config } from '@oclif/core';
import { ScopedPostRetrieve } from '@salesforce/source-deploy-retrieve';
export type DecomposerResult = {
metadata: string[];
};
export type DecomposerOverride = {
/** Suffix-scoped targets (e.g. `permissionset`). Applies to every component of the type. */
metadataTypes?: string[];
/** Component-scoped targets in the form `<suffix>:<fullName>` (e.g. `permissionset:HR_Admin`). */
components?: string[];
decomposedFormat?: string;
strategy?: string;
decomposeNestedPermissions?: boolean;
/**
* Custom `splitTags` spec for `grouped-by-tag` strategy. Comma-separated rules of the form
* `<tag>:<mode>:<field>` or `<tag>:<path>:<mode>:<field>`, where `mode` is `split` (one file
* per array item, filename from `field`) or `group` (array items grouped by `field`, one file
* per group). When set, this wins over the hardcoded `decomposeNestedPermissions` default
* for permission sets. Only applied when the resolved strategy is `grouped-by-tag`.
*/
splitTags?: string;
/**
* Custom `multiLevel` spec(s) for nested-array decomposition. Each rule has the form
* `<file_pattern>:<root_to_strip>:<unique_id_elements>` (the third part is itself a
* comma-separated list). Pass a string for a single rule, a string[] for several rules
* (preferred), or a single `;`-separated string. When set, this wins over the hardcoded
* `loyaltyProgramSetup` default. Applies regardless of strategy because multiLevel
* works on a per-file pattern.
*/
multiLevel?: string | string[];
/**
* Comma-separated list of XML element names (and optional compound keys joined by `+`)
* used to derive stable filenames during `unique-id` decomposition. When set, this
* replaces the hardcoded per-type list from the built-in registry (the global defaults
* `fullName` and `name` are always prepended regardless). Useful for metadata types not
* yet covered by the built-in registry, or when the default selection produces collisions.
* Example: `"developerName,apiName"` or `"actionName+pageOrSobjectType+formFactor"`.
*/
uniqueIdElements?: string;
prePurge?: boolean;
postPurge?: boolean;
};
export type ConfigFile = {
metadataSuffixes: string;
prePurge: boolean;
postPurge: boolean;
decomposedFormat: string;
ignorePackageDirectories: string;
strategy: string;
decomposeNestedPermissions: boolean;
manifest?: string;
overrides?: DecomposerOverride[];
};
export type SfdxProject = {
packageDirectories: Array<{
path: string;
}>;
};
export type MetaAttributes = {
metaSuffix: string;
strictDirectoryName: boolean;
folderType: string;
metadataPaths: string[];
uniqueIdElements: string;
};
export type PostRetrieveHookOptions = {
Command: Command;
argv: string[];
commandId: string;
result?: ScopedPostRetrieve;
config: Config;
};
export type FieldPermission = {
editable?: boolean;
field: string;
readable?: boolean;
};
export type DecomposeOptions = {
metadataTypes?: string[];
prepurge: boolean;
postpurge: boolean;
format: string;
ignoreDirs?: string[];
strategy: string;
decomposeNestedPerms: boolean;
manifest?: string;
overrides?: DecomposerOverride[];
log: (msg: string) => void;
repoRoot?: string;
};
export type RecomposeOptions = {
metadataTypes?: string[];
postpurge: boolean;
ignoreDirs?: string[];
manifest?: string;
log: (msg: string) => void;
repoRoot?: string;
};
export type VerifyOptions = {
metadataTypes?: string[];
format: string;
ignoreDirs?: string[];
strategy: string;
decomposeNestedPerms: boolean;
manifest?: string;
overrides?: DecomposerOverride[];
log: (msg: string) => void;
};
export type VerifyDrift = {
/** Path of the offending file relative to its package directory. */
path: string;
/** Short human-readable reason: `'content drift'` or `'missing in round-trip output'`. */
reason: string;
};
export type VerifyResult = {
/** Metadata types that participated in the round trip. */
metadata: string[];
/** One entry per file that did not survive the round trip semantically. Empty on success. */
drift: VerifyDrift[];
/**
* Files where the only delta was sibling/attribute ordering — content is semantically identical
* but not byte-identical. Reported for awareness; does not fail `verify`.
*/
reordered: string[];
};