sf-decomposer 7.1.1 → 7.3.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/CHANGELOG.md +14 -0
- package/README.md +201 -87
- package/lib/action/decompose.d.ts +1 -0
- package/lib/action/decompose.js +57 -0
- package/lib/action/decompose.js.map +1 -0
- package/lib/action/index.d.ts +1 -0
- package/lib/action/index.js +4 -0
- package/lib/action/index.js.map +1 -0
- package/lib/action/inputs.d.ts +3 -0
- package/lib/action/inputs.js +19 -0
- package/lib/action/inputs.js.map +1 -0
- package/lib/action/main.d.ts +1 -0
- package/lib/action/main.js +26 -0
- package/lib/action/main.js.map +1 -0
- package/lib/action/recompose.d.ts +1 -0
- package/lib/action/recompose.js +36 -0
- package/lib/action/recompose.js.map +1 -0
- package/lib/action/verify.d.ts +1 -0
- package/lib/action/verify.js +53 -0
- package/lib/action/verify.js.map +1 -0
- package/lib/helpers/types.d.ts +9 -2
- package/lib/metadata/getRegistryValuesBySuffix.d.ts +1 -1
- package/lib/metadata/getRegistryValuesBySuffix.js +10 -3
- package/lib/metadata/getRegistryValuesBySuffix.js.map +1 -1
- package/lib/metadata/parseManifest.js +28 -12
- package/lib/metadata/parseManifest.js.map +1 -1
- package/lib/metadata/registry/manifestXml.d.ts +13 -0
- package/lib/metadata/registry/manifestXml.js +74 -0
- package/lib/metadata/registry/manifestXml.js.map +1 -0
- package/lib/metadata/registry/metadataRegistry.json +5417 -0
- package/lib/metadata/registry/registryAccess.d.ts +14 -0
- package/lib/metadata/registry/registryAccess.js +52 -0
- package/lib/metadata/registry/registryAccess.js.map +1 -0
- package/lib/metadata/registry/resolveManifestComponents.d.ts +13 -0
- package/lib/metadata/registry/resolveManifestComponents.js +60 -0
- package/lib/metadata/registry/resolveManifestComponents.js.map +1 -0
- package/lib/metadata/registry/types.d.ts +23 -0
- package/lib/metadata/registry/types.js +3 -0
- package/lib/metadata/registry/types.js.map +1 -0
- package/lib/metadata/registry/xmlParser.d.ts +5 -0
- package/lib/metadata/registry/xmlParser.js +177 -0
- package/lib/metadata/registry/xmlParser.js.map +1 -0
- package/oclif.manifest.json +1 -1
- package/package.json +60 -6
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
import * as core from '@actions/core';
|
|
3
|
+
import { verifyMetadataTypes } from '../core/verifyMetadataTypes.js';
|
|
4
|
+
import { loadConfigFile, parseConfigSuffixes, resolveDefaultConfigPath, validateConfigManifest, } from '../helpers/configOverrides.js';
|
|
5
|
+
import { multilineInput, optionalInput, requireMetadataTypesOrManifest } from './inputs.js';
|
|
6
|
+
export async function runVerify() {
|
|
7
|
+
let metadataTypes = multilineInput('metadata-type');
|
|
8
|
+
let manifest = optionalInput('manifest');
|
|
9
|
+
let ignoreDirs = multilineInput('ignore-package-directory');
|
|
10
|
+
let format = optionalInput('format') ?? 'xml';
|
|
11
|
+
let strategy = optionalInput('strategy') ?? 'unique-id';
|
|
12
|
+
let decomposeNestedPerms = core.getBooleanInput('decompose-nested-permissions');
|
|
13
|
+
let overrides;
|
|
14
|
+
if (core.getBooleanInput('config')) {
|
|
15
|
+
const config = await loadConfigFile(await resolveDefaultConfigPath());
|
|
16
|
+
metadataTypes ??= parseConfigSuffixes(config.metadataSuffixes);
|
|
17
|
+
const configManifest = !manifest ? config.manifest : undefined;
|
|
18
|
+
manifest ??= config.manifest;
|
|
19
|
+
ignoreDirs ??= parseConfigSuffixes(config.ignorePackageDirectories);
|
|
20
|
+
format = optionalInput('format') ?? config.decomposedFormat ?? 'xml';
|
|
21
|
+
strategy = optionalInput('strategy') ?? config.strategy ?? 'unique-id';
|
|
22
|
+
decomposeNestedPerms = decomposeNestedPerms || (config.decomposeNestedPermissions ?? false);
|
|
23
|
+
overrides = config.overrides;
|
|
24
|
+
manifest = await validateConfigManifest({
|
|
25
|
+
configManifest,
|
|
26
|
+
metadataTypes,
|
|
27
|
+
manifest,
|
|
28
|
+
warn: (msg) => core.warning(msg),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
requireMetadataTypesOrManifest(metadataTypes, manifest);
|
|
32
|
+
const result = await verifyMetadataTypes({
|
|
33
|
+
metadataTypes,
|
|
34
|
+
format,
|
|
35
|
+
ignoreDirs,
|
|
36
|
+
strategy,
|
|
37
|
+
decomposeNestedPerms,
|
|
38
|
+
manifest,
|
|
39
|
+
overrides,
|
|
40
|
+
log: (msg) => core.info(msg),
|
|
41
|
+
});
|
|
42
|
+
core.setOutput('metadata', result.metadata.join('\n'));
|
|
43
|
+
core.setOutput('types-count', result.metadata.length);
|
|
44
|
+
core.setOutput('drift-count', result.drift.length);
|
|
45
|
+
core.setOutput('reordered-count', result.reordered.length);
|
|
46
|
+
if (result.drift.length > 0) {
|
|
47
|
+
for (const { path, reason } of result.drift) {
|
|
48
|
+
core.error(`${path}: ${reason}`);
|
|
49
|
+
}
|
|
50
|
+
core.setFailed(`Round-trip verify failed: ${result.drift.length} file(s) drifted between the original tree and the round-tripped output. See the log above for the offending paths.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/action/verify.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE5F,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,aAAa,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,UAAU,GAAG,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAC5D,IAAI,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAC9C,IAAI,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC;IACxD,IAAI,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;IAChF,IAAI,SAAS,CAAC;IAEd,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,wBAAwB,EAAE,CAAC,CAAC;QACtE,aAAa,KAAK,mBAAmB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;QAC7B,UAAU,KAAK,mBAAmB,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACpE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,gBAAgB,IAAI,KAAK,CAAC;QACrE,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC;QACvE,oBAAoB,GAAG,oBAAoB,IAAI,CAAC,MAAM,CAAC,0BAA0B,IAAI,KAAK,CAAC,CAAC;QAC5F,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAE7B,QAAQ,GAAG,MAAM,sBAAsB,CAAC;YACtC,cAAc;YACd,aAAa;YACb,QAAQ;YACR,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACvC,aAAa;QACb,MAAM;QACN,UAAU;QACV,QAAQ;QACR,oBAAoB;QACpB,QAAQ;QACR,SAAS;QACT,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,SAAS,CACZ,6BAA6B,MAAM,CAAC,KAAK,CAAC,MAAM,qHAAqH,CACtK,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/lib/helpers/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command, Config } from '@oclif/core';
|
|
2
|
-
import { ScopedPostRetrieve } from '@salesforce/source-deploy-retrieve';
|
|
3
2
|
export type DecomposerResult = {
|
|
4
3
|
metadata: string[];
|
|
5
4
|
};
|
|
@@ -75,11 +74,18 @@ export type MetaAttributes = {
|
|
|
75
74
|
metadataPaths: string[];
|
|
76
75
|
uniqueIdElements: string;
|
|
77
76
|
};
|
|
77
|
+
type RetrieveHookResult = {
|
|
78
|
+
retrieveResult: {
|
|
79
|
+
response: {
|
|
80
|
+
status?: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
};
|
|
78
84
|
export type PostRetrieveHookOptions = {
|
|
79
85
|
Command: Command;
|
|
80
86
|
argv: string[];
|
|
81
87
|
commandId: string;
|
|
82
|
-
result?:
|
|
88
|
+
result?: RetrieveHookResult;
|
|
83
89
|
config: Config;
|
|
84
90
|
};
|
|
85
91
|
export type DecomposeOptions = {
|
|
@@ -132,3 +138,4 @@ export type VerifyResult = {
|
|
|
132
138
|
*/
|
|
133
139
|
reordered: string[];
|
|
134
140
|
};
|
|
141
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MetadataType } from '@salesforce/source-deploy-retrieve';
|
|
2
1
|
import { MetaAttributes } from '../helpers/types.js';
|
|
2
|
+
import { MetadataType } from './registry/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Resolves and validates the SDR registry entry for a metadata suffix (rejects `object`, unknown
|
|
5
5
|
* suffixes, and unsupported adapter strategies). Synchronous and side-effect free, so callers can
|
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
import { RegistryAccess } from '@salesforce/source-deploy-retrieve';
|
|
3
2
|
import { DEFAULT_UNIQUE_ID_ELEMENTS, UNSUPPORTED_ADAPTERS } from '../helpers/constants.js';
|
|
4
3
|
import { getPackageDirectories } from './getPackageDirectories.js';
|
|
5
4
|
import { getUniqueIdElements } from './getUniqueIdElements.js';
|
|
5
|
+
import { RegistryAccess } from './registry/registryAccess.js';
|
|
6
6
|
// Singleton instance for RegistryAccess to avoid repeated instantiation
|
|
7
7
|
let registryAccessInstance = null;
|
|
8
8
|
// Lazy-built reverse map: suffix → child MetadataType (for child types whose suffix differs from xmlName)
|
|
9
9
|
let childSuffixMap = null;
|
|
10
10
|
function getRegistryAccessInstance() {
|
|
11
|
+
// Stryker disable next-line ConditionalExpression -- caching is a pure perf optimization here;
|
|
12
|
+
// RegistryAccess itself is a stateless wrapper around registryAccess.ts's own module-level
|
|
13
|
+
// (and therefore already-singleton) registry data, so a "recreated" instance behaves identically.
|
|
11
14
|
if (!registryAccessInstance) {
|
|
12
15
|
registryAccessInstance = new RegistryAccess();
|
|
13
16
|
}
|
|
14
17
|
return registryAccessInstance;
|
|
15
18
|
}
|
|
16
19
|
function getChildSuffixMap(registryAccess) {
|
|
20
|
+
// Stryker disable next-line ConditionalExpression -- same reasoning as getRegistryAccessInstance above.
|
|
17
21
|
if (!childSuffixMap) {
|
|
18
22
|
childSuffixMap = new Map();
|
|
19
|
-
const
|
|
20
|
-
for (const childXmlNameLower of Object.keys(reg.childTypes)) {
|
|
23
|
+
for (const childXmlNameLower of Object.keys(registryAccess.childTypes)) {
|
|
21
24
|
const parentType = registryAccess.getParentType(childXmlNameLower);
|
|
25
|
+
// Stryker disable next-line OptionalChaining -- defensive guard; every key in childTypes
|
|
26
|
+
// is guaranteed (by the vendored registry's own invariants) to resolve to a real parentType
|
|
27
|
+
// with a children.types entry for that key.
|
|
22
28
|
const childEntry = parentType?.children?.types[childXmlNameLower];
|
|
23
29
|
/* v8 ignore next -- defensive guard; SDR registry always provides a suffix for child types */
|
|
30
|
+
// Stryker disable next-line ConditionalExpression, OptionalChaining -- same registry invariant.
|
|
24
31
|
if (childEntry?.suffix) {
|
|
25
32
|
childSuffixMap.set(childEntry.suffix, childEntry);
|
|
26
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRegistryValuesBySuffix.js","sourceRoot":"","sources":["../../src/metadata/getRegistryValuesBySuffix.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,
|
|
1
|
+
{"version":3,"file":"getRegistryValuesBySuffix.js","sourceRoot":"","sources":["../../src/metadata/getRegistryValuesBySuffix.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
3
3
|
import { join, resolve } from 'node:path';
|
|
4
|
-
import { ManifestResolver, RegistryAccess } from '@salesforce/source-deploy-retrieve';
|
|
5
4
|
import { getRepoRoot } from '../service/core/getRepoRoot.js';
|
|
6
5
|
import { buildPackageDirectoryIndex } from './getPackageDirectories.js';
|
|
6
|
+
import { RegistryAccess } from './registry/registryAccess.js';
|
|
7
|
+
import { resolveManifestComponents } from './registry/resolveManifestComponents.js';
|
|
7
8
|
export async function parseManifest(manifestPath, ignoreDirs, repoRootOverride) {
|
|
8
9
|
const { repoRoot } = repoRootOverride
|
|
9
10
|
? { repoRoot: repoRootOverride }
|
|
10
11
|
: (await getRepoRoot());
|
|
11
12
|
const absManifestPath = resolve(repoRoot, manifestPath);
|
|
12
13
|
const registry = new RegistryAccess();
|
|
13
|
-
const
|
|
14
|
-
const
|
|
14
|
+
const manifestContents = await readFile(absManifestPath, 'utf-8');
|
|
15
|
+
const components = resolveManifestComponents(manifestContents, registry);
|
|
15
16
|
// Group declared manifest entries by their effective parent metadata type.
|
|
16
17
|
const byParentType = new Map();
|
|
17
18
|
for (const component of components) {
|
|
18
19
|
const parentType = registry.getParentType(component.type.name) ?? component.type;
|
|
19
20
|
const parentMember = component.fullName.split('.')[0];
|
|
20
|
-
|
|
21
|
+
// Stryker disable next-line ConditionalExpression, StringLiteral -- whenever fullName === '*'
|
|
22
|
+
// exactly, parentMember (= fullName.split('.')[0]) is provably also '*' ('*'.split('.')[0] is
|
|
23
|
+
// '*'), so this disjunct can never independently change isWildcard's result below -- the
|
|
24
|
+
// parentMember check already covers that case.
|
|
25
|
+
const isFullNameWildcard = component.fullName === '*';
|
|
26
|
+
const isWildcard = isFullNameWildcard || parentMember === '*';
|
|
21
27
|
let entry = byParentType.get(parentType.name);
|
|
22
28
|
if (!entry) {
|
|
23
29
|
entry = { parentType, parentMembers: new Set(), wildcard: false };
|
|
@@ -41,7 +47,8 @@ export async function parseManifest(manifestPath, ignoreDirs, repoRootOverride)
|
|
|
41
47
|
const { index: directoryPathsByName } = directoryIndex;
|
|
42
48
|
const resolvedPerGroup = await Promise.all(groupedEntries.map(async ({ parentType, parentMembers, wildcard }) => {
|
|
43
49
|
const suffix = parentType.suffix;
|
|
44
|
-
/* istanbul ignore next -- @preserve: parent metadata types always declare a suffix in SDR's registry.
|
|
50
|
+
/* istanbul ignore next -- @preserve: parent metadata types always declare a suffix in SDR's registry. */
|
|
51
|
+
// Stryker disable next-line all
|
|
45
52
|
if (!suffix)
|
|
46
53
|
return undefined;
|
|
47
54
|
const typeDirs = directoryPathsByName.get(`${parentType.directoryName}`) ?? [];
|
|
@@ -76,7 +83,8 @@ export async function parseManifest(manifestPath, ignoreDirs, repoRootOverride)
|
|
|
76
83
|
}));
|
|
77
84
|
const unresolvedComponents = [];
|
|
78
85
|
for (const entry of resolvedPerGroup) {
|
|
79
|
-
/* istanbul ignore next -- @preserve: undefined only reachable via the suffix-less branch already ignored above.
|
|
86
|
+
/* istanbul ignore next -- @preserve: undefined only reachable via the suffix-less branch already ignored above. */
|
|
87
|
+
// Stryker disable next-line ConditionalExpression
|
|
80
88
|
if (!entry)
|
|
81
89
|
continue;
|
|
82
90
|
const { suffix, xmlPaths, unresolvedMembers } = entry;
|
|
@@ -85,7 +93,8 @@ export async function parseManifest(manifestPath, ignoreDirs, repoRootOverride)
|
|
|
85
93
|
}
|
|
86
94
|
if (xmlPaths.size === 0)
|
|
87
95
|
continue;
|
|
88
|
-
/* istanbul ignore else -- @preserve: multiple parent types sharing a suffix is not produced by SDR's registry.
|
|
96
|
+
/* istanbul ignore else -- @preserve: multiple parent types sharing a suffix is not produced by SDR's registry. */
|
|
97
|
+
// Stryker disable next-line ConditionalExpression
|
|
89
98
|
if (!parentXmlsBySuffix.has(suffix)) {
|
|
90
99
|
parentXmlsBySuffix.set(suffix, xmlPaths);
|
|
91
100
|
orderedSuffixes.push(suffix);
|
|
@@ -135,7 +144,8 @@ export async function resolveEffectiveMetadataTypes(metadataTypes, manifest, ign
|
|
|
135
144
|
}
|
|
136
145
|
async function resolveMemberXml(typeDir, parentType, member) {
|
|
137
146
|
const { suffix, strictDirectoryName, folderType } = parentType;
|
|
138
|
-
/* istanbul ignore next -- @preserve: types reaching this point always have a suffix
|
|
147
|
+
/* istanbul ignore next -- @preserve: types reaching this point always have a suffix. */
|
|
148
|
+
// Stryker disable next-line all
|
|
139
149
|
if (!suffix)
|
|
140
150
|
return undefined;
|
|
141
151
|
// Labels type has a single file regardless of member name.
|
|
@@ -160,13 +170,19 @@ async function resolveMemberXml(typeDir, parentType, member) {
|
|
|
160
170
|
}
|
|
161
171
|
async function listParentXmlPaths(typeDir, parentType) {
|
|
162
172
|
const { suffix, strictDirectoryName } = parentType;
|
|
163
|
-
/* istanbul ignore next -- @preserve: types reaching this point always have a suffix
|
|
173
|
+
/* istanbul ignore next -- @preserve: types reaching this point always have a suffix. */
|
|
174
|
+
// Stryker disable next-line all
|
|
164
175
|
if (!suffix)
|
|
165
176
|
return [];
|
|
166
177
|
const metaEnding = `.${suffix}-meta.xml`;
|
|
167
178
|
if (strictDirectoryName) {
|
|
168
179
|
const entries = await readdir(typeDir, { withFileTypes: true });
|
|
169
|
-
const results = await Promise.all(
|
|
180
|
+
const results = await Promise.all(
|
|
181
|
+
// Stryker disable next-line MethodExpression -- defensive guard, not provably killable: a
|
|
182
|
+
// filesystem can't have a file and a directory sharing the same name under the same parent,
|
|
183
|
+
// so `join(typeDir, entry.name, ...)` can never resolve to a real file for a non-directory
|
|
184
|
+
// entry regardless of this filter -- exists() below would reject it either way.
|
|
185
|
+
entries
|
|
170
186
|
.filter((entry) => entry.isDirectory())
|
|
171
187
|
.map(async (entry) => {
|
|
172
188
|
const candidate = join(typeDir, entry.name, `${entry.name}${metaEnding}`);
|
|
@@ -187,9 +203,9 @@ async function exists(path) {
|
|
|
187
203
|
try {
|
|
188
204
|
await stat(path);
|
|
189
205
|
return true;
|
|
206
|
+
// Stryker disable next-line BlockStatement
|
|
190
207
|
}
|
|
191
208
|
catch {
|
|
192
|
-
// Stryker disable next-line BlockStatement
|
|
193
209
|
return false;
|
|
194
210
|
}
|
|
195
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseManifest.js","sourceRoot":"","sources":["../../src/metadata/parseManifest.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"parseManifest.js","sourceRoot":"","sources":["../../src/metadata/parseManifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ParsedManifestType = {
|
|
2
|
+
name: string;
|
|
3
|
+
members: string[];
|
|
4
|
+
};
|
|
5
|
+
export type ParsedManifest = {
|
|
6
|
+
types: ParsedManifestType[];
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Parses a package.xml manifest's raw text into its declared types/members. Validates only that
|
|
10
|
+
* the document follows the Metadata API manifest structure (a single <Package> root containing
|
|
11
|
+
* <types>/<version> elements) -- metadata type names are not checked against the registry here.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseManifestXml(xml: string): ParsedManifest;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// The syntactic layer that turns package.xml text into { name, members } pairs.
|
|
3
|
+
// Registry-aware resolution (parent/child/folder types) is layered on top in
|
|
4
|
+
// resolveManifestComponents.ts, mirroring how SDR's ManifestResolver separates
|
|
5
|
+
// manifest parsing from registry lookups.
|
|
6
|
+
import { parseXml } from './xmlParser.js';
|
|
7
|
+
function isElement(node) {
|
|
8
|
+
return typeof node !== 'string';
|
|
9
|
+
}
|
|
10
|
+
function getText(node) {
|
|
11
|
+
return node.children
|
|
12
|
+
.filter((child) => typeof child === 'string')
|
|
13
|
+
.join('')
|
|
14
|
+
.trim();
|
|
15
|
+
}
|
|
16
|
+
function parseTypesElement(typesEl) {
|
|
17
|
+
const children = typesEl.children.filter(isElement);
|
|
18
|
+
const nameEls = children.filter((el) => el.tagName === 'name');
|
|
19
|
+
const memberEls = children.filter((el) => el.tagName === 'members');
|
|
20
|
+
const otherEl = children.find((el) => el.tagName !== 'name' && el.tagName !== 'members');
|
|
21
|
+
if (otherEl) {
|
|
22
|
+
throw new Error(`unexpected element <${otherEl.tagName}> inside <types>`);
|
|
23
|
+
}
|
|
24
|
+
if (nameEls.length !== 1) {
|
|
25
|
+
throw new Error(`<types> must contain exactly one <name> element, found ${nameEls.length}`);
|
|
26
|
+
}
|
|
27
|
+
const name = getText(nameEls[0]);
|
|
28
|
+
if (!name) {
|
|
29
|
+
throw new Error('<types><name> element must not be empty');
|
|
30
|
+
}
|
|
31
|
+
if (memberEls.length === 0) {
|
|
32
|
+
throw new Error(`<types> for "${name}" must contain at least one <members> element`);
|
|
33
|
+
}
|
|
34
|
+
const members = memberEls.map((memberEl) => {
|
|
35
|
+
const member = getText(memberEl);
|
|
36
|
+
if (!member) {
|
|
37
|
+
throw new Error(`<types> for "${name}" contains an empty <members> element`);
|
|
38
|
+
}
|
|
39
|
+
return member;
|
|
40
|
+
});
|
|
41
|
+
return { name, members };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parses a package.xml manifest's raw text into its declared types/members. Validates only that
|
|
45
|
+
* the document follows the Metadata API manifest structure (a single <Package> root containing
|
|
46
|
+
* <types>/<version> elements) -- metadata type names are not checked against the registry here.
|
|
47
|
+
*/
|
|
48
|
+
export function parseManifestXml(xml) {
|
|
49
|
+
const roots = parseXml(xml);
|
|
50
|
+
if (roots.length !== 1 || roots[0].tagName !== 'Package') {
|
|
51
|
+
throw new Error('manifest must have a single <Package> root element');
|
|
52
|
+
}
|
|
53
|
+
const types = [];
|
|
54
|
+
let versionSeen = false;
|
|
55
|
+
for (const child of roots[0].children.filter(isElement)) {
|
|
56
|
+
if (child.tagName === 'types') {
|
|
57
|
+
types.push(parseTypesElement(child));
|
|
58
|
+
}
|
|
59
|
+
else if (child.tagName === 'version') {
|
|
60
|
+
if (versionSeen) {
|
|
61
|
+
throw new Error('<Package> must not contain more than one <version> element');
|
|
62
|
+
}
|
|
63
|
+
versionSeen = true;
|
|
64
|
+
if (!getText(child)) {
|
|
65
|
+
throw new Error('<Package><version> element must not be empty');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new Error(`unexpected element <${child.tagName}> inside <Package>`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { types };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=manifestXml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestXml.js","sourceRoot":"","sources":["../../../src/metadata/registry/manifestXml.ts"],"names":[],"mappings":"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"}
|