@ds-sfdc/sfparty 1.3.8 → 1.3.9
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/.prettierrc +9 -0
- package/package.json +3 -1
- package/pre-commit +4 -0
- package/src/index.js +748 -584
- package/src/lib/checkVersion.js +84 -58
- package/src/lib/fileUtils.js +175 -156
- package/src/lib/gitUtils.js +140 -112
- package/src/lib/packageUtil.js +232 -194
- package/src/lib/pkgObj.cjs +1 -1
- package/src/meta/CustomLabels.js +27 -24
- package/src/meta/Package.js +22 -21
- package/src/meta/PermissionSets.js +75 -66
- package/src/meta/Profiles.js +84 -81
- package/src/meta/Workflows.js +125 -64
- package/src/meta/yargs.js +98 -93
- package/src/party/combine.js +262 -97
- package/src/party/split.js +391 -314
package/src/lib/packageUtil.js
CHANGED
|
@@ -2,201 +2,239 @@ import path from 'path'
|
|
|
2
2
|
import * as packageDefinition from '../meta/Package.js'
|
|
3
3
|
|
|
4
4
|
export class Package {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
5
|
+
constructor(xmlPath) {
|
|
6
|
+
this.xmlPath = xmlPath
|
|
7
|
+
this.packageJSON = undefined
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
getPackageXML(fileUtils) {
|
|
11
|
+
const that = this
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
try {
|
|
14
|
+
if (that.xmlPath === undefined)
|
|
15
|
+
throw new Error('Package not initialized')
|
|
16
|
+
|
|
17
|
+
let fileName = path.resolve(that.xmlPath)
|
|
18
|
+
if (fileUtils.fileExists(fileName) && global.git.append) {
|
|
19
|
+
let data = fileUtils.readFile(fileName)
|
|
20
|
+
data.then((json) => {
|
|
21
|
+
try {
|
|
22
|
+
if (
|
|
23
|
+
json === undefined ||
|
|
24
|
+
Object.keys(json).length === 0
|
|
25
|
+
)
|
|
26
|
+
json =
|
|
27
|
+
packageDefinition.metadataDefinition
|
|
28
|
+
.emptyPackage
|
|
29
|
+
processJSON(that, json, fileUtils)
|
|
30
|
+
resolve('existing')
|
|
31
|
+
} catch (error) {
|
|
32
|
+
reject(error)
|
|
33
|
+
}
|
|
34
|
+
}).catch((error) => {
|
|
35
|
+
reject(error)
|
|
36
|
+
})
|
|
37
|
+
} else {
|
|
38
|
+
try {
|
|
39
|
+
let json = JSON.parse(
|
|
40
|
+
JSON.stringify(
|
|
41
|
+
packageDefinition.metadataDefinition
|
|
42
|
+
.emptyPackage,
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
processJSON(that, json)
|
|
46
|
+
resolve('not found')
|
|
47
|
+
} catch (error) {
|
|
48
|
+
reject(error)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
reject(error)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
function processJSON(that, json, fileUtils) {
|
|
57
|
+
try {
|
|
58
|
+
let data = fileUtils.readFile(
|
|
59
|
+
path.join(global.__basedir, 'sfdx-project.json'),
|
|
60
|
+
)
|
|
61
|
+
json.Package.version = data.sourceApiVersion
|
|
62
|
+
} catch (error) {
|
|
63
|
+
json.Package.version =
|
|
64
|
+
packageDefinition.metadataDefinition.fallbackVersion
|
|
65
|
+
}
|
|
66
|
+
that.packageJSON = json
|
|
67
|
+
if (json.Package.types !== undefined)
|
|
68
|
+
transformJSON(json.Package.types)
|
|
69
|
+
cleanPackage(that)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function cleanPackage(that) {
|
|
73
|
+
if (that.packageJSON === undefined)
|
|
74
|
+
throw new Error(
|
|
75
|
+
'getPackageXML must be called before adding members',
|
|
76
|
+
)
|
|
77
|
+
if (that.packageJSON.Package == undefined)
|
|
78
|
+
throw new Error('Package initialization failed')
|
|
79
|
+
if (that.packageJSON.Package.types === undefined)
|
|
80
|
+
return 'No types found'
|
|
81
|
+
|
|
82
|
+
const typeArray = Object.values(global.metaTypes).map(
|
|
83
|
+
(metaType) => metaType.definition.root,
|
|
84
|
+
)
|
|
85
|
+
that.packageJSON.Package.types.forEach((typeItem) => {
|
|
86
|
+
if (typeArray.includes(typeItem.name)) {
|
|
87
|
+
typeItem.members = typeItem.members.filter(
|
|
88
|
+
(member) => !member.endsWith(`.${global.format}`),
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
addMember(type, member) {
|
|
96
|
+
const that = this
|
|
97
|
+
if (that.packageJSON === undefined)
|
|
98
|
+
throw new Error(
|
|
99
|
+
'getPackageXML must be called before adding members',
|
|
100
|
+
)
|
|
101
|
+
if (type === undefined || type.replaceAll('\t', '').trim() == '')
|
|
102
|
+
throw new Error(
|
|
103
|
+
'An undefined type was received when attempting to add a member',
|
|
104
|
+
)
|
|
105
|
+
if (member === undefined || member.replaceAll('\t', '').trim() == '')
|
|
106
|
+
throw new Error(
|
|
107
|
+
'An undefined member was received when attempting to add a member',
|
|
108
|
+
)
|
|
109
|
+
if (member.indexOf(`.${global.format}`) !== -1)
|
|
110
|
+
throw new Error('Part file received as member is not allowed')
|
|
111
|
+
|
|
112
|
+
type = type.replaceAll('\t', '')
|
|
113
|
+
member = member.replaceAll('\t', '')
|
|
114
|
+
|
|
115
|
+
const packageJSON = that.packageJSON
|
|
116
|
+
let foundMember = false
|
|
117
|
+
let foundAsterisk = false
|
|
118
|
+
let typeJSON = undefined
|
|
119
|
+
|
|
120
|
+
if (packageJSON.Package.types === undefined)
|
|
121
|
+
packageJSON.Package.types = []
|
|
122
|
+
|
|
123
|
+
packageJSON.Package.types.forEach((typeItem) => {
|
|
124
|
+
try {
|
|
125
|
+
if (typeItem.name.toLowerCase() == type.toLowerCase()) {
|
|
126
|
+
typeJSON = typeItem
|
|
127
|
+
if (typeItem.members === undefined) {
|
|
128
|
+
delete typeItem.name
|
|
129
|
+
typeItem.members = []
|
|
130
|
+
typeItem.name = type
|
|
131
|
+
}
|
|
132
|
+
typeItem.members.forEach((memberItem) => {
|
|
133
|
+
if (memberItem.toLowerCase() == member.toLowerCase()) {
|
|
134
|
+
foundMember = true
|
|
135
|
+
} else if (memberItem == '*') {
|
|
136
|
+
foundAsterisk = true
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
} catch (error) {
|
|
141
|
+
throw error
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
// exit if member already exists
|
|
146
|
+
if (foundMember) return
|
|
147
|
+
if (foundAsterisk) {
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
if (typeJSON !== undefined) {
|
|
153
|
+
typeJSON.members.push(member)
|
|
154
|
+
typeJSON.members.sort()
|
|
155
|
+
} else {
|
|
156
|
+
typeJSON = JSON.parse(
|
|
157
|
+
JSON.stringify(
|
|
158
|
+
packageDefinition.metadataDefinition.emptyNode,
|
|
159
|
+
),
|
|
160
|
+
)
|
|
161
|
+
typeJSON.name = type
|
|
162
|
+
typeJSON.members.push(member)
|
|
163
|
+
|
|
164
|
+
packageJSON.Package.types.push(typeJSON)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
packageJSON.Package.types.sort((a, b) => {
|
|
168
|
+
if (a.name < b.name) return -1
|
|
169
|
+
if (a.name > b.name) return 1
|
|
170
|
+
return 0
|
|
171
|
+
})
|
|
172
|
+
} catch (error) {
|
|
173
|
+
throw error
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
savePackage(xml2js, fileUtils) {
|
|
178
|
+
let that = this
|
|
179
|
+
let json = that.packageJSON.Package
|
|
180
|
+
try {
|
|
181
|
+
json.$.xmlns = json.$.xmlns.replace('http:', 'https:')
|
|
182
|
+
const version = json.version
|
|
183
|
+
delete json.version
|
|
184
|
+
json.version = version
|
|
185
|
+
|
|
186
|
+
const builder = new xml2js.Builder({
|
|
187
|
+
cdata: false,
|
|
188
|
+
rootName: 'Package',
|
|
189
|
+
xmldec: { version: '1.0', encoding: 'UTF-8' },
|
|
190
|
+
})
|
|
191
|
+
let fileName = that.xmlPath
|
|
192
|
+
fileUtils.createDirectory(path.dirname(fileName))
|
|
193
|
+
|
|
194
|
+
const xml = builder.buildObject(json)
|
|
195
|
+
|
|
196
|
+
fileUtils.writeFile(fileName, xml)
|
|
197
|
+
} catch (error) {
|
|
198
|
+
throw error
|
|
199
|
+
}
|
|
200
|
+
}
|
|
166
201
|
}
|
|
167
202
|
|
|
168
203
|
function transformJSON(json) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
204
|
+
try {
|
|
205
|
+
json.forEach((typesItem) => {
|
|
206
|
+
Object.keys(typesItem).forEach((key) => {
|
|
207
|
+
let jsonString = JSON.stringify(
|
|
208
|
+
typesItem[key],
|
|
209
|
+
(name, value) => {
|
|
210
|
+
if (key == 'members') {
|
|
211
|
+
return value
|
|
212
|
+
} else {
|
|
213
|
+
return xml2json(value)
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
)
|
|
217
|
+
typesItem[key] = JSON.parse(jsonString)
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
return
|
|
222
|
+
} catch (error) {
|
|
223
|
+
throw error
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function xml2json(currentValue) {
|
|
227
|
+
try {
|
|
228
|
+
if (Array.isArray(currentValue)) {
|
|
229
|
+
if (currentValue.length == 1) {
|
|
230
|
+
currentValue = currentValue[0].toString().trim()
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (currentValue == 'true') currentValue = true
|
|
234
|
+
if (currentValue == 'false') currentValue = false
|
|
235
|
+
return currentValue
|
|
236
|
+
} catch (error) {
|
|
237
|
+
throw error
|
|
238
|
+
}
|
|
239
|
+
}
|
|
202
240
|
}
|
package/src/lib/pkgObj.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = pkgObj = require('../../package.json')
|
|
1
|
+
module.exports = pkgObj = require('../../package.json')
|
package/src/meta/CustomLabels.js
CHANGED
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
export const metadataDefinition = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
2
|
+
metaUrl:
|
|
3
|
+
'https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_customlabels.htm',
|
|
4
|
+
directory: 'labels',
|
|
5
|
+
filetype: 'labels',
|
|
6
|
+
root: 'CustomLabels',
|
|
7
|
+
alias: 'label',
|
|
8
|
+
main: ['$'],
|
|
9
|
+
singleFiles: [],
|
|
10
|
+
directories: ['labels'],
|
|
11
|
+
sortKeys: {
|
|
12
|
+
labels: 'fullName',
|
|
13
|
+
},
|
|
14
|
+
keyOrder: {
|
|
15
|
+
labels: [
|
|
16
|
+
'fullName',
|
|
17
|
+
'shortDescription',
|
|
18
|
+
'categories',
|
|
19
|
+
'protected',
|
|
20
|
+
'language',
|
|
21
|
+
'value',
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
xmlOrder: {
|
|
25
|
+
labels: ['fullName'],
|
|
26
|
+
},
|
|
27
|
+
packageTypeIsDirectory: true,
|
|
28
|
+
delta: true,
|
|
26
29
|
}
|
package/src/meta/Package.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
export const metadataDefinition = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
2
|
+
metaUrl:
|
|
3
|
+
'https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/manifest_samples.htm',
|
|
4
|
+
root: 'Package',
|
|
5
|
+
main: ['version'],
|
|
6
|
+
nodes: ['types'],
|
|
7
|
+
sortKeys: {
|
|
8
|
+
types: 'name',
|
|
9
|
+
},
|
|
10
|
+
keyOrder: {
|
|
11
|
+
types: ['members', 'name'],
|
|
12
|
+
},
|
|
13
|
+
emptyPackage: {
|
|
14
|
+
Package: {
|
|
15
|
+
$: { xmlns: 'https://soap.sforce.com/2006/04/metadata' },
|
|
16
|
+
version: undefined,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
emptyNode: {
|
|
20
|
+
members: [],
|
|
21
|
+
name: undefined,
|
|
22
|
+
},
|
|
23
|
+
fallbackVersion: '55.0',
|
|
23
24
|
}
|