@sureshgururajan/aws-console-private-access-validator 1.0.4 → 1.0.5
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/README.md +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js.map +0 -0
- package/dist/test.d.ts +0 -0
- package/dist/test.d.ts.map +0 -0
- package/dist/test.js +0 -0
- package/dist/test.js.map +0 -0
- package/dist/types.d.ts +0 -0
- package/dist/types.d.ts.map +0 -0
- package/dist/types.js +0 -0
- package/dist/types.js.map +0 -0
- package/dist/validator.d.ts +0 -0
- package/dist/validator.d.ts.map +0 -0
- package/dist/validator.js +3 -1
- package/dist/validator.js.map +1 -1
- package/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +85 -0
- package/src/index.ts +0 -0
- package/src/test.d.ts +1 -0
- package/src/test.js +26 -0
- package/src/test.ts +0 -0
- package/src/types.d.ts +16 -0
- package/src/types.js +2 -0
- package/src/types.ts +0 -0
- package/src/validator.d.ts +18 -0
- package/src/validator.js +236 -0
- package/src/validator.ts +0 -0
- package/tsconfig.json +3 -3
package/README.md
CHANGED
|
File without changes
|
package/dist/index.d.ts
CHANGED
|
File without changes
|
package/dist/index.d.ts.map
CHANGED
|
File without changes
|
package/dist/index.js.map
CHANGED
|
File without changes
|
package/dist/test.d.ts
CHANGED
|
File without changes
|
package/dist/test.d.ts.map
CHANGED
|
File without changes
|
package/dist/test.js
CHANGED
|
File without changes
|
package/dist/test.js.map
CHANGED
|
File without changes
|
package/dist/types.d.ts
CHANGED
|
File without changes
|
package/dist/types.d.ts.map
CHANGED
|
File without changes
|
package/dist/types.js
CHANGED
|
File without changes
|
package/dist/types.js.map
CHANGED
|
File without changes
|
package/dist/validator.d.ts
CHANGED
|
File without changes
|
package/dist/validator.d.ts.map
CHANGED
|
File without changes
|
package/dist/validator.js
CHANGED
package/dist/validator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,6BAA6B;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,6BAA6B;IAChC,QAAQ,CAAyB;IACjC,MAAM,CAAS;IACf,MAAM,GAAsB,EAAE,CAAC;IAEvC,YAAY,QAAgC,EAAE,SAAiB,WAAW;QACxE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC;QAE9B,OAAO;YACL,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC;SAChD,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,WAAgB;QACrC,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,4DAA4D;gBAC5D,OAAO,KAAK;qBACT,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;oBACjB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,IAAI,IAAI,EAAE,GAAG,KAAK,aAAa,EAAE,CAAC;wBAChC,OAAO,IAAI,CAAC,MAAM,CAAC;oBACrB,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;qBACD,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,iBAAiB;QACvB,MAAM,iBAAiB,GAAG;YACxB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,MAAM,UAAU,EAAE;YACpE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,MAAM,SAAS,EAAE;YAClE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,MAAM,MAAM,EAAE;YAC5D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,MAAM,cAAc,EAAE;YAC5E,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,MAAM,cAAc,EAAE;SAC7E,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACxD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,KAAK,WAAW,CAChG,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBACnE,OAAO,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,iBAAiB,QAAQ,CAAC,IAAI,EAAE;gBACtC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBAC/B,OAAO,EAAE,KAAK;oBACZ,CAAC,CAAC,8BAA8B,QAAQ,CAAC,IAAI,QAAQ;oBACrD,CAAC,CAAC,sCAAsC,QAAQ,CAAC,IAAI,EAAE;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAC7C,CAAC,CAAM,EAAE,EAAE;YACT,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACnE,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,uBAAuB;gBAClC,CAAC,CAAC,UAAU,EAAE,eAAe,KAAK,SAAS;gBAC3C,WAAW;gBACX,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC3B,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,0BAA0B;YAChC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACnC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,iCAAiC;SACzF,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CACpD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAgB,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACnE,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,uBAAuB;gBAClC,WAAW;gBACX,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAChC,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CACnD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAgB,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACnE,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,uBAAuB;gBAClC,WAAW;gBACX,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC/B,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI;YAC7B,CAAC,SAAS,EAAE,eAAe,CAAC;YAC5B,CAAC,QAAQ,EAAE,cAAc,CAAC;SAC3B,EAAE,CAAC;YACF,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAyB,CAAC;YAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;YAEtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,oBAAoB,IAAI,EAAE;gBAChC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACnC,OAAO,EAAE,SAAS;oBAChB,CAAC,CAAC,GAAG,IAAI,iCAAiC;oBAC1C,CAAC,CAAC,GAAG,IAAI,+BAA+B;gBAC1C,OAAO,EAAE,SAAS;oBAChB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;oBAChE,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,MAAW;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,mBAAmB,GAAG,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,sBAAsB,CAAC,CAAC;QAExF,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,gDAAgD,CAAC;QAC1D,CAAC;QAED,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAEO,uBAAuB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACjD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,CAClD,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,wBAAwB,EAAE,uBAAuB,CAAC,CAAC;QAE1E,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE;gBACzC,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;gBACrC,6CAA6C;gBAC7C,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,wBAAwB,IAAI,EAAE;gBACpC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBAC/B,OAAO,EAAE,KAAK;oBACZ,CAAC,CAAC,2BAA2B,IAAI,QAAQ;oBACzC,CAAC,CAAC,mCAAmC,IAAI,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAChD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB,CACjD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAClD,OAAO,EACL,UAAU,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,kBAAkB;gBAC9C,CAAC,CAAC,0BAA0B;SACjC,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB,CACjD,CAAC;QAEF,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,EAAE,oBAAoB,IAAI,EAAE,CAAC;YAC1D,OAAO,OAAO,CAAC,IAAI,CACjB,CAAC,IAAS,EAAE,EAAE,CACZ,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC;gBACpD,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CACrD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,8BAA8B;YACpC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC5C,OAAO,EAAE,eAAe;gBACtB,CAAC,CAAC,gDAAgD;gBAClD,CAAC,CAAC,mDAAmD;SACxD,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;QAE5F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACrC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kCAAkC;SAC9E,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAI,QAAgB,CAAC,UAAU,EAAE,kBAAkB,CAAC;YACpE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACvC,OAAO,EAAE,UAAU;oBACjB,CAAC,CAAC,uCAAuC;oBACzC,CAAC,CAAC,2CAA2C;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;QAEhG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACvC,OAAO,EAAE,UAAU;gBACjB,CAAC,CAAC,6CAA6C;gBAC/C,CAAC,CAAC,oEAAoE;SACzE,CAAC,CAAC;IACL,CAAC;IAEO,yBAAyB;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;QAEhD,4BAA4B;QAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,IAAI,KAAK,kBAAkB;YAC7B,CAAC,CAAC,CAAC,UAAU,EAAE,mBAAmB,CACrC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACnD,OAAO,EACL,cAAc,CAAC,MAAM,GAAG,CAAC;gBACvB,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,oBAAoB;gBACpD,CAAC,CAAC,0BAA0B;SACjC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACjD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAC9C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACnD,OAAO,EACL,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,iBAAiB;gBAC9C,CAAC,CAAC,uBAAuB;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,KAAc,EAAE,SAAiB;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAE5E,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,oDAAoD,SAAS,YAAY,YAAY,aAAa,CAAC;QAC5G,CAAC;QAED,OAAO,wBAAwB,SAAS,qBAAqB,SAAS,YAAY,YAAY,YAAY,CAAC;IAC7G,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/src/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { ConsolePrivateAccessValidator } from './validator.js';
|
|
5
|
+
const server = new Server({
|
|
6
|
+
name: 'aws-console-private-access-validator',
|
|
7
|
+
version: '1.0.0',
|
|
8
|
+
}, {
|
|
9
|
+
capabilities: {
|
|
10
|
+
tools: {},
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
const tools = [
|
|
14
|
+
{
|
|
15
|
+
name: 'validate-cloudformation',
|
|
16
|
+
description: 'Validates a CloudFormation template for AWS Console Private Access requirements',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
template: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'CloudFormation template as JSON string',
|
|
23
|
+
},
|
|
24
|
+
region: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'AWS region (default: us-east-1)',
|
|
27
|
+
default: 'us-east-1',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['template'],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
35
|
+
tools,
|
|
36
|
+
}));
|
|
37
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
38
|
+
if (request.params.name === 'validate-cloudformation') {
|
|
39
|
+
const { template, region = 'us-east-1' } = request.params.arguments;
|
|
40
|
+
try {
|
|
41
|
+
const parsedTemplate = JSON.parse(template);
|
|
42
|
+
const validator = new ConsolePrivateAccessValidator(parsedTemplate, region);
|
|
43
|
+
const result = validator.validate();
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: JSON.stringify(result, null, 2),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: JSON.stringify({
|
|
60
|
+
valid: false,
|
|
61
|
+
checks: [],
|
|
62
|
+
summary: `Error parsing template: ${errorMessage}`,
|
|
63
|
+
}, null, 2),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: 'text',
|
|
74
|
+
text: `Unknown tool: ${request.params.name}`,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
async function main() {
|
|
81
|
+
const transport = new StdioServerTransport();
|
|
82
|
+
await server.connect(transport);
|
|
83
|
+
}
|
|
84
|
+
main().catch(console.error);
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixzQkFBc0IsR0FFdkIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FDdkI7SUFDRSxJQUFJLEVBQUUsc0NBQXNDO0lBQzVDLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLEVBQ0Q7SUFDRSxZQUFZLEVBQUU7UUFDWixLQUFLLEVBQUUsRUFBRTtLQUNWO0NBQ0YsQ0FDRixDQUFDO0FBRUYsTUFBTSxLQUFLLEdBQVc7SUFDcEI7UUFDRSxJQUFJLEVBQUUseUJBQXlCO1FBQy9CLFdBQVcsRUFDVCxpRkFBaUY7UUFDbkYsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLFFBQWlCO1lBQ3ZCLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUU7b0JBQ1IsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsV0FBVyxFQUFFLHdDQUF3QztpQkFDdEQ7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksRUFBRSxRQUFRO29CQUNkLFdBQVcsRUFBRSxpQ0FBaUM7b0JBQzlDLE9BQU8sRUFBRSxXQUFXO2lCQUNyQjthQUNGO1lBQ0QsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ3ZCO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RCxLQUFLO0NBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSixNQUFNLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2hFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBR3pELENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FBMkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLDZCQUE2QixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1RSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFcEMsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ3RDO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVFLE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUNsQjs0QkFDRSxLQUFLLEVBQUUsS0FBSzs0QkFDWixNQUFNLEVBQUUsRUFBRTs0QkFDVixPQUFPLEVBQUUsMkJBQTJCLFlBQVksRUFBRTt5QkFDbkQsRUFDRCxJQUFJLEVBQ0osQ0FBQyxDQUNGO3FCQUNGO2lCQUNGO2dCQUNELE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRTtZQUNQO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxpQkFBaUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7YUFDN0M7U0FDRjtRQUNELE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO0lBQzdDLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZlciB9IGZyb20gJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL2luZGV4LmpzJztcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSAnQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvc3RkaW8uanMnO1xuaW1wb3J0IHtcbiAgQ2FsbFRvb2xSZXF1ZXN0U2NoZW1hLFxuICBMaXN0VG9vbHNSZXF1ZXN0U2NoZW1hLFxuICBUb29sLFxufSBmcm9tICdAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3R5cGVzLmpzJztcbmltcG9ydCB7IENvbnNvbGVQcml2YXRlQWNjZXNzVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBzZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICB7XG4gICAgbmFtZTogJ2F3cy1jb25zb2xlLXByaXZhdGUtYWNjZXNzLXZhbGlkYXRvcicsXG4gICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgfSxcbiAge1xuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgdG9vbHM6IHt9LFxuICAgIH0sXG4gIH1cbik7XG5cbmNvbnN0IHRvb2xzOiBUb29sW10gPSBbXG4gIHtcbiAgICBuYW1lOiAndmFsaWRhdGUtY2xvdWRmb3JtYXRpb24nLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1ZhbGlkYXRlcyBhIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBBV1MgQ29uc29sZSBQcml2YXRlIEFjY2VzcyByZXF1aXJlbWVudHMnLFxuICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICB0eXBlOiAnb2JqZWN0JyBhcyBjb25zdCxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdGVtcGxhdGU6IHtcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Nsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGFzIEpTT04gc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaW9uOiB7XG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdBV1MgcmVnaW9uIChkZWZhdWx0OiB1cy1lYXN0LTEpJyxcbiAgICAgICAgICBkZWZhdWx0OiAndXMtZWFzdC0xJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogWyd0ZW1wbGF0ZSddLFxuICAgIH0sXG4gIH0sXG5dO1xuXG5zZXJ2ZXIuc2V0UmVxdWVzdEhhbmRsZXIoTGlzdFRvb2xzUmVxdWVzdFNjaGVtYSwgYXN5bmMgKCkgPT4gKHtcbiAgdG9vbHMsXG59KSk7XG5cbnNlcnZlci5zZXRSZXF1ZXN0SGFuZGxlcihDYWxsVG9vbFJlcXVlc3RTY2hlbWEsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gIGlmIChyZXF1ZXN0LnBhcmFtcy5uYW1lID09PSAndmFsaWRhdGUtY2xvdWRmb3JtYXRpb24nKSB7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgcmVnaW9uID0gJ3VzLWVhc3QtMScgfSA9IHJlcXVlc3QucGFyYW1zLmFyZ3VtZW50cyBhcyB7XG4gICAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkVGVtcGxhdGU6IENsb3VkRm9ybWF0aW9uVGVtcGxhdGUgPSBKU09OLnBhcnNlKHRlbXBsYXRlKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5ldyBDb25zb2xlUHJpdmF0ZUFjY2Vzc1ZhbGlkYXRvcihwYXJzZWRUZW1wbGF0ZSwgcmVnaW9uKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEVycm9yIHBhcnNpbmcgdGVtcGxhdGU6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgdGV4dDogYFVua25vd24gdG9vbDogJHtyZXF1ZXN0LnBhcmFtcy5uYW1lfWAsXG4gICAgICB9LFxuICAgIF0sXG4gICAgaXNFcnJvcjogdHJ1ZSxcbiAgfTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcbiAgYXdhaXQgc2VydmVyLmNvbm5lY3QodHJhbnNwb3J0KTtcbn1cblxubWFpbigpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIl19
|
package/src/index.ts
CHANGED
|
File without changes
|
package/src/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/src/test.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { ConsolePrivateAccessValidator } from './validator.js';
|
|
3
|
+
// Read the CloudFormation template
|
|
4
|
+
const templatePath = process.argv[2] || '/tmp/template.json';
|
|
5
|
+
const templateContent = fs.readFileSync(templatePath, 'utf-8');
|
|
6
|
+
const template = JSON.parse(templateContent);
|
|
7
|
+
// Run validation
|
|
8
|
+
const validator = new ConsolePrivateAccessValidator(template, 'us-east-1');
|
|
9
|
+
const result = validator.validate();
|
|
10
|
+
// Print results
|
|
11
|
+
console.log('\n=== AWS Console Private Access Validation Results ===\n');
|
|
12
|
+
console.log(`Valid: ${result.valid ? '✓ YES' : '✗ NO'}\n`);
|
|
13
|
+
console.log('Checks:');
|
|
14
|
+
result.checks.forEach((check) => {
|
|
15
|
+
const icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '⚠';
|
|
16
|
+
console.log(` ${icon} ${check.name}`);
|
|
17
|
+
console.log(` Status: ${check.status}`);
|
|
18
|
+
console.log(` Message: ${check.message}`);
|
|
19
|
+
if (check.details) {
|
|
20
|
+
console.log(` Details: ${check.details}`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
console.log(`\nSummary: ${result.summary}\n`);
|
|
24
|
+
// Exit with appropriate code
|
|
25
|
+
process.exit(result.valid ? 0 : 1);
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELG1DQUFtQztBQUNuQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO0FBQzdELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFN0MsaUJBQWlCO0FBQ2pCLE1BQU0sU0FBUyxHQUFHLElBQUksNkJBQTZCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUVwQyxnQkFBZ0I7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0FBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFFM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQzlCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNqRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFFOUMsNkJBQTZCO0FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBDb25zb2xlUHJpdmF0ZUFjY2Vzc1ZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9yLmpzJztcblxuLy8gUmVhZCB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbmNvbnN0IHRlbXBsYXRlUGF0aCA9IHByb2Nlc3MuYXJndlsyXSB8fCAnL3RtcC90ZW1wbGF0ZS5qc29uJztcbmNvbnN0IHRlbXBsYXRlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGYtOCcpO1xuY29uc3QgdGVtcGxhdGUgPSBKU09OLnBhcnNlKHRlbXBsYXRlQ29udGVudCk7XG5cbi8vIFJ1biB2YWxpZGF0aW9uXG5jb25zdCB2YWxpZGF0b3IgPSBuZXcgQ29uc29sZVByaXZhdGVBY2Nlc3NWYWxpZGF0b3IodGVtcGxhdGUsICd1cy1lYXN0LTEnKTtcbmNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXG4vLyBQcmludCByZXN1bHRzXG5jb25zb2xlLmxvZygnXFxuPT09IEFXUyBDb25zb2xlIFByaXZhdGUgQWNjZXNzIFZhbGlkYXRpb24gUmVzdWx0cyA9PT1cXG4nKTtcbmNvbnNvbGUubG9nKGBWYWxpZDogJHtyZXN1bHQudmFsaWQgPyAn4pyTIFlFUycgOiAn4pyXIE5PJ31cXG5gKTtcblxuY29uc29sZS5sb2coJ0NoZWNrczonKTtcbnJlc3VsdC5jaGVja3MuZm9yRWFjaCgoY2hlY2spID0+IHtcbiAgY29uc3QgaWNvbiA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ+KckycgOiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyA/ICfinJcnIDogJ+KaoCc7XG4gIGNvbnNvbGUubG9nKGAgICR7aWNvbn0gJHtjaGVjay5uYW1lfWApO1xuICBjb25zb2xlLmxvZyhgICAgIFN0YXR1czogJHtjaGVjay5zdGF0dXN9YCk7XG4gIGNvbnNvbGUubG9nKGAgICAgTWVzc2FnZTogJHtjaGVjay5tZXNzYWdlfWApO1xuICBpZiAoY2hlY2suZGV0YWlscykge1xuICAgIGNvbnNvbGUubG9nKGAgICAgRGV0YWlsczogJHtjaGVjay5kZXRhaWxzfWApO1xuICB9XG59KTtcblxuY29uc29sZS5sb2coYFxcblN1bW1hcnk6ICR7cmVzdWx0LnN1bW1hcnl9XFxuYCk7XG5cbi8vIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlXG5wcm9jZXNzLmV4aXQocmVzdWx0LnZhbGlkID8gMCA6IDEpO1xuIl19
|
package/src/test.ts
CHANGED
|
File without changes
|
package/src/types.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ValidationCheck {
|
|
2
|
+
name: string;
|
|
3
|
+
status: 'pass' | 'fail' | 'warning';
|
|
4
|
+
message: string;
|
|
5
|
+
details?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
checks: ValidationCheck[];
|
|
10
|
+
summary: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CloudFormationTemplate {
|
|
13
|
+
Resources?: Record<string, any>;
|
|
14
|
+
Outputs?: Record<string, any>;
|
|
15
|
+
Parameters?: Record<string, any>;
|
|
16
|
+
}
|
package/src/types.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ2hlY2sge1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ3dhcm5pbmcnO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBjaGVja3M6IFZhbGlkYXRpb25DaGVja1tdO1xuICBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB7XG4gIFJlc291cmNlcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIE91dHB1dHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cbiJdfQ==
|
package/src/types.ts
CHANGED
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ValidationResult, CloudFormationTemplate } from './types';
|
|
2
|
+
export declare class ConsolePrivateAccessValidator {
|
|
3
|
+
private template;
|
|
4
|
+
private region;
|
|
5
|
+
private checks;
|
|
6
|
+
constructor(template: CloudFormationTemplate, region?: string);
|
|
7
|
+
validate(): ValidationResult;
|
|
8
|
+
private getServiceName;
|
|
9
|
+
private checkVpcEndpoints;
|
|
10
|
+
private checkEndpointPolicies;
|
|
11
|
+
private validatePolicyContent;
|
|
12
|
+
private checkRoute53HostedZones;
|
|
13
|
+
private checkSecurityGroups;
|
|
14
|
+
private checkEc2Instance;
|
|
15
|
+
private checkNatGateway;
|
|
16
|
+
private checkNetworkConfiguration;
|
|
17
|
+
private generateSummary;
|
|
18
|
+
}
|
package/src/validator.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
export class ConsolePrivateAccessValidator {
|
|
2
|
+
template;
|
|
3
|
+
region;
|
|
4
|
+
checks = [];
|
|
5
|
+
constructor(template, region = 'us-east-1') {
|
|
6
|
+
this.template = template;
|
|
7
|
+
this.region = region;
|
|
8
|
+
}
|
|
9
|
+
validate() {
|
|
10
|
+
this.checks = [];
|
|
11
|
+
this.checkVpcEndpoints();
|
|
12
|
+
this.checkEndpointPolicies();
|
|
13
|
+
this.checkRoute53HostedZones();
|
|
14
|
+
this.checkSecurityGroups();
|
|
15
|
+
this.checkEc2Instance();
|
|
16
|
+
this.checkNatGateway();
|
|
17
|
+
this.checkNetworkConfiguration();
|
|
18
|
+
const failCount = this.checks.filter(c => c.status === 'fail').length;
|
|
19
|
+
const valid = failCount === 0;
|
|
20
|
+
return {
|
|
21
|
+
valid,
|
|
22
|
+
checks: this.checks,
|
|
23
|
+
summary: this.generateSummary(valid, failCount),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
getServiceName(serviceName) {
|
|
27
|
+
if (typeof serviceName === 'string') {
|
|
28
|
+
return serviceName;
|
|
29
|
+
}
|
|
30
|
+
if (serviceName?.['Fn::Join']) {
|
|
31
|
+
const parts = serviceName['Fn::Join'][1];
|
|
32
|
+
if (Array.isArray(parts)) {
|
|
33
|
+
// Handle Ref to AWS::Region by replacing with actual region
|
|
34
|
+
return parts
|
|
35
|
+
.map((part) => {
|
|
36
|
+
if (typeof part === 'string') {
|
|
37
|
+
return part;
|
|
38
|
+
}
|
|
39
|
+
if (part?.Ref === 'AWS::Region') {
|
|
40
|
+
return this.region;
|
|
41
|
+
}
|
|
42
|
+
return '';
|
|
43
|
+
})
|
|
44
|
+
.join('');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
checkVpcEndpoints() {
|
|
50
|
+
const requiredEndpoints = [
|
|
51
|
+
{ name: 'console', service: `com.amazonaws.${this.region}.console` },
|
|
52
|
+
{ name: 'signin', service: `com.amazonaws.${this.region}.signin` },
|
|
53
|
+
{ name: 'ssm', service: `com.amazonaws.${this.region}.ssm` },
|
|
54
|
+
{ name: 'ec2messages', service: `com.amazonaws.${this.region}.ec2messages` },
|
|
55
|
+
{ name: 'ssmmessages', service: `com.amazonaws.${this.region}.ssmmessages` },
|
|
56
|
+
];
|
|
57
|
+
const resources = this.template.Resources || {};
|
|
58
|
+
const interfaceEndpoints = Object.values(resources).filter((r) => r.Type === 'AWS::EC2::VPCEndpoint' && r.Properties?.VpcEndpointType === 'Interface');
|
|
59
|
+
for (const endpoint of requiredEndpoints) {
|
|
60
|
+
const found = interfaceEndpoints.some((e) => {
|
|
61
|
+
const serviceName = this.getServiceName(e.Properties?.ServiceName);
|
|
62
|
+
return serviceName && serviceName.includes(endpoint.service);
|
|
63
|
+
});
|
|
64
|
+
this.checks.push({
|
|
65
|
+
name: `VPC Endpoint: ${endpoint.name}`,
|
|
66
|
+
status: found ? 'pass' : 'fail',
|
|
67
|
+
message: found
|
|
68
|
+
? `Interface VPC endpoint for ${endpoint.name} found`
|
|
69
|
+
: `Missing interface VPC endpoint for ${endpoint.name}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Check for S3 Gateway endpoint
|
|
73
|
+
const s3Gateway = Object.values(resources).some((r) => {
|
|
74
|
+
const serviceName = this.getServiceName(r.Properties?.ServiceName);
|
|
75
|
+
return (r.Type === 'AWS::EC2::VPCEndpoint' &&
|
|
76
|
+
r.Properties?.VpcEndpointType === 'Gateway' &&
|
|
77
|
+
serviceName &&
|
|
78
|
+
serviceName.includes('s3'));
|
|
79
|
+
});
|
|
80
|
+
this.checks.push({
|
|
81
|
+
name: 'VPC Endpoint: S3 Gateway',
|
|
82
|
+
status: s3Gateway ? 'pass' : 'fail',
|
|
83
|
+
message: s3Gateway ? 'S3 Gateway VPC endpoint found' : 'Missing S3 Gateway VPC endpoint',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
checkEndpointPolicies() {
|
|
87
|
+
const resources = this.template.Resources || {};
|
|
88
|
+
const consoleEndpoint = Object.entries(resources).find(([_, r]) => {
|
|
89
|
+
const serviceName = this.getServiceName(r.Properties?.ServiceName);
|
|
90
|
+
return (r.Type === 'AWS::EC2::VPCEndpoint' &&
|
|
91
|
+
serviceName &&
|
|
92
|
+
serviceName.includes('console'));
|
|
93
|
+
});
|
|
94
|
+
const signinEndpoint = Object.entries(resources).find(([_, r]) => {
|
|
95
|
+
const serviceName = this.getServiceName(r.Properties?.ServiceName);
|
|
96
|
+
return (r.Type === 'AWS::EC2::VPCEndpoint' &&
|
|
97
|
+
serviceName &&
|
|
98
|
+
serviceName.includes('signin'));
|
|
99
|
+
});
|
|
100
|
+
for (const [name, endpoint] of [
|
|
101
|
+
['Console', consoleEndpoint],
|
|
102
|
+
['Signin', signinEndpoint],
|
|
103
|
+
]) {
|
|
104
|
+
if (!endpoint)
|
|
105
|
+
continue;
|
|
106
|
+
const [_, resource] = endpoint;
|
|
107
|
+
const hasPolicy = resource.Properties?.PolicyDocument;
|
|
108
|
+
this.checks.push({
|
|
109
|
+
name: `Endpoint Policy: ${name}`,
|
|
110
|
+
status: hasPolicy ? 'pass' : 'fail',
|
|
111
|
+
message: hasPolicy
|
|
112
|
+
? `${name} endpoint has a policy attached`
|
|
113
|
+
: `${name} endpoint is missing a policy`,
|
|
114
|
+
details: hasPolicy
|
|
115
|
+
? this.validatePolicyContent(resource.Properties.PolicyDocument)
|
|
116
|
+
: undefined,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
validatePolicyContent(policy) {
|
|
121
|
+
if (!policy.Statement || policy.Statement.length === 0) {
|
|
122
|
+
return 'Policy has no statements';
|
|
123
|
+
}
|
|
124
|
+
const statement = policy.Statement[0];
|
|
125
|
+
const hasAccountCondition = statement.Condition?.StringEquals?.['aws:PrincipalAccount'];
|
|
126
|
+
if (hasAccountCondition) {
|
|
127
|
+
return 'Policy restricts access to specific account(s)';
|
|
128
|
+
}
|
|
129
|
+
return 'Policy does not restrict access by account';
|
|
130
|
+
}
|
|
131
|
+
checkRoute53HostedZones() {
|
|
132
|
+
const resources = this.template.Resources || {};
|
|
133
|
+
const hostedZones = Object.values(resources).filter((r) => r.Type === 'AWS::Route53::HostedZone');
|
|
134
|
+
const requiredZones = ['console.aws.amazon.com', 'signin.aws.amazon.com'];
|
|
135
|
+
for (const zone of requiredZones) {
|
|
136
|
+
const found = hostedZones.some((hz) => {
|
|
137
|
+
const zoneName = hz.Properties?.Name;
|
|
138
|
+
// Route53 zone names may have a trailing dot
|
|
139
|
+
return zoneName === zone || zoneName === `${zone}.`;
|
|
140
|
+
});
|
|
141
|
+
this.checks.push({
|
|
142
|
+
name: `Route53 Hosted Zone: ${zone}`,
|
|
143
|
+
status: found ? 'pass' : 'fail',
|
|
144
|
+
message: found
|
|
145
|
+
? `Private hosted zone for ${zone} found`
|
|
146
|
+
: `Missing private hosted zone for ${zone}`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Check for Route53 records
|
|
150
|
+
const recordSets = Object.values(resources).filter((r) => r.Type === 'AWS::Route53::RecordSet');
|
|
151
|
+
this.checks.push({
|
|
152
|
+
name: 'Route53 Records',
|
|
153
|
+
status: recordSets.length > 0 ? 'pass' : 'warning',
|
|
154
|
+
message: recordSets.length > 0
|
|
155
|
+
? `Found ${recordSets.length} Route53 records`
|
|
156
|
+
: 'No Route53 records found',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
checkSecurityGroups() {
|
|
160
|
+
const resources = this.template.Resources || {};
|
|
161
|
+
const securityGroups = Object.values(resources).filter((r) => r.Type === 'AWS::EC2::SecurityGroup');
|
|
162
|
+
const hasHttpsIngress = securityGroups.some((sg) => {
|
|
163
|
+
const ingress = sg.Properties?.SecurityGroupIngress || [];
|
|
164
|
+
return ingress.some((rule) => (rule.FromPort === 443 || rule.IpProtocol === 'tcp') &&
|
|
165
|
+
(rule.ToPort === 443 || rule.IpProtocol === 'tcp'));
|
|
166
|
+
});
|
|
167
|
+
this.checks.push({
|
|
168
|
+
name: 'Security Group: HTTPS Access',
|
|
169
|
+
status: hasHttpsIngress ? 'pass' : 'warning',
|
|
170
|
+
message: hasHttpsIngress
|
|
171
|
+
? 'Security group allows HTTPS (port 443) traffic'
|
|
172
|
+
: 'No security group rule found for HTTPS (port 443)',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
checkEc2Instance() {
|
|
176
|
+
const resources = this.template.Resources || {};
|
|
177
|
+
const instance = Object.values(resources).find((r) => r.Type === 'AWS::EC2::Instance');
|
|
178
|
+
this.checks.push({
|
|
179
|
+
name: 'EC2 Instance',
|
|
180
|
+
status: instance ? 'pass' : 'warning',
|
|
181
|
+
message: instance ? 'EC2 instance found' : 'No EC2 instance found (optional)',
|
|
182
|
+
});
|
|
183
|
+
if (instance) {
|
|
184
|
+
const hasIamRole = instance.Properties?.IamInstanceProfile;
|
|
185
|
+
this.checks.push({
|
|
186
|
+
name: 'EC2 IAM Role',
|
|
187
|
+
status: hasIamRole ? 'pass' : 'warning',
|
|
188
|
+
message: hasIamRole
|
|
189
|
+
? 'EC2 instance has IAM instance profile'
|
|
190
|
+
: 'EC2 instance missing IAM instance profile',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
checkNatGateway() {
|
|
195
|
+
const resources = this.template.Resources || {};
|
|
196
|
+
const natGateway = Object.values(resources).find((r) => r.Type === 'AWS::EC2::NatGateway');
|
|
197
|
+
this.checks.push({
|
|
198
|
+
name: 'NAT Gateway',
|
|
199
|
+
status: natGateway ? 'pass' : 'warning',
|
|
200
|
+
message: natGateway
|
|
201
|
+
? 'NAT Gateway found for private subnet egress'
|
|
202
|
+
: 'No NAT Gateway found (required for private subnet internet access)',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
checkNetworkConfiguration() {
|
|
206
|
+
const resources = this.template.Resources || {};
|
|
207
|
+
// Check for private subnets
|
|
208
|
+
const privateSubnets = Object.values(resources).filter((r) => r.Type === 'AWS::EC2::Subnet' &&
|
|
209
|
+
!r.Properties?.MapPublicIpOnLaunch);
|
|
210
|
+
this.checks.push({
|
|
211
|
+
name: 'Private Subnets',
|
|
212
|
+
status: privateSubnets.length > 0 ? 'pass' : 'fail',
|
|
213
|
+
message: privateSubnets.length > 0
|
|
214
|
+
? `Found ${privateSubnets.length} private subnet(s)`
|
|
215
|
+
: 'No private subnets found',
|
|
216
|
+
});
|
|
217
|
+
// Check for route tables
|
|
218
|
+
const routeTables = Object.values(resources).filter((r) => r.Type === 'AWS::EC2::RouteTable');
|
|
219
|
+
this.checks.push({
|
|
220
|
+
name: 'Route Tables',
|
|
221
|
+
status: routeTables.length > 0 ? 'pass' : 'warning',
|
|
222
|
+
message: routeTables.length > 0
|
|
223
|
+
? `Found ${routeTables.length} route table(s)`
|
|
224
|
+
: 'No route tables found',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
generateSummary(valid, failCount) {
|
|
228
|
+
const passCount = this.checks.filter(c => c.status === 'pass').length;
|
|
229
|
+
const warningCount = this.checks.filter(c => c.status === 'warning').length;
|
|
230
|
+
if (valid) {
|
|
231
|
+
return `✓ Validation passed. All required checks passed (${passCount} passed, ${warningCount} warnings).`;
|
|
232
|
+
}
|
|
233
|
+
return `✗ Validation failed. ${failCount} check(s) failed, ${passCount} passed, ${warningCount} warnings.`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyw2QkFBNkI7SUFDaEMsUUFBUSxDQUF5QjtJQUNqQyxNQUFNLENBQVM7SUFDZixNQUFNLEdBQXNCLEVBQUUsQ0FBQztJQUV2QyxZQUFZLFFBQWdDLEVBQUUsU0FBaUIsV0FBVztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RFLE1BQU0sS0FBSyxHQUFHLFNBQVMsS0FBSyxDQUFDLENBQUM7UUFFOUIsT0FBTztZQUNMLEtBQUs7WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxXQUFnQjtRQUNyQyxJQUFJLE9BQU8sV0FBVyxL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QVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRTVFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLG9EQUFvRCxTQUFTLFlBQVksWUFBWSxhQUFhLENBQUM7UUFDNUcsQ0FBQztRQUVELE9BQU8sd0JBQXdCLFNBQVMscUJBQXFCLFNBQVMsWUFBWSxZQUFZLFlBQVksQ0FBQztJQUM3RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0aW9uQ2hlY2ssIFZhbGlkYXRpb25SZXN1bHQsIENsb3VkRm9ybWF0aW9uVGVtcGxhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbnNvbGVQcml2YXRlQWNjZXNzVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZTtcbiAgcHJpdmF0ZSByZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSBjaGVja3M6IFZhbGlkYXRpb25DaGVja1tdID0gW107XG5cbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IENsb3VkRm9ybWF0aW9uVGVtcGxhdGUsIHJlZ2lvbjogc3RyaW5nID0gJ3VzLWVhc3QtMScpIHtcbiAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgdGhpcy5yZWdpb24gPSByZWdpb247XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICB0aGlzLmNoZWNrcyA9IFtdO1xuXG4gICAgdGhpcy5jaGVja1ZwY0VuZHBvaW50cygpO1xuICAgIHRoaXMuY2hlY2tFbmRwb2ludFBvbGljaWVzKCk7XG4gICAgdGhpcy5jaGVja1JvdXRlNTNIb3N0ZWRab25lcygpO1xuICAgIHRoaXMuY2hlY2tTZWN1cml0eUdyb3VwcygpO1xuICAgIHRoaXMuY2hlY2tFYzJJbnN0YW5jZSgpO1xuICAgIHRoaXMuY2hlY2tOYXRHYXRld2F5KCk7XG4gICAgdGhpcy5jaGVja05ldHdvcmtDb25maWd1cmF0aW9uKCk7XG5cbiAgICBjb25zdCBmYWlsQ291bnQgPSB0aGlzLmNoZWNrcy5maWx0ZXIoYyA9PiBjLnN0YXR1cyA9PT0gJ2ZhaWwnKS5sZW5ndGg7XG4gICAgY29uc3QgdmFsaWQgPSBmYWlsQ291bnQgPT09IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQsXG4gICAgICBjaGVja3M6IHRoaXMuY2hlY2tzLFxuICAgICAgc3VtbWFyeTogdGhpcy5nZW5lcmF0ZVN1bW1hcnkodmFsaWQsIGZhaWxDb3VudCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZU5hbWUoc2VydmljZU5hbWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygc2VydmljZU5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlTmFtZT8uWydGbjo6Sm9pbiddKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHNlcnZpY2VOYW1lWydGbjo6Sm9pbiddWzFdO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFydHMpKSB7XG4gICAgICAgIC8vIEhhbmRsZSBSZWYgdG8gQVdTOjpSZWdpb24gYnkgcmVwbGFjaW5nIHdpdGggYWN0dWFsIHJlZ2lvblxuICAgICAgICByZXR1cm4gcGFydHNcbiAgICAgICAgICAubWFwKChwYXJ0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFydD8uUmVmID09PSAnQVdTOjpSZWdpb24nKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrVnBjRW5kcG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcXVpcmVkRW5kcG9pbnRzID0gW1xuICAgICAgeyBuYW1lOiAnY29uc29sZScsIHNlcnZpY2U6IGBjb20uYW1hem9uYXdzLiR7dGhpcy5yZWdpb259LmNvbnNvbGVgIH0sXG4gICAgICB7IG5hbWU6ICdzaWduaW4nLCBzZXJ2aWNlOiBgY29tLmFtYXpvbmF3cy4ke3RoaXMucmVnaW9ufS5zaWduaW5gIH0sXG4gICAgICB7IG5hbWU6ICdzc20nLCBzZXJ2aWNlOiBgY29tLmFtYXpvbmF3cy4ke3RoaXMucmVnaW9ufS5zc21gIH0sXG4gICAgICB7IG5hbWU6ICdlYzJtZXNzYWdlcycsIHNlcnZpY2U6IGBjb20uYW1hem9uYXdzLiR7dGhpcy5yZWdpb259LmVjMm1lc3NhZ2VzYCB9LFxuICAgICAgeyBuYW1lOiAnc3NtbWVzc2FnZXMnLCBzZXJ2aWNlOiBgY29tLmFtYXpvbmF3cy4ke3RoaXMucmVnaW9ufS5zc21tZXNzYWdlc2AgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge307XG4gICAgY29uc3QgaW50ZXJmYWNlRW5kcG9pbnRzID0gT2JqZWN0LnZhbHVlcyhyZXNvdXJjZXMpLmZpbHRlcihcbiAgICAgIChyOiBhbnkpID0+IHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpWUENFbmRwb2ludCcgJiYgci5Qcm9wZXJ0aWVzPy5WcGNFbmRwb2ludFR5cGUgPT09ICdJbnRlcmZhY2UnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgcmVxdWlyZWRFbmRwb2ludHMpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gaW50ZXJmYWNlRW5kcG9pbnRzLnNvbWUoKGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMuZ2V0U2VydmljZU5hbWUoZS5Qcm9wZXJ0aWVzPy5TZXJ2aWNlTmFtZSk7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZSAmJiBzZXJ2aWNlTmFtZS5pbmNsdWRlcyhlbmRwb2ludC5zZXJ2aWNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgbmFtZTogYFZQQyBFbmRwb2ludDogJHtlbmRwb2ludC5uYW1lfWAsXG4gICAgICAgIHN0YXR1czogZm91bmQgPyAncGFzcycgOiAnZmFpbCcsXG4gICAgICAgIG1lc3NhZ2U6IGZvdW5kXG4gICAgICAgICAgPyBgSW50ZXJmYWNlIFZQQyBlbmRwb2ludCBmb3IgJHtlbmRwb2ludC5uYW1lfSBmb3VuZGBcbiAgICAgICAgICA6IGBNaXNzaW5nIGludGVyZmFjZSBWUEMgZW5kcG9pbnQgZm9yICR7ZW5kcG9pbnQubmFtZX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIFMzIEdhdGV3YXkgZW5kcG9pbnRcbiAgICBjb25zdCBzM0dhdGV3YXkgPSBPYmplY3QudmFsdWVzKHJlc291cmNlcykuc29tZShcbiAgICAgIChyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSB0aGlzLmdldFNlcnZpY2VOYW1lKHIuUHJvcGVydGllcz8uU2VydmljZU5hbWUpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpWUENFbmRwb2ludCcgJiZcbiAgICAgICAgICByLlByb3BlcnRpZXM/LlZwY0VuZHBvaW50VHlwZSA9PT0gJ0dhdGV3YXknICYmXG4gICAgICAgICAgc2VydmljZU5hbWUgJiZcbiAgICAgICAgICBzZXJ2aWNlTmFtZS5pbmNsdWRlcygnczMnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdWUEMgRW5kcG9pbnQ6IFMzIEdhdGV3YXknLFxuICAgICAgc3RhdHVzOiBzM0dhdGV3YXkgPyAncGFzcycgOiAnZmFpbCcsXG4gICAgICBtZXNzYWdlOiBzM0dhdGV3YXkgPyAnUzMgR2F0ZXdheSBWUEMgZW5kcG9pbnQgZm91bmQnIDogJ01pc3NpbmcgUzMgR2F0ZXdheSBWUEMgZW5kcG9pbnQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0VuZHBvaW50UG9saWNpZXMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge307XG4gICAgY29uc3QgY29uc29sZUVuZHBvaW50ID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKS5maW5kKFxuICAgICAgKFtfLCByXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMuZ2V0U2VydmljZU5hbWUoci5Qcm9wZXJ0aWVzPy5TZXJ2aWNlTmFtZSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgci5UeXBlID09PSAnQVdTOjpFQzI6OlZQQ0VuZHBvaW50JyAmJlxuICAgICAgICAgIHNlcnZpY2VOYW1lICYmXG4gICAgICAgICAgc2VydmljZU5hbWUuaW5jbHVkZXMoJ2NvbnNvbGUnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBzaWduaW5FbmRwb2ludCA9IE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykuZmluZChcbiAgICAgIChbXywgcl06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSB0aGlzLmdldFNlcnZpY2VOYW1lKHIuUHJvcGVydGllcz8uU2VydmljZU5hbWUpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpWUENFbmRwb2ludCcgJiZcbiAgICAgICAgICBzZXJ2aWNlTmFtZSAmJlxuICAgICAgICAgIHNlcnZpY2VOYW1lLmluY2x1ZGVzKCdzaWduaW4nKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbmRwb2ludF0gb2YgW1xuICAgICAgWydDb25zb2xlJywgY29uc29sZUVuZHBvaW50XSxcbiAgICAgIFsnU2lnbmluJywgc2lnbmluRW5kcG9pbnRdLFxuICAgIF0pIHtcbiAgICAgIGlmICghZW5kcG9pbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbXywgcmVzb3VyY2VdID0gZW5kcG9pbnQgYXMgW3N0cmluZywgYW55XTtcbiAgICAgIGNvbnN0IGhhc1BvbGljeSA9IHJlc291cmNlLlByb3BlcnRpZXM/LlBvbGljeURvY3VtZW50O1xuXG4gICAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgbmFtZTogYEVuZHBvaW50IFBvbGljeTogJHtuYW1lfWAsXG4gICAgICAgIHN0YXR1czogaGFzUG9saWN5ID8gJ3Bhc3MnIDogJ2ZhaWwnLFxuICAgICAgICBtZXNzYWdlOiBoYXNQb2xpY3lcbiAgICAgICAgICA/IGAke25hbWV9IGVuZHBvaW50IGhhcyBhIHBvbGljeSBhdHRhY2hlZGBcbiAgICAgICAgICA6IGAke25hbWV9IGVuZHBvaW50IGlzIG1pc3NpbmcgYSBwb2xpY3lgLFxuICAgICAgICBkZXRhaWxzOiBoYXNQb2xpY3lcbiAgICAgICAgICA/IHRoaXMudmFsaWRhdGVQb2xpY3lDb250ZW50KHJlc291cmNlLlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5Q29udGVudChwb2xpY3k6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFwb2xpY3kuU3RhdGVtZW50IHx8IHBvbGljeS5TdGF0ZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ1BvbGljeSBoYXMgbm8gc3RhdGVtZW50cyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gcG9saWN5LlN0YXRlbWVudFswXTtcbiAgICBjb25zdCBoYXNBY2NvdW50Q29uZGl0aW9uID0gc3RhdGVtZW50LkNvbmRpdGlvbj8uU3RyaW5nRXF1YWxzPy5bJ2F3czpQcmluY2lwYWxBY2NvdW50J107XG5cbiAgICBpZiAoaGFzQWNjb3VudENvbmRpdGlvbikge1xuICAgICAgcmV0dXJuICdQb2xpY3kgcmVzdHJpY3RzIGFjY2VzcyB0byBzcGVjaWZpYyBhY2NvdW50KHMpJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ1BvbGljeSBkb2VzIG5vdCByZXN0cmljdCBhY2Nlc3MgYnkgYWNjb3VudCc7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUm91dGU1M0hvc3RlZFpvbmVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9O1xuICAgIGNvbnN0IGhvc3RlZFpvbmVzID0gT2JqZWN0LnZhbHVlcyhyZXNvdXJjZXMpLmZpbHRlcihcbiAgICAgIChyOiBhbnkpID0+IHIuVHlwZSA9PT0gJ0FXUzo6Um91dGU1Mzo6SG9zdGVkWm9uZSdcbiAgICApO1xuXG4gICAgY29uc3QgcmVxdWlyZWRab25lcyA9IFsnY29uc29sZS5hd3MuYW1hem9uLmNvbScsICdzaWduaW4uYXdzLmFtYXpvbi5jb20nXTtcblxuICAgIGZvciAoY29uc3Qgem9uZSBvZiByZXF1aXJlZFpvbmVzKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGhvc3RlZFpvbmVzLnNvbWUoKGh6OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgem9uZU5hbWUgPSBoei5Qcm9wZXJ0aWVzPy5OYW1lO1xuICAgICAgICAvLyBSb3V0ZTUzIHpvbmUgbmFtZXMgbWF5IGhhdmUgYSB0cmFpbGluZyBkb3RcbiAgICAgICAgcmV0dXJuIHpvbmVOYW1lID09PSB6b25lIHx8IHpvbmVOYW1lID09PSBgJHt6b25lfS5gO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2hlY2tzLnB1c2goe1xuICAgICAgICBuYW1lOiBgUm91dGU1MyBIb3N0ZWQgWm9uZTogJHt6b25lfWAsXG4gICAgICAgIHN0YXR1czogZm91bmQgPyAncGFzcycgOiAnZmFpbCcsXG4gICAgICAgIG1lc3NhZ2U6IGZvdW5kXG4gICAgICAgICAgPyBgUHJpdmF0ZSBob3N0ZWQgem9uZSBmb3IgJHt6b25lfSBmb3VuZGBcbiAgICAgICAgICA6IGBNaXNzaW5nIHByaXZhdGUgaG9zdGVkIHpvbmUgZm9yICR7em9uZX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIFJvdXRlNTMgcmVjb3Jkc1xuICAgIGNvbnN0IHJlY29yZFNldHMgPSBPYmplY3QudmFsdWVzKHJlc291cmNlcykuZmlsdGVyKFxuICAgICAgKHI6IGFueSkgPT4gci5UeXBlID09PSAnQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXQnXG4gICAgKTtcblxuICAgIHRoaXMuY2hlY2tzLnB1c2goe1xuICAgICAgbmFtZTogJ1JvdXRlNTMgUmVjb3JkcycsXG4gICAgICBzdGF0dXM6IHJlY29yZFNldHMubGVuZ3RoID4gMCA/ICdwYXNzJyA6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgIHJlY29yZFNldHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYEZvdW5kICR7cmVjb3JkU2V0cy5sZW5ndGh9IFJvdXRlNTMgcmVjb3Jkc2BcbiAgICAgICAgICA6ICdObyBSb3V0ZTUzIHJlY29yZHMgZm91bmQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1NlY3VyaXR5R3JvdXBzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9O1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gT2JqZWN0LnZhbHVlcyhyZXNvdXJjZXMpLmZpbHRlcihcbiAgICAgIChyOiBhbnkpID0+IHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpTZWN1cml0eUdyb3VwJ1xuICAgICk7XG5cbiAgICBjb25zdCBoYXNIdHRwc0luZ3Jlc3MgPSBzZWN1cml0eUdyb3Vwcy5zb21lKChzZzogYW55KSA9PiB7XG4gICAgICBjb25zdCBpbmdyZXNzID0gc2cuUHJvcGVydGllcz8uU2VjdXJpdHlHcm91cEluZ3Jlc3MgfHwgW107XG4gICAgICByZXR1cm4gaW5ncmVzcy5zb21lKFxuICAgICAgICAocnVsZTogYW55KSA9PlxuICAgICAgICAgIChydWxlLkZyb21Qb3J0ID09PSA0NDMgfHwgcnVsZS5JcFByb3RvY29sID09PSAndGNwJykgJiZcbiAgICAgICAgICAocnVsZS5Ub1BvcnQgPT09IDQ0MyB8fCBydWxlLklwUHJvdG9jb2wgPT09ICd0Y3AnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hlY2tzLnB1c2goe1xuICAgICAgbmFtZTogJ1NlY3VyaXR5IEdyb3VwOiBIVFRQUyBBY2Nlc3MnLFxuICAgICAgc3RhdHVzOiBoYXNIdHRwc0luZ3Jlc3MgPyAncGFzcycgOiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiBoYXNIdHRwc0luZ3Jlc3NcbiAgICAgICAgPyAnU2VjdXJpdHkgZ3JvdXAgYWxsb3dzIEhUVFBTIChwb3J0IDQ0MykgdHJhZmZpYydcbiAgICAgICAgOiAnTm8gc2VjdXJpdHkgZ3JvdXAgcnVsZSBmb3VuZCBmb3IgSFRUUFMgKHBvcnQgNDQzKScsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRWMySW5zdGFuY2UoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge307XG4gICAgY29uc3QgaW5zdGFuY2UgPSBPYmplY3QudmFsdWVzKHJlc291cmNlcykuZmluZCgocjogYW55KSA9PiByLlR5cGUgPT09ICdBV1M6OkVDMjo6SW5zdGFuY2UnKTtcblxuICAgIHRoaXMuY2hlY2tzLnB1c2goe1xuICAgICAgbmFtZTogJ0VDMiBJbnN0YW5jZScsXG4gICAgICBzdGF0dXM6IGluc3RhbmNlID8gJ3Bhc3MnIDogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogaW5zdGFuY2UgPyAnRUMyIGluc3RhbmNlIGZvdW5kJyA6ICdObyBFQzIgaW5zdGFuY2UgZm91bmQgKG9wdGlvbmFsKScsXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGhhc0lhbVJvbGUgPSAoaW5zdGFuY2UgYXMgYW55KS5Qcm9wZXJ0aWVzPy5JYW1JbnN0YW5jZVByb2ZpbGU7XG4gICAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ0VDMiBJQU0gUm9sZScsXG4gICAgICAgIHN0YXR1czogaGFzSWFtUm9sZSA/ICdwYXNzJyA6ICd3YXJuaW5nJyxcbiAgICAgICAgbWVzc2FnZTogaGFzSWFtUm9sZVxuICAgICAgICAgID8gJ0VDMiBpbnN0YW5jZSBoYXMgSUFNIGluc3RhbmNlIHByb2ZpbGUnXG4gICAgICAgICAgOiAnRUMyIGluc3RhbmNlIG1pc3NpbmcgSUFNIGluc3RhbmNlIHByb2ZpbGUnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja05hdEdhdGV3YXkoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge307XG4gICAgY29uc3QgbmF0R2F0ZXdheSA9IE9iamVjdC52YWx1ZXMocmVzb3VyY2VzKS5maW5kKChyOiBhbnkpID0+IHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpOYXRHYXRld2F5Jyk7XG5cbiAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdOQVQgR2F0ZXdheScsXG4gICAgICBzdGF0dXM6IG5hdEdhdGV3YXkgPyAncGFzcycgOiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiBuYXRHYXRld2F5XG4gICAgICAgID8gJ05BVCBHYXRld2F5IGZvdW5kIGZvciBwcml2YXRlIHN1Ym5ldCBlZ3Jlc3MnXG4gICAgICAgIDogJ05vIE5BVCBHYXRld2F5IGZvdW5kIChyZXF1aXJlZCBmb3IgcHJpdmF0ZSBzdWJuZXQgaW50ZXJuZXQgYWNjZXNzKScsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTmV0d29ya0NvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge307XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBzdWJuZXRzXG4gICAgY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBPYmplY3QudmFsdWVzKHJlc291cmNlcykuZmlsdGVyKFxuICAgICAgKHI6IGFueSkgPT5cbiAgICAgICAgci5UeXBlID09PSAnQVdTOjpFQzI6OlN1Ym5ldCcgJiZcbiAgICAgICAgIXIuUHJvcGVydGllcz8uTWFwUHVibGljSXBPbkxhdW5jaFxuICAgICk7XG5cbiAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdQcml2YXRlIFN1Ym5ldHMnLFxuICAgICAgc3RhdHVzOiBwcml2YXRlU3VibmV0cy5sZW5ndGggPiAwID8gJ3Bhc3MnIDogJ2ZhaWwnLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgcHJpdmF0ZVN1Ym5ldHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYEZvdW5kICR7cHJpdmF0ZVN1Ym5ldHMubGVuZ3RofSBwcml2YXRlIHN1Ym5ldChzKWBcbiAgICAgICAgICA6ICdObyBwcml2YXRlIHN1Ym5ldHMgZm91bmQnLFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHJvdXRlIHRhYmxlc1xuICAgIGNvbnN0IHJvdXRlVGFibGVzID0gT2JqZWN0LnZhbHVlcyhyZXNvdXJjZXMpLmZpbHRlcihcbiAgICAgIChyOiBhbnkpID0+IHIuVHlwZSA9PT0gJ0FXUzo6RUMyOjpSb3V0ZVRhYmxlJ1xuICAgICk7XG5cbiAgICB0aGlzLmNoZWNrcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdSb3V0ZSBUYWJsZXMnLFxuICAgICAgc3RhdHVzOiByb3V0ZVRhYmxlcy5sZW5ndGggPiAwID8gJ3Bhc3MnIDogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgcm91dGVUYWJsZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYEZvdW5kICR7cm91dGVUYWJsZXMubGVuZ3RofSByb3V0ZSB0YWJsZShzKWBcbiAgICAgICAgICA6ICdObyByb3V0ZSB0YWJsZXMgZm91bmQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVN1bW1hcnkodmFsaWQ6IGJvb2xlYW4sIGZhaWxDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXNzQ291bnQgPSB0aGlzLmNoZWNrcy5maWx0ZXIoYyA9PiBjLnN0YXR1cyA9PT0gJ3Bhc3MnKS5sZW5ndGg7XG4gICAgY29uc3Qgd2FybmluZ0NvdW50ID0gdGhpcy5jaGVja3MuZmlsdGVyKGMgPT4gYy5zdGF0dXMgPT09ICd3YXJuaW5nJykubGVuZ3RoO1xuXG4gICAgaWYgKHZhbGlkKSB7XG4gICAgICByZXR1cm4gYOKckyBWYWxpZGF0aW9uIHBhc3NlZC4gQWxsIHJlcXVpcmVkIGNoZWNrcyBwYXNzZWQgKCR7cGFzc0NvdW50fSBwYXNzZWQsICR7d2FybmluZ0NvdW50fSB3YXJuaW5ncykuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYOKclyBWYWxpZGF0aW9uIGZhaWxlZC4gJHtmYWlsQ291bnR9IGNoZWNrKHMpIGZhaWxlZCwgJHtwYXNzQ291bnR9IHBhc3NlZCwgJHt3YXJuaW5nQ291bnR9IHdhcm5pbmdzLmA7XG4gIH1cbn1cbiJdfQ==
|
package/src/validator.ts
CHANGED
|
File without changes
|