1
- var parse = function ( obj , path ) {
1
+ var parse = function ( obj , path , region , cloud , accountId , resourceId ) {
2
2
//(Array.isArray(obj)) return [obj];
3
3
if ( typeof path == 'string' && path . includes ( '.' ) ) path = path . split ( '.' ) ;
4
4
if ( Array . isArray ( path ) && path . length && typeof obj === 'object' ) {
@@ -22,12 +22,37 @@ var parse = function(obj, path) {
22
22
}
23
23
if ( obj [ localPath ] || typeof obj [ localPath ] === 'boolean' ) {
24
24
return parse ( obj [ localPath ] , path ) ;
25
- } else {
26
- return [ 'not set' ] ;
27
- }
25
+ } else return [ 'not set' ] ;
28
26
} else if ( ! Array . isArray ( obj ) && path && path . length ) {
29
27
if ( obj [ path ] ) return [ obj [ path ] ] ;
30
- else return [ 'not set' ] ;
28
+ else {
29
+ if ( cloud === 'aws' && path . startsWith ( 'arn:aws' ) ) {
30
+ const template_string = path ;
31
+ const placeholders = template_string . match ( / { ( [ ^ { } ] + ) } / g) ;
32
+ let extracted_values = [ ] ;
33
+ if ( placeholders ) {
34
+ extracted_values = placeholders . map ( placeholder => {
35
+ const key = placeholder . slice ( 1 , - 1 ) ;
36
+ if ( key === 'value' ) return [ obj ] [ 0 ] ;
37
+ else return obj [ key ] ;
38
+ } ) ;
39
+ }
40
+ // Replace other variables
41
+ let converted_string = template_string
42
+ . replace ( / \{ r e g i o n \} / g, region )
43
+ . replace ( / \{ c l o u d A c c o u n t \} / g, accountId )
44
+ . replace ( / \{ r e s o u r c e I d \} / g, resourceId ) ;
45
+ placeholders . forEach ( ( placeholder , index ) => {
46
+ if ( index === placeholders . length - 1 ) {
47
+ converted_string = converted_string . replace ( placeholder , extracted_values . pop ( ) ) ;
48
+ } else {
49
+ converted_string = converted_string . replace ( placeholder , extracted_values . shift ( ) ) ;
50
+ }
51
+ } ) ;
52
+ path = converted_string ;
53
+ return [ path ] ;
54
+ } else return [ 'not set' ] ;
55
+ }
31
56
} else if ( Array . isArray ( obj ) ) {
32
57
return [ obj ] ;
33
58
} else {
@@ -375,7 +400,7 @@ var runValidation = function(obj, condition, inputResultsArr, nestedResultArr) {
375
400
return resultObj ;
376
401
} ;
377
402
378
- var runConditions = function ( input , data , results , resourcePath , resourceName , region ) {
403
+ var runConditions = function ( input , data , results , resourcePath , resourceName , region , cloud , accountId ) {
379
404
let dataToValidate ;
380
405
let newPath ;
381
406
let newData ;
@@ -401,12 +426,12 @@ var runConditions = function(input, data, results, resourcePath, resourceName, r
401
426
if ( dataToValidate . length ) {
402
427
dataToValidate . forEach ( newData => {
403
428
condition . validated = runValidation ( newData , condition , inputResultsArr ) ;
404
- parsedResource = parse ( newData , resourcePath ) [ 0 ] ;
429
+ parsedResource = parse ( newData , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
405
430
if ( typeof parsedResource !== 'string' || parsedResource === 'not set' ) parsedResource = resourceName ;
406
431
} ) ;
407
432
} else {
408
433
condition . validated = runValidation ( [ ] , condition , inputResultsArr ) ;
409
- parsedResource = parse ( [ ] , resourcePath ) [ 0 ] ;
434
+ parsedResource = parse ( [ ] , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
410
435
if ( typeof parsedResource !== 'string' || parsedResource === 'not set' ) parsedResource = resourceName ;
411
436
}
412
437
// result per resource
@@ -418,13 +443,13 @@ var runConditions = function(input, data, results, resourcePath, resourceName, r
418
443
newData . forEach ( dataElm => {
419
444
if ( newPath ) condition . property = JSON . parse ( JSON . stringify ( newPath ) ) ;
420
445
condition . validated = runValidation ( dataElm , condition , inputResultsArr ) ;
421
- parsedResource = parse ( dataElm , resourcePath ) [ 0 ] ;
446
+ parsedResource = parse ( dataElm , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
422
447
if ( typeof parsedResource !== 'string' || parsedResource === 'not set' ) parsedResource = resourceName ;
423
448
} ) ;
424
449
} else if ( newPath && ! newData . length ) {
425
450
condition . property = JSON . parse ( JSON . stringify ( newPath ) ) ;
426
451
condition . validated = runValidation ( newData , condition , inputResultsArr ) ;
427
- parsedResource = parse ( newData , resourcePath ) [ 0 ] ;
452
+ parsedResource = parse ( newData , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
428
453
if ( parsedResource === 'not set' || typeof parsedResource !== 'string' ) parsedResource = resourceName ;
429
454
} else if ( ! newPath ) {
430
455
// no path returned. means it has fully parsed and got the value.
@@ -435,23 +460,23 @@ var runConditions = function(input, data, results, resourcePath, resourceName, r
435
460
}
436
461
condition . validated = runValidation ( newData , condition , inputResultsArr ) ;
437
462
condition . property = JSON . parse ( JSON . stringify ( newPath ) ) ;
438
- parsedResource = parse ( newData , resourcePath ) [ 0 ] ;
463
+ parsedResource = parse ( newData , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
439
464
if ( parsedResource === 'not set' || typeof parsedResource !== 'string' ) parsedResource = resourceName ;
440
465
}
441
466
}
442
467
} else {
443
468
dataToValidate = parse ( data , condition . property ) ;
444
469
if ( dataToValidate . length === 1 ) {
445
470
validated = runValidation ( data , condition , inputResultsArr ) ;
446
- parsedResource = parse ( data , resourcePath ) [ 0 ] ;
471
+ parsedResource = parse ( data , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
447
472
if ( typeof parsedResource !== 'string' || parsedResource === 'not set' ) parsedResource = resourceName ;
448
473
} else {
449
474
newPath = dataToValidate [ 1 ] ;
450
475
newData = dataToValidate [ 0 ] ;
451
476
condition . property = newPath ;
452
477
newData . forEach ( element => {
453
478
condition . validated = runValidation ( element , condition , inputResultsArr ) ;
454
- parsedResource = parse ( data , resourcePath ) [ 0 ] ;
479
+ parsedResource = parse ( data , resourcePath , region , cloud , accountId , resourceName ) [ 0 ] ;
455
480
if ( typeof parsedResource !== 'string' || parsedResource === 'not set' ) parsedResource = null ;
456
481
457
482
results . push ( {
@@ -468,11 +493,10 @@ var runConditions = function(input, data, results, resourcePath, resourceName, r
468
493
compositeResult ( inputResultsArr , parsedResource , region , results , logical ) ;
469
494
} ;
470
495
471
- var asl = function ( source , input , resourceMap , callback ) {
496
+ var asl = function ( source , input , resourceMap , cloud , accountId , callback ) {
472
497
if ( ! source || ! input ) return callback ( 'No source or input provided' ) ;
473
498
if ( ! input . apis || ! input . apis [ 0 ] ) return callback ( 'No APIs provided for input' ) ;
474
499
if ( ! input . conditions || ! input . conditions . length ) return callback ( 'No conditions provided for input' ) ;
475
-
476
500
let service = input . conditions [ 0 ] . service ;
477
501
var subService = ( input . conditions [ 0 ] . subservice ) ? input . conditions [ 0 ] . subservice : null ;
478
502
let api = input . conditions [ 0 ] . api ;
@@ -502,8 +526,8 @@ var asl = function(source, input, resourceMap, callback) {
502
526
} ) ;
503
527
} else if ( regionVal . data && regionVal . data . length ) {
504
528
regionVal . data . forEach ( function ( regionData ) {
505
- var resourceName = parse ( regionData , resourcePath ) [ 0 ] ;
506
- runConditions ( input , regionData , results , resourcePath , resourceName , region ) ;
529
+ var resourceName = parse ( regionData , resourcePath , region , cloud , accountId ) [ 0 ] ;
530
+ runConditions ( input , regionData , results , resourcePath , resourceName , region , cloud , accountId ) ;
507
531
} ) ;
508
532
} else if ( regionVal . data && Object . keys ( regionVal . data ) . length ) {
509
533
runConditions ( input , regionVal . data , results , resourcePath , '' , region ) ;
@@ -527,11 +551,12 @@ var asl = function(source, input, resourceMap, callback) {
527
551
} else {
528
552
if ( resourceObj . data && resourceObj . data . length ) {
529
553
resourceObj . data . forEach ( function ( regionData ) {
530
- var resourceName = parse ( regionData , resourcePath ) [ 0 ] ;
531
- runConditions ( input , regionData , results , resourcePath , resourceName , region ) ;
554
+ var resourceName = parse ( regionData , resourcePath , region , cloud , accountId ) [ 0 ] ;
555
+ runConditions ( input , regionData , results , resourcePath , resourceName , region , cloud , accountId ) ;
532
556
} ) ;
533
557
} else {
534
- runConditions ( input , resourceObj . data , results , resourcePath , resourceName , region ) ;
558
+
559
+ runConditions ( input , resourceObj . data , results , resourcePath , resourceName , region , cloud , accountId ) ;
535
560
}
536
561
}
537
562
}
0 commit comments