@ds-sfdc/sfparty 0.0.0 → 1.0.0-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/.husky/commit-msg +4 -0
- package/commitlint.config.cjs +1 -0
- package/package.json +10 -7
- package/{index.js → src/index.js} +125 -186
- package/{lib → src/lib}/fileUtils.js +18 -10
- package/{lib → src/lib}/permset/combine.js +5 -5
- package/{lib → src/lib}/permset/split.js +4 -4
- package/{lib → src/lib}/profile/combine.js +5 -5
- package/{lib → src/lib}/profile/split.js +1 -1
- package/{lib/label/definition.js → src/meta/CustomLabels.js} +12 -1
- package/{lib/permset/definition.js → src/meta/PermissionSets.js} +10 -17
- package/{lib/profile/definition.js → src/meta/Profiles.js} +32 -5
- package/{lib/workflow/definition.js → src/meta/Workflows.js} +1 -0
- package/{lib/workflow → src/party}/combine.js +100 -42
- package/{lib/workflow → src/party}/split.js +124 -69
- package/lib/label/combine.js +0 -203
- package/lib/label/split.js +0 -213
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = { extends: ['@commitlint/config-conventional'] };
|
package/package.json
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ds-sfdc/sfparty",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0-0",
|
|
4
|
+
"description": "Salesforce metadata XML splitter for CI/CD",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/TimPaulaskasDS/sfparty.git"
|
|
9
9
|
},
|
|
10
10
|
"bin": {
|
|
11
|
-
"sfparty": "index.js"
|
|
11
|
+
"sfparty": "src/index.js"
|
|
12
12
|
},
|
|
13
|
-
"main": "index.js",
|
|
13
|
+
"main": "src/index.js",
|
|
14
14
|
"scripts": {
|
|
15
|
-
"test": "mocha 'tests/**/*.js' --recursive--reporter spec"
|
|
15
|
+
"test": "mocha 'tests/**/*.js' --recursive--reporter spec",
|
|
16
|
+
"postinstall": "husky install"
|
|
16
17
|
},
|
|
17
18
|
"keywords": [
|
|
18
|
-
"xml,split,
|
|
19
|
+
"salesforce,metadata,xml,split,yaml,json"
|
|
19
20
|
],
|
|
20
21
|
"author": "Tim Paulaskas",
|
|
21
22
|
"license": "BSD-3-Clause",
|
|
@@ -32,6 +33,9 @@
|
|
|
32
33
|
"yargs": "^17.6.2"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
36
|
+
"@commitlint/cli": "^17.4.0",
|
|
37
|
+
"@commitlint/config-conventional": "^17.4.0",
|
|
38
|
+
"husky": "^8.0.3",
|
|
35
39
|
"mocha": "^10.2.0",
|
|
36
40
|
"nodemon": "^2.0.20",
|
|
37
41
|
"should": "^7.1.0"
|
|
@@ -44,7 +48,6 @@
|
|
|
44
48
|
},
|
|
45
49
|
"homepage": "https://github.com/TimPaulaskasDS/sfparty#readme",
|
|
46
50
|
"directories": {
|
|
47
|
-
"example": "examples",
|
|
48
51
|
"lib": "lib",
|
|
49
52
|
"test": "tests"
|
|
50
53
|
}
|
|
@@ -8,15 +8,13 @@ import winston from 'winston'
|
|
|
8
8
|
import chalk from 'chalk'
|
|
9
9
|
import convertHrtime from 'convert-hrtime'
|
|
10
10
|
import * as fileUtils from './lib/fileUtils.js'
|
|
11
|
-
import * as
|
|
12
|
-
import * as
|
|
13
|
-
import * as
|
|
14
|
-
import * as
|
|
15
|
-
import * as
|
|
16
|
-
import * as
|
|
17
|
-
import * as
|
|
18
|
-
import * as workflowCombine from './lib/workflow/combine.js'
|
|
19
|
-
import * as workflowDefinition from './lib/workflow/definition.js'
|
|
11
|
+
import * as pkgObj from '../package.json' assert { type: "json" }
|
|
12
|
+
import * as metadataSplit from './party/split.js'
|
|
13
|
+
import * as metadataCombine from './party/combine.js'
|
|
14
|
+
import * as labelDefinition from './meta/CustomLabels.js'
|
|
15
|
+
import * as profileDefinition from './meta/Profiles.js'
|
|
16
|
+
import * as permsetDefinition from './meta/PermissionSets.js'
|
|
17
|
+
import * as workflowDefinition from './meta/Workflows.js'
|
|
20
18
|
|
|
21
19
|
const startTime = process.hrtime.bigint()
|
|
22
20
|
|
|
@@ -24,7 +22,7 @@ const startTime = process.hrtime.bigint()
|
|
|
24
22
|
global.logger = winston.createLogger({
|
|
25
23
|
levels: winston.config.syslog.levels,
|
|
26
24
|
format: winston.format.cli(),
|
|
27
|
-
defaultMeta: { service: '
|
|
25
|
+
defaultMeta: { service: 'sfparty' },
|
|
28
26
|
transports: [
|
|
29
27
|
new winston.transports.Console(),
|
|
30
28
|
],
|
|
@@ -36,11 +34,38 @@ global.processed = {
|
|
|
36
34
|
current: 1,
|
|
37
35
|
}
|
|
38
36
|
|
|
39
|
-
global.
|
|
37
|
+
global.icons = {
|
|
40
38
|
"warn": '🔕',
|
|
41
39
|
"success": chalk.greenBright('✔'),
|
|
42
40
|
"fail": '❗',
|
|
43
|
-
"working": '⏳'
|
|
41
|
+
"working": '⏳',
|
|
42
|
+
"party": '🎉',
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const typeArray = [
|
|
46
|
+
'label',
|
|
47
|
+
'profile',
|
|
48
|
+
'permset',
|
|
49
|
+
'workflow',
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
const metaTypes = {
|
|
53
|
+
label: {
|
|
54
|
+
type: labelDefinition.metadataDefinition.filetype,
|
|
55
|
+
definition: labelDefinition.metadataDefinition,
|
|
56
|
+
},
|
|
57
|
+
profile: {
|
|
58
|
+
type: profileDefinition.metadataDefinition.filetype,
|
|
59
|
+
definition: profileDefinition.metadataDefinition,
|
|
60
|
+
},
|
|
61
|
+
permset: {
|
|
62
|
+
type: permsetDefinition.metadataDefinition.filetype,
|
|
63
|
+
definition: permsetDefinition.metadataDefinition,
|
|
64
|
+
},
|
|
65
|
+
workflow: {
|
|
66
|
+
type: workflowDefinition.metadataDefinition.filetype,
|
|
67
|
+
definition: workflowDefinition.metadataDefinition,
|
|
68
|
+
},
|
|
44
69
|
}
|
|
45
70
|
|
|
46
71
|
function getRootPath(packageDir) {
|
|
@@ -70,9 +95,30 @@ function getRootPath(packageDir) {
|
|
|
70
95
|
|
|
71
96
|
return defaultDir
|
|
72
97
|
}
|
|
73
|
-
|
|
74
98
|
let errorMessage = chalk.red('Please specify the action of ' + chalk.whiteBright.bgRedBright('split') + ' or ' + chalk.whiteBright.bgRedBright('combine') + '.')
|
|
75
99
|
|
|
100
|
+
displayHeader() // display header mast
|
|
101
|
+
|
|
102
|
+
function displayHeader() {
|
|
103
|
+
const table = {
|
|
104
|
+
topLeft: '╭',
|
|
105
|
+
topRight: '╮',
|
|
106
|
+
bottomLeft: '╰',
|
|
107
|
+
bottomRight: '╯',
|
|
108
|
+
horizontal: '─',
|
|
109
|
+
vertical: '│',
|
|
110
|
+
}
|
|
111
|
+
let versionString = `sfparty v${pkgObj.default.version}${(process.stdout.columns > pkgObj.default.description.length + 15) ? ' - ' + pkgObj.default.description : ''}`
|
|
112
|
+
let titleMessage = `${global.icons.party} ${chalk.yellowBright(versionString)} ${global.icons.party}`
|
|
113
|
+
titleMessage = titleMessage.padEnd((process.stdout.columns / 2) + versionString.length / 1.65)
|
|
114
|
+
titleMessage = titleMessage.padStart(process.stdout.columns)
|
|
115
|
+
titleMessage = chalk.blackBright(table.vertical) + ' ' + titleMessage + ' ' + chalk.blackBright(table.vertical)
|
|
116
|
+
console.log(`${chalk.blackBright(table.topLeft + table.horizontal.repeat(process.stdout.columns - 2) + table.topRight)}`)
|
|
117
|
+
console.log(titleMessage)
|
|
118
|
+
console.log(`${chalk.blackBright(table.bottomLeft + table.horizontal.repeat(process.stdout.columns - 2) + table.bottomRight)}`)
|
|
119
|
+
console.log()
|
|
120
|
+
}
|
|
121
|
+
|
|
76
122
|
yargs(hideBin(process.argv))
|
|
77
123
|
.alias('h', 'help')
|
|
78
124
|
.command({
|
|
@@ -131,7 +177,7 @@ yargs(hideBin(process.argv))
|
|
|
131
177
|
type: 'string',
|
|
132
178
|
}
|
|
133
179
|
})
|
|
134
|
-
.choices('type',
|
|
180
|
+
.choices('type', typeArray)
|
|
135
181
|
.choices('format', ['json', 'yaml'])
|
|
136
182
|
.check((argv, options) => {
|
|
137
183
|
const name = argv.name
|
|
@@ -157,31 +203,15 @@ yargs(hideBin(process.argv))
|
|
|
157
203
|
})
|
|
158
204
|
},
|
|
159
205
|
handler: (argv) => {
|
|
160
|
-
|
|
206
|
+
if (!typeArray.includes(argv.type)) {
|
|
207
|
+
global.logger.error('Metadata type not supported: ' + type)
|
|
208
|
+
process.exit(1)
|
|
209
|
+
}
|
|
161
210
|
const fileList = []
|
|
162
|
-
|
|
211
|
+
const typeObj = metaTypes[argv.type]
|
|
212
|
+
const type = typeObj.type
|
|
213
|
+
const metaExtension = `.${type}-meta.xml`
|
|
163
214
|
global.format = argv.format
|
|
164
|
-
switch (type) {
|
|
165
|
-
case 'profile':
|
|
166
|
-
type = 'profiles'
|
|
167
|
-
metaExtension = '.profile-meta.xml'
|
|
168
|
-
break
|
|
169
|
-
case 'permset':
|
|
170
|
-
type = 'permissionsets'
|
|
171
|
-
metaExtension = '.permissionset-meta.xml'
|
|
172
|
-
break
|
|
173
|
-
case 'label':
|
|
174
|
-
type = 'labels'
|
|
175
|
-
metaExtension = '.labels-meta.xml'
|
|
176
|
-
break
|
|
177
|
-
case 'workflow':
|
|
178
|
-
type = 'workflows'
|
|
179
|
-
metaExtension = '.workflow-meta.xml'
|
|
180
|
-
break
|
|
181
|
-
default:
|
|
182
|
-
global.logger.error('Metadata type not supported: ' + type)
|
|
183
|
-
process.exit(1)
|
|
184
|
-
}
|
|
185
215
|
|
|
186
216
|
let sourceDir = argv.source || ''
|
|
187
217
|
let targetDir = argv.target || ''
|
|
@@ -189,14 +219,14 @@ yargs(hideBin(process.argv))
|
|
|
189
219
|
let all = argv.all
|
|
190
220
|
let packageDir = getRootPath(sourceDir)
|
|
191
221
|
|
|
192
|
-
if (type ==
|
|
193
|
-
name =
|
|
222
|
+
if (type == metaTypes.label.type) {
|
|
223
|
+
name = metaTypes.label.definition.root
|
|
194
224
|
}
|
|
195
|
-
sourceDir = path.join(global.__basedir, packageDir, 'main', 'default',
|
|
225
|
+
sourceDir = path.join(global.__basedir, packageDir, 'main', 'default', typeObj.definition.directory)
|
|
196
226
|
if (targetDir == '') {
|
|
197
|
-
targetDir = path.join(global.__basedir, packageDir + '-party', 'main', 'default',
|
|
227
|
+
targetDir = path.join(global.__basedir, packageDir + '-party', 'main', 'default', typeObj.definition.directory)
|
|
198
228
|
} else {
|
|
199
|
-
targetDir = path.join(targetDir, 'main', 'default',
|
|
229
|
+
targetDir = path.join(targetDir, 'main', 'default', typeObj.definition.directory)
|
|
200
230
|
}
|
|
201
231
|
let metaDirPath = sourceDir
|
|
202
232
|
console.log(`${chalk.bgBlackBright('Source path:')} ${sourceDir}`)
|
|
@@ -227,70 +257,27 @@ yargs(hideBin(process.argv))
|
|
|
227
257
|
console.log()
|
|
228
258
|
const promList = []
|
|
229
259
|
fileList.forEach(metaFile => {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
targetDir: targetDir,
|
|
248
|
-
metaFilePath: path.join(sourceDir, metaFile),
|
|
249
|
-
sequence: promList.length + 1,
|
|
250
|
-
})
|
|
251
|
-
const permProm = permSet.split()
|
|
252
|
-
promList.push(permProm)
|
|
253
|
-
permProm.then(() => {
|
|
254
|
-
global.processed.current++
|
|
255
|
-
})
|
|
256
|
-
break
|
|
257
|
-
case 'labels':
|
|
258
|
-
const label = new labelSplit.CustomLabel({
|
|
259
|
-
sourceDir: sourceDir,
|
|
260
|
-
targetDir: targetDir,
|
|
261
|
-
metaFilePath: path.join(sourceDir, metaFile),
|
|
262
|
-
sequence: promList.length + 1,
|
|
263
|
-
})
|
|
264
|
-
const labelProm = label.split()
|
|
265
|
-
promList.push(labelProm)
|
|
266
|
-
labelProm.then(() => {
|
|
267
|
-
global.processed.current++
|
|
268
|
-
})
|
|
269
|
-
break
|
|
270
|
-
case 'workflows':
|
|
271
|
-
const workflow = new workflowSplit.Split({
|
|
272
|
-
metadataDefinition: workflowDefinition.metadataDefinition,
|
|
273
|
-
sourceDir: sourceDir,
|
|
274
|
-
targetDir: targetDir,
|
|
275
|
-
metaFilePath: path.join(sourceDir, metaFile),
|
|
276
|
-
sequence: promList.length + 1,
|
|
277
|
-
})
|
|
278
|
-
const workflowProm = workflow.split()
|
|
279
|
-
promList.push(workflowProm)
|
|
280
|
-
workflowProm.then((resolve, reject) => {
|
|
281
|
-
if (resolve == false) {
|
|
282
|
-
global.processed.errors++
|
|
283
|
-
global.processed.current--
|
|
284
|
-
} else {
|
|
285
|
-
global.processed.current++
|
|
286
|
-
}
|
|
287
|
-
})
|
|
288
|
-
break
|
|
289
|
-
}
|
|
260
|
+
const metadataItem = new metadataSplit.Split({
|
|
261
|
+
metadataDefinition: typeObj.definition,
|
|
262
|
+
sourceDir: sourceDir,
|
|
263
|
+
targetDir: targetDir,
|
|
264
|
+
metaFilePath: path.join(sourceDir, metaFile),
|
|
265
|
+
sequence: promList.length + 1,
|
|
266
|
+
})
|
|
267
|
+
const metadataItemProm = metadataItem.split()
|
|
268
|
+
promList.push(metadataItemProm)
|
|
269
|
+
metadataItemProm.then((resolve, reject) => {
|
|
270
|
+
if (resolve == false) {
|
|
271
|
+
global.processed.errors++
|
|
272
|
+
global.processed.current--
|
|
273
|
+
} else {
|
|
274
|
+
global.processed.current++
|
|
275
|
+
}
|
|
276
|
+
})
|
|
290
277
|
})
|
|
291
278
|
Promise.allSettled(promList).then((results) => {
|
|
292
|
-
let message = `Split ${chalk.bgBlackBright(global.processed.current)} file(s) ${(global.processed.errors > 0) ? 'with ' + chalk.bgBlackBright.red(global.processed.errors) + ' error(s) ' : ''}in `
|
|
293
|
-
|
|
279
|
+
let message = `Split ${chalk.bgBlackBright((global.processed.current > promList.length) ? promList.length : global.processed.current)} file(s) ${(global.processed.errors > 0) ? 'with ' + chalk.bgBlackBright.red(global.processed.errors) + ' error(s) ' : ''}in `
|
|
280
|
+
displayMessageAndDuration(startTime, message)
|
|
294
281
|
})
|
|
295
282
|
}
|
|
296
283
|
})
|
|
@@ -349,7 +336,7 @@ yargs(hideBin(process.argv))
|
|
|
349
336
|
type: 'string',
|
|
350
337
|
}
|
|
351
338
|
})
|
|
352
|
-
.choices('type',
|
|
339
|
+
.choices('type', typeArray)
|
|
353
340
|
.choices('format', ['json', 'yaml'])
|
|
354
341
|
.check((argv, options) => {
|
|
355
342
|
const name = argv.name
|
|
@@ -375,26 +362,14 @@ yargs(hideBin(process.argv))
|
|
|
375
362
|
})
|
|
376
363
|
},
|
|
377
364
|
handler: (argv) => {
|
|
365
|
+
if (!typeArray.includes(argv.type)) {
|
|
366
|
+
global.logger.error('Metadata type not supported: ' + type)
|
|
367
|
+
process.exit(1)
|
|
368
|
+
}
|
|
378
369
|
let processList = []
|
|
379
370
|
global.format = argv.format
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
case 'profile':
|
|
383
|
-
type = 'profiles'
|
|
384
|
-
break
|
|
385
|
-
case 'permset':
|
|
386
|
-
type = 'permissionsets'
|
|
387
|
-
break
|
|
388
|
-
case 'label':
|
|
389
|
-
type = 'labels'
|
|
390
|
-
break
|
|
391
|
-
case 'workflow':
|
|
392
|
-
type = 'workflows'
|
|
393
|
-
break
|
|
394
|
-
default:
|
|
395
|
-
global.logger.error('Metadata type not supported: ' + type)
|
|
396
|
-
process.exit(1)
|
|
397
|
-
}
|
|
371
|
+
const typeObj = metaTypes[argv.type]
|
|
372
|
+
const type = typeObj.type
|
|
398
373
|
|
|
399
374
|
let sourceDir = argv.source || ''
|
|
400
375
|
let targetDir = argv.target || ''
|
|
@@ -402,19 +377,19 @@ yargs(hideBin(process.argv))
|
|
|
402
377
|
let all = argv.all
|
|
403
378
|
let packageDir = getRootPath(sourceDir)
|
|
404
379
|
|
|
405
|
-
sourceDir = path.join(global.__basedir, packageDir + '-party', 'main', 'default',
|
|
380
|
+
sourceDir = path.join(global.__basedir, packageDir + '-party', 'main', 'default', typeObj.definition.directory)
|
|
406
381
|
if (targetDir == '') {
|
|
407
|
-
targetDir = path.join(global.__basedir, packageDir, 'main', 'default',
|
|
382
|
+
targetDir = path.join(global.__basedir, packageDir, 'main', 'default', typeObj.definition.directory)
|
|
408
383
|
} else {
|
|
409
|
-
targetDir = path.join(targetDir, 'main', 'default',
|
|
384
|
+
targetDir = path.join(targetDir, 'main', 'default', typeObj.definition.directory)
|
|
410
385
|
}
|
|
411
386
|
|
|
412
387
|
console.log(`${chalk.bgBlackBright('Source path:')} ${sourceDir}`)
|
|
413
388
|
console.log(`${chalk.bgBlackBright('Target path:')} ${targetDir}`)
|
|
414
389
|
console.log()
|
|
415
390
|
|
|
416
|
-
if (type ==
|
|
417
|
-
processList
|
|
391
|
+
if (type == metaTypes.label.type) {
|
|
392
|
+
processList.push(metaTypes.label.definition.root)
|
|
418
393
|
} else if (!all) {
|
|
419
394
|
let metaDirPath = path.join(sourceDir, name)
|
|
420
395
|
if (!fileUtils.directoryExists(metaDirPath)) {
|
|
@@ -431,69 +406,33 @@ yargs(hideBin(process.argv))
|
|
|
431
406
|
console.log()
|
|
432
407
|
|
|
433
408
|
const promList = []
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
const profile = new profileCombine.Profile({
|
|
438
|
-
sourceDir: sourceDir,
|
|
439
|
-
targetDir: targetDir,
|
|
440
|
-
metaDir: metaDir,
|
|
441
|
-
sequence: promList.length + 1,
|
|
442
|
-
})
|
|
443
|
-
const profProm = profile.combine()
|
|
444
|
-
promList.push(profProm)
|
|
445
|
-
profProm.then(() => {
|
|
446
|
-
global.processed.current++
|
|
447
|
-
})
|
|
448
|
-
} else if (type == 'permissionsets') {
|
|
449
|
-
const permSet = new permSetCombine.Permset({
|
|
450
|
-
sourceDir: sourceDir,
|
|
451
|
-
targetDir: targetDir,
|
|
452
|
-
metaDir: metaDir,
|
|
453
|
-
sequence: promList.length + 1,
|
|
454
|
-
})
|
|
455
|
-
const permProm = permSet.combine()
|
|
456
|
-
promList.push(permProm)
|
|
457
|
-
permProm.then(() => {
|
|
458
|
-
global.processed.current++
|
|
459
|
-
})
|
|
460
|
-
} else if (type == 'workflows') {
|
|
461
|
-
const workflow = new workflowCombine.Combine({
|
|
462
|
-
metadataDefinition: workflowDefinition.metadataDefinition,
|
|
463
|
-
sourceDir: sourceDir,
|
|
464
|
-
targetDir: targetDir,
|
|
465
|
-
metaDir: metaDir,
|
|
466
|
-
sequence: promList.length + 1,
|
|
467
|
-
})
|
|
468
|
-
const workflowProm = workflow.combine()
|
|
469
|
-
promList.push(workflowProm)
|
|
470
|
-
workflowProm.then((resolve, reject) => {
|
|
471
|
-
global.processed.current++
|
|
472
|
-
})
|
|
473
|
-
}
|
|
474
|
-
})
|
|
475
|
-
} else if (type == 'labels') {
|
|
476
|
-
const label = new labelCombine.CustomLabel({
|
|
409
|
+
processList.forEach(metaDir => {
|
|
410
|
+
const metadataItem = new metadataCombine.Combine({
|
|
411
|
+
metadataDefinition: typeObj.definition,
|
|
477
412
|
sourceDir: sourceDir,
|
|
478
413
|
targetDir: targetDir,
|
|
479
|
-
metaDir:
|
|
480
|
-
|
|
414
|
+
metaDir: metaDir,
|
|
415
|
+
sequence: promList.length + 1,
|
|
481
416
|
})
|
|
482
|
-
const
|
|
483
|
-
promList.push(
|
|
484
|
-
|
|
417
|
+
const metadataItemProm = metadataItem.combine()
|
|
418
|
+
promList.push(metadataItemProm)
|
|
419
|
+
metadataItemProm.then((resolve, reject) => {
|
|
485
420
|
global.processed.current++
|
|
486
421
|
})
|
|
422
|
+
})
|
|
487
423
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
424
|
+
Promise.allSettled(promList).then((results) => {
|
|
425
|
+
let successes = 0
|
|
426
|
+
let errors = 0
|
|
427
|
+
results.forEach(result => {
|
|
428
|
+
if (result.value == true) {
|
|
429
|
+
successes++
|
|
430
|
+
} else if (result.value == false) {
|
|
431
|
+
errors++
|
|
432
|
+
}
|
|
433
|
+
})
|
|
434
|
+
let message = `Combined ${chalk.bgBlackBright(successes)} file(s) ${(errors > 0) ? 'with ' + chalk.bgBlackBright(errors) + 'error(s) ' : ''}in `
|
|
435
|
+
displayMessageAndDuration(startTime, message)
|
|
497
436
|
})
|
|
498
437
|
}
|
|
499
438
|
})
|
|
@@ -508,7 +447,7 @@ yargs(hideBin(process.argv))
|
|
|
508
447
|
.argv
|
|
509
448
|
.parse
|
|
510
449
|
|
|
511
|
-
function
|
|
450
|
+
function displayMessageAndDuration(startTime, message) {
|
|
512
451
|
const diff = process.hrtime.bigint() - BigInt(startTime)
|
|
513
452
|
let durationMessage
|
|
514
453
|
let executionTime = convertHrtime(diff);
|
|
@@ -37,23 +37,31 @@ export function deleteDirectory(dirPath, recursive = false) {
|
|
|
37
37
|
|
|
38
38
|
export function getFiles(dirPath, filter = undefined) {
|
|
39
39
|
const filesList = []
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} else {
|
|
44
|
-
if (file.endsWith(filter)) {
|
|
40
|
+
if (directoryExists(dirPath)) {
|
|
41
|
+
fs.readdirSync(dirPath).forEach(file => {
|
|
42
|
+
if (!filter) {
|
|
45
43
|
filesList.push(file)
|
|
44
|
+
} else {
|
|
45
|
+
if (file.endsWith(filter)) {
|
|
46
|
+
filesList.push(file)
|
|
47
|
+
}
|
|
46
48
|
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
})
|
|
50
|
+
filesList.sort()
|
|
51
|
+
return filesList
|
|
52
|
+
} else {
|
|
53
|
+
return []
|
|
54
|
+
}
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
export function getDirectories(dirPath) {
|
|
54
|
-
|
|
58
|
+
if (directoryExists(dirPath)) {
|
|
59
|
+
return fs.readdirSync(dirPath, { withFileTypes: true })
|
|
55
60
|
.filter(dirent => dirent.isDirectory())
|
|
56
61
|
.map(dirent => dirent.name)
|
|
62
|
+
} else {
|
|
63
|
+
return []
|
|
64
|
+
}
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
export function deleteFile(filePath) {
|
|
@@ -6,7 +6,7 @@ import chalk from 'chalk'
|
|
|
6
6
|
import convertHrtime from 'convert-hrtime'
|
|
7
7
|
import cliSpinners from 'cli-spinners'
|
|
8
8
|
import * as fileUtils from '../fileUtils.js'
|
|
9
|
-
import { permsetDefinition } from '
|
|
9
|
+
import { permsetDefinition } from '../../meta/PermissionSets.js'
|
|
10
10
|
import * as xml2js from 'xml2js'
|
|
11
11
|
import * as yaml from 'js-yaml'
|
|
12
12
|
|
|
@@ -84,7 +84,7 @@ export class Permset {
|
|
|
84
84
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
85
85
|
.replace('[%2]', `\n${chalk.magentaBright(nextFrame(that))} ${key}`)
|
|
86
86
|
.replace('[%3]', `${that.#errorMessage}`)
|
|
87
|
-
.replace('[%4]', `${global.
|
|
87
|
+
.replace('[%4]', `${global.icons.working} `)
|
|
88
88
|
)
|
|
89
89
|
|
|
90
90
|
switch (myLocation) {
|
|
@@ -116,7 +116,7 @@ export class Permset {
|
|
|
116
116
|
if (permsetDefinition.singleFiles.includes(key)) {
|
|
117
117
|
genericXML(that, key)
|
|
118
118
|
} else {
|
|
119
|
-
that.#errorMessage += `\n${global.
|
|
119
|
+
that.#errorMessage += `\n${global.icons.warn} Not processed: ${key}`
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
}
|
|
@@ -131,7 +131,7 @@ export class Permset {
|
|
|
131
131
|
genericDirectoryXML(that, key)
|
|
132
132
|
break
|
|
133
133
|
} else {
|
|
134
|
-
that.#errorMessage += `\n${global.
|
|
134
|
+
that.#errorMessage += `\n${global.icons.warn} Not processed: ${key}`
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -154,7 +154,7 @@ export class Permset {
|
|
|
154
154
|
|
|
155
155
|
let executionTime = getTimeDiff(BigInt(that.#startTime))
|
|
156
156
|
let durationMessage = `${executionTime.seconds}.${executionTime.milliseconds}s`
|
|
157
|
-
let stateIcon = (that.#errorMessage == '') ? global.
|
|
157
|
+
let stateIcon = (that.#errorMessage == '') ? global.icons.success : global.icons.fail
|
|
158
158
|
logUpdate(that.#spinnerMessage
|
|
159
159
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
160
160
|
.replace('[%2]', `. Processed in ${durationMessage}.`)
|
|
@@ -11,7 +11,7 @@ import convertHrtime from 'convert-hrtime'
|
|
|
11
11
|
import cliSpinners from 'cli-spinners'
|
|
12
12
|
import * as yaml from 'js-yaml'
|
|
13
13
|
import * as fileUtils from '../fileUtils.js'
|
|
14
|
-
import { permsetDefinition } from '
|
|
14
|
+
import { permsetDefinition } from '../../meta/PermissionSets.js'
|
|
15
15
|
|
|
16
16
|
const spinner = cliSpinners['dots']
|
|
17
17
|
|
|
@@ -131,7 +131,7 @@ export class Permset {
|
|
|
131
131
|
function completeFile(that) {
|
|
132
132
|
let executionTime = getTimeDiff(BigInt(that.#startTime))
|
|
133
133
|
let durationMessage = `${executionTime.seconds}.${executionTime.milliseconds}s`
|
|
134
|
-
let stateIcon = (that.#errorMessage == '') ? global.
|
|
134
|
+
let stateIcon = (that.#errorMessage == '') ? global.icons.success : global.icons.fail
|
|
135
135
|
logUpdate(that.#spinnerMessage
|
|
136
136
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
137
137
|
.replace('[%2]', `. Processed in ${durationMessage}.`)
|
|
@@ -156,7 +156,7 @@ export class Permset {
|
|
|
156
156
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
157
157
|
.replace('[%2]', `\n${chalk.magentaBright(nextFrame(that))} ${key}`)
|
|
158
158
|
.replace('[%3]', `${that.#errorMessage}`)
|
|
159
|
-
.replace('[%4]', `${global.
|
|
159
|
+
.replace('[%4]', `${global.icons.working} `)
|
|
160
160
|
)
|
|
161
161
|
if (permsetDefinition.directories.includes(key)) {
|
|
162
162
|
processDirectory(that, key)
|
|
@@ -164,7 +164,7 @@ export class Permset {
|
|
|
164
164
|
singleFile(that, key)
|
|
165
165
|
} else {
|
|
166
166
|
if (!permsetDefinition.ignore.includes(key) && !permsetDefinition.main.includes(key)) {
|
|
167
|
-
that.#errorMessage += `\n${global.
|
|
167
|
+
that.#errorMessage += `\n${global.icons.warn} Not processed: ${key}`
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
})
|
|
@@ -6,7 +6,7 @@ import chalk from 'chalk'
|
|
|
6
6
|
import convertHrtime from 'convert-hrtime'
|
|
7
7
|
import cliSpinners from 'cli-spinners'
|
|
8
8
|
import * as fileUtils from '../fileUtils.js'
|
|
9
|
-
import { profileDefinition } from '
|
|
9
|
+
import { profileDefinition } from '../../meta/Profiles.js'
|
|
10
10
|
import * as xml2js from 'xml2js'
|
|
11
11
|
import * as yaml from 'js-yaml'
|
|
12
12
|
|
|
@@ -85,7 +85,7 @@ export class Profile {
|
|
|
85
85
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
86
86
|
.replace('[%2]', `\n${chalk.magentaBright(nextFrame(that))} ${key}`)
|
|
87
87
|
.replace('[%3]', `${that.#errorMessage}`)
|
|
88
|
-
.replace('[%4]', `${global.
|
|
88
|
+
.replace('[%4]', `${global.icons.working} `)
|
|
89
89
|
)
|
|
90
90
|
|
|
91
91
|
switch (myLocation) {
|
|
@@ -124,7 +124,7 @@ export class Profile {
|
|
|
124
124
|
genericXML(that, key)
|
|
125
125
|
break
|
|
126
126
|
} else {
|
|
127
|
-
that.#errorMessage += `\n${global.
|
|
127
|
+
that.#errorMessage += `\n${global.icons.warn} Not processed: ${key}`
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
130
|
}
|
|
@@ -140,7 +140,7 @@ export class Profile {
|
|
|
140
140
|
genericDirectoryXML(that, key)
|
|
141
141
|
break
|
|
142
142
|
} else {
|
|
143
|
-
that.#errorMessage += `\n${global.
|
|
143
|
+
that.#errorMessage += `\n${global.icons.warn} Not processed: ${key}`
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
|
|
@@ -163,7 +163,7 @@ export class Profile {
|
|
|
163
163
|
|
|
164
164
|
let executionTime = getTimeDiff(BigInt(that.#startTime))
|
|
165
165
|
let durationMessage = `${executionTime.seconds}.${executionTime.milliseconds}s`
|
|
166
|
-
let stateIcon = (that.#errorMessage == '') ? global.
|
|
166
|
+
let stateIcon = (that.#errorMessage == '') ? global.icons.success : global.icons.fail
|
|
167
167
|
logUpdate(that.#spinnerMessage
|
|
168
168
|
.replace('[%1]', that.sequence.toString().padStart(global.processed.total.toString().length, ' '))
|
|
169
169
|
.replace('[%2]', `. Processed in ${durationMessage}.`)
|
|
@@ -11,7 +11,7 @@ import convertHrtime from 'convert-hrtime'
|
|
|
11
11
|
import cliSpinners from 'cli-spinners'
|
|
12
12
|
import * as yaml from 'js-yaml'
|
|
13
13
|
import * as fileUtils from '../fileUtils.js'
|
|
14
|
-
import { profileDefinition } from '
|
|
14
|
+
import { profileDefinition } from '../../meta/Profiles.js'
|
|
15
15
|
|
|
16
16
|
const spinner = cliSpinners['dots']
|
|
17
17
|
let spinnerFrame = spinner.frames[0]
|