codepipeline-event-notifier 0.2.8 → 0.3.1

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.
@@ -5,6 +5,7 @@ const client_codepipeline_1 = require("@aws-sdk/client-codepipeline");
5
5
  const client_sns_1 = require("@aws-sdk/client-sns");
6
6
  const strict_env_resolver_1 = require("strict-env-resolver");
7
7
  const notifier_predicates_1 = require("./notifier-predicates");
8
+ const target_pipeline_predicates_1 = require("./target-pipeline-predicates");
8
9
  /**
9
10
  * SNS client used to publish notifications.
10
11
  */
@@ -79,9 +80,31 @@ const waitPipelineExecution = async (params) => {
79
80
  note: 'Waiting timed out before terminal state.',
80
81
  });
81
82
  };
83
+ /**
84
+ * Returns whether the pipeline in the event matches the configured tag filters.
85
+ *
86
+ * @param event EventBridge STARTED event
87
+ * @param pipelineName pipeline name from the event detail
88
+ * @returns true when the pipeline should be notified
89
+ */
90
+ const isTargetPipelineEvent = async (event, pipelineName) => {
91
+ const tagFilters = (0, target_pipeline_predicates_1.parseTargetPipelineTags)(mustEnv('TARGET_PIPELINE_TAGS'));
92
+ const pipelineArn = (0, target_pipeline_predicates_1.resolvePipelineArn)(event.resources, event.region, event.account, pipelineName);
93
+ if (!pipelineArn) {
94
+ throw new Error('Unable to resolve pipeline ARN for tag lookup');
95
+ }
96
+ const allowedArns = (0, target_pipeline_predicates_1.parseAllowedPipelineArns)(process.env.TARGET_PIPELINE_ARNS);
97
+ if (!(0, target_pipeline_predicates_1.isAllowedPipelineArn)(pipelineArn, allowedArns)) {
98
+ return false;
99
+ }
100
+ const listed = await codepipeline.send(new client_codepipeline_1.ListTagsForResourceCommand({
101
+ resourceArn: pipelineArn,
102
+ }));
103
+ return (0, target_pipeline_predicates_1.matchesTargetPipelineTags)((0, target_pipeline_predicates_1.toPipelineTagMap)(listed.tags), tagFilters);
104
+ };
82
105
  /**
83
106
  * Lambda handler triggered by EventBridge when a pipeline execution transitions to STARTED.
84
- * It waits for the execution status until it reaches a terminal state or times out.
107
+ * It ignores pipelines that do not match `TARGET_PIPELINE_TAGS` (and optional `TARGET_PIPELINE_ARNS`), then waits for a terminal state.
85
108
  */
86
109
  const handler = async (event) => {
87
110
  const topicArn = mustEnv('SNS_TOPIC_ARN');
@@ -96,6 +119,9 @@ const handler = async (event) => {
96
119
  });
97
120
  return;
98
121
  }
122
+ if (!await isTargetPipelineEvent(event, identity.pipelineName)) {
123
+ return;
124
+ }
99
125
  const waitIntervalSeconds = strict_env_resolver_1.StrictEnvResolver.resolve('WAIT_INTERVAL_SECONDS', strict_env_resolver_1.StrictEnvType.Number, { default: 10 });
100
126
  const maxWaitMinutes = strict_env_resolver_1.StrictEnvResolver.resolve('MAX_WAIT_MINUTES', strict_env_resolver_1.StrictEnvType.Number, { default: 14 });
101
127
  await waitPipelineExecution({
@@ -108,4 +134,4 @@ const handler = async (event) => {
108
134
  });
109
135
  };
110
136
  exports.handler = handler;
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL25vdGlmaWVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzRUFBK0Y7QUFDL0Ysb0RBQWdFO0FBRWhFLDZEQUF1RTtBQUN2RSwrREFJK0I7QUFvQi9COztHQUVHO0FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxzQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlCOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSx3Q0FBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVoRDs7R0FFRztBQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUUsQ0FBQyx1Q0FBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFaEg7O0dBRUc7QUFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQVUsRUFBaUIsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFL0Y7O0dBRUc7QUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsUUFBZ0IsRUFBRSxPQUFnQixFQUFpQixFQUFFO0lBQzFFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDJCQUFjLENBQUM7UUFDaEMsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO0tBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFBRSxNQU9wQyxFQUFpQixFQUFFO0lBQ2xCLE1BQU0sRUFDSixRQUFRLEVBQ1Is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LE1BQU0sY0FBYyxHQUFHLHVDQUFpQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxtQ0FBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTVHLE1BQU0scUJBQXFCLENBQUM7UUFDMUIsUUFBUTtRQUNSLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtRQUNuQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVc7UUFDakMsbUJBQW1CLEVBQUUsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN2RSxjQUFjLEVBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3hELFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQTdCVyxRQUFBLE9BQU8sV0E2QmxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29kZVBpcGVsaW5lQ2xpZW50LCBHZXRQaXBlbGluZUV4ZWN1dGlvbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJztcbmltcG9ydCB7IFB1Ymxpc2hDb21tYW5kLCBTTlNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc25zJztcbmltcG9ydCB0eXBlIHsgRXZlbnRCcmlkZ2VFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgU3RyaWN0RW52UmVzb2x2ZXIsIFN0cmljdEVudlR5cGUgfSBmcm9tICdzdHJpY3QtZW52LXJlc29sdmVyJztcbmltcG9ydCB7XG4gIGlzVGVybWluYWxFeGVjdXRpb25TdGF0dXMsXG4gIG5vcm1hbGl6ZUV4ZWN1dGlvblN0YXR1cyxcbiAgcmVzb2x2ZVBpcGVsaW5lRXhlY3V0aW9uSWRlbnRpdHksXG59IGZyb20gJy4vbm90aWZpZXItcHJlZGljYXRlcyc7XG5cbi8qKlxuICogRXZlbnRCcmlkZ2UgZGV0YWlsIHBheWxvYWQgZm9yIENvZGVQaXBlbGluZSBleGVjdXRpb24gc3RhdGUtY2hhbmdlIGV2ZW50cy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsID0ge1xuICAncGlwZWxpbmUnPzogc3RyaW5nO1xuICAnc3RhdGUnPzogc3RyaW5nO1xuICAndmVyc2lvbic/OiBzdHJpbmc7XG4gICdleGVjdXRpb24taWQnPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBFdmVudEJyaWRnZSBldmVudCBmb3IgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBzdGF0ZS1jaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQgPSBFdmVudEJyaWRnZUV2ZW50PFxuICAnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnLFxuICBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsXG4+O1xuXG4vKipcbiAqIFNOUyBjbGllbnQgdXNlZCB0byBwdWJsaXNoIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmNvbnN0IHNucyA9IG5ldyBTTlNDbGllbnQoe30pO1xuXG4vKipcbiAqIENvZGVQaXBlbGluZSBjbGllbnQgdXNlZCB0byB3YWl0IGZvciBleGVjdXRpb24gc3RhdGUgY2hhbmdlcy5cbiAqL1xuY29uc3QgY29kZXBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7fSk7XG5cbi8qKlxuICogUmVhZHMgYSByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuY29uc3QgbXVzdEVudiA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZShuYW1lLCBTdHJpY3RFbnZUeXBlLlN0cmluZywgeyB0cmltOiB0cnVlIH0pO1xuXG4vKipcbiAqIFNsZWVwcyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICovXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEpTT04gcGF5bG9hZCB0byB0aGUgZ2l2ZW4gU05TIHRvcGljIEFSTi5cbiAqL1xuY29uc3QgcHVibGlzaCA9IGFzeW5jICh0b3BpY0Fybjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IHNucy5zZW5kKG5ldyBQdWJsaXNoQ29tbWFuZCh7XG4gICAgVG9waWNBcm46IHRvcGljQXJuLFxuICAgIE1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KSk7XG59O1xuXG4vKipcbiAqIFdhaXRzIG9uIGEgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcHVibGlzaGVzIG5vdGlmaWNhdGlvbnMgd2hlbmV2ZXIgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgY2hhbmdlcy5cbiAqL1xuY29uc3Qgd2FpdFBpcGVsaW5lRXhlY3V0aW9uID0gYXN5bmMgKHBhcmFtczoge1xuICB0b3BpY0Fybjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgd2FpdEludGVydmFsU2Vjb25kczogbnVtYmVyO1xuICBtYXhXYWl0TWludXRlczogbnVtYmVyO1xuICBzdGFydEV2ZW50OiBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQ7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICB0b3BpY0FybixcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgZXhlY3V0aW9uSWQsXG4gICAgd2FpdEludGVydmFsU2Vjb25kcyxcbiAgICBtYXhXYWl0TWludXRlcyxcbiAgICBzdGFydEV2ZW50LFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIG1heFdhaXRNaW51dGVzICogNjBfMDAwO1xuICBsZXQgbGFzdFN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOacgOWIneOBqyBTVEFSVEVEIOOCkumAmuefpe+8iEV2ZW50QnJpZGdl55Sx5p2l77yJXG4gIGF3YWl0IHB1Ymxpc2godG9waWNBcm4sIHtcbiAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgcGhhc2U6ICdldmVudGJyaWRnZScsXG4gICAgcGlwZWxpbmVOYW1lLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIG9ic2VydmVkU3RhdGU6IHN0YXJ0RXZlbnQuZGV0YWlsPy5zdGF0ZSA/PyAnU1RBUlRFRCcsXG4gICAgb2JzZXJ2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGV2ZW50OiBzdGFydEV2ZW50LFxuICB9KTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY29kZXBpcGVsaW5lLnNlbmQobmV3IEdldFBpcGVsaW5lRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICBwaXBlbGluZU5hbWUsXG4gICAgICBwaXBlbGluZUV4ZWN1dGlvbklkOiBleGVjdXRpb25JZCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBub3JtYWxpemVFeGVjdXRpb25TdGF0dXMocmVzLnBpcGVsaW5lRXhlY3V0aW9uPy5zdGF0dXMpO1xuICAgIGlmIChzdGF0dXMgIT09IGxhc3RTdGF0dXMpIHtcbiAgICAgIGxhc3RTdGF0dXMgPSBzdGF0dXM7XG4gICAgICBhd2FpdCBwdWJsaXNoKHRvcGljQXJuLCB7XG4gICAgICAgIHR5cGU6ICdjb2RlcGlwZWxpbmUuZXhlY3V0aW9uJyxcbiAgICAgICAgcGhhc2U6ICd3YWl0JyxcbiAgICAgICAgcGlwZWxpbmVOYW1lLFxuICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgb2JzZXJ2ZWRTdGF0ZTogc3RhdHVzLFxuICAgICAgICBvYnNlcnZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNUZXJtaW5hbEV4ZWN1dGlvblN0YXR1cyhzdGF0dXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgc2xlZXAod2FpdEludGVydmFsU2Vjb25kcyAqIDEwMDApO1xuICB9XG5cbiAgYXdhaXQgcHVibGlzaCh0b3BpY0Fybiwge1xuICAgIHR5cGU6ICdjb2RlcGlwZWxpbmUuZXhlY3V0aW9uJyxcbiAgICBwaGFzZTogJ3dhaXQnLFxuICAgIHBpcGVsaW5lTmFtZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBvYnNlcnZlZFN0YXRlOiBsYXN0U3RhdHVzID8/ICdVTktOT1dOJyxcbiAgICBvYnNlcnZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgbm90ZTogJ1dhaXRpbmcgdGltZWQgb3V0IGJlZm9yZSB0ZXJtaW5hbCBzdGF0ZS4nLFxuICB9KTtcbn07XG5cbi8qKlxuICogTGFtYmRhIGhhbmRsZXIgdHJpZ2dlcmVkIGJ5IEV2ZW50QnJpZGdlIHdoZW4gYSBwaXBlbGluZSBleGVjdXRpb24gdHJhbnNpdGlvbnMgdG8gU1RBUlRFRC5cbiAqIEl0IHdhaXRzIGZvciB0aGUgZXhlY3V0aW9uIHN0YXR1cyB1bnRpbCBpdCByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUgb3IgdGltZXMgb3V0LlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhcnRlZEV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRvcGljQXJuID0gbXVzdEVudignU05TX1RPUElDX0FSTicpO1xuICBjb25zdCBpZGVudGl0eSA9IHJlc29sdmVQaXBlbGluZUV4ZWN1dGlvbklkZW50aXR5KFxuICAgIGV2ZW50LmRldGFpbD8ucGlwZWxpbmUsXG4gICAgZXZlbnQuZGV0YWlsPy5bJ2V4ZWN1dGlvbi1pZCddLFxuICApO1xuXG4gIGlmICghaWRlbnRpdHkpIHtcbiAgICBhd2FpdCBwdWJsaXNoKHRvcGljQXJuLCB7XG4gICAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgICBwaGFzZTogJ2V2ZW50YnJpZGdlJyxcbiAgICAgIG9ic2VydmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG5vdGU6ICdNaXNzaW5nIHBpcGVsaW5lTmFtZSBvciBleGVjdXRpb25JZCBpbiBldmVudC5kZXRhaWwnLFxuICAgICAgZXZlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2FpdEludGVydmFsU2Vjb25kcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1dBSVRfSU5URVJWQUxfU0VDT05EUycsIFN0cmljdEVudlR5cGUuTnVtYmVyLCB7IGRlZmF1bHQ6IDEwIH0pO1xuICBjb25zdCBtYXhXYWl0TWludXRlcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ01BWF9XQUlUX01JTlVURVMnLCBTdHJpY3RFbnZUeXBlLk51bWJlciwgeyBkZWZhdWx0OiAxNCB9KTtcblxuICBhd2FpdCB3YWl0UGlwZWxpbmVFeGVjdXRpb24oe1xuICAgIHRvcGljQXJuLFxuICAgIHBpcGVsaW5lTmFtZTogaWRlbnRpdHkucGlwZWxpbmVOYW1lLFxuICAgIGV4ZWN1dGlvbklkOiBpZGVudGl0eS5leGVjdXRpb25JZCxcbiAgICB3YWl0SW50ZXJ2YWxTZWNvbmRzOiB3YWl0SW50ZXJ2YWxTZWNvbmRzID4gMCA/IHdhaXRJbnRlcnZhbFNlY29uZHMgOiAxMCxcbiAgICBtYXhXYWl0TWludXRlczogbWF4V2FpdE1pbnV0ZXMgPiAwID8gbWF4V2FpdE1pbnV0ZXMgOiAxNCxcbiAgICBzdGFydEV2ZW50OiBldmVudCxcbiAgfSk7XG59O1xuIl19
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL25vdGlmaWVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzRUFBMkg7QUFDM0gsb0RBQWdFO0FBRWhFLDZEQUF1RTtBQUN2RSwrREFJK0I7QUFDL0IsNkVBT3NDO0FBb0J0Qzs7R0FFRztBQUNILE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUU5Qjs7R0FFRztBQUNILE1BQU0sWUFBWSxHQUFHLElBQUksd0NBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFaEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFLENBQUMsdUNBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxtQ0FBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBRWhIOztHQUVHO0FBQ0gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQWlCLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9GOztHQUVHO0FBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLFFBQWdCLEVBQUUsT0FBZ0IsRUFBaUIsRUFBRTtJQUMxRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSwyQkFBYyxDQUFDO1FBQ2hDLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztLQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEVBQUUsTUFPcEMsRUFBaUIsRUFBRTtJQUNsQixNQUFNLEVB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QU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTVHLE1BQU0scUJBQXFCLENBQUM7UUFDMUIsUUFBUTtRQUNSLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtRQUNuQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVc7UUFDakMsbUJBQW1CLEVBQUUsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN2RSxjQUFjLEVBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3hELFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQWpDVyxRQUFBLE9BQU8sV0FpQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29kZVBpcGVsaW5lQ2xpZW50LCBHZXRQaXBlbGluZUV4ZWN1dGlvbkNvbW1hbmQsIExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgeyBQdWJsaXNoQ29tbWFuZCwgU05TQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNucyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50QnJpZGdlRXZlbnQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IFN0cmljdEVudlJlc29sdmVyLCBTdHJpY3RFbnZUeXBlIH0gZnJvbSAnc3RyaWN0LWVudi1yZXNvbHZlcic7XG5pbXBvcnQge1xuICBpc1Rlcm1pbmFsRXhlY3V0aW9uU3RhdHVzLFxuICBub3JtYWxpemVFeGVjdXRpb25TdGF0dXMsXG4gIHJlc29sdmVQaXBlbGluZUV4ZWN1dGlvbklkZW50aXR5LFxufSBmcm9tICcuL25vdGlmaWVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHtcbiAgaXNBbGxvd2VkUGlwZWxpbmVBcm4sXG4gIG1hdGNoZXNUYXJnZXRQaXBlbGluZVRhZ3MsXG4gIHBhcnNlQWxsb3dlZFBpcGVsaW5lQXJucyxcbiAgcGFyc2VUYXJnZXRQaXBlbGluZVRhZ3MsXG4gIHJlc29sdmVQaXBlbGluZUFybixcbiAgdG9QaXBlbGluZVRhZ01hcCxcbn0gZnJvbSAnLi90YXJnZXQtcGlwZWxpbmUtcHJlZGljYXRlcyc7XG5cbi8qKlxuICogRXZlbnRCcmlkZ2UgZGV0YWlsIHBheWxvYWQgZm9yIENvZGVQaXBlbGluZSBleGVjdXRpb24gc3RhdGUtY2hhbmdlIGV2ZW50cy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsID0ge1xuICAncGlwZWxpbmUnPzogc3RyaW5nO1xuICAnc3RhdGUnPzogc3RyaW5nO1xuICAndmVyc2lvbic/OiBzdHJpbmc7XG4gICdleGVjdXRpb24taWQnPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBFdmVudEJyaWRnZSBldmVudCBmb3IgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBzdGF0ZS1jaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQgPSBFdmVudEJyaWRnZUV2ZW50PFxuICAnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnLFxuICBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsXG4+O1xuXG4vKipcbiAqIFNOUyBjbGllbnQgdXNlZCB0byBwdWJsaXNoIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmNvbnN0IHNucyA9IG5ldyBTTlNDbGllbnQoe30pO1xuXG4vKipcbiAqIENvZGVQaXBlbGluZSBjbGllbnQgdXNlZCB0byB3YWl0IGZvciBleGVjdXRpb24gc3RhdGUgY2hhbmdlcy5cbiAqL1xuY29uc3QgY29kZXBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7fSk7XG5cbi8qKlxuICogUmVhZHMgYSByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuY29uc3QgbXVzdEVudiA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZShuYW1lLCBTdHJpY3RFbnZUeXBlLlN0cmluZywgeyB0cmltOiB0cnVlIH0pO1xuXG4vKipcbiAqIFNsZWVwcyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICovXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEpTT04gcGF5bG9hZCB0byB0aGUgZ2l2ZW4gU05TIHRvcGljIEFSTi5cbiAqL1xuY29uc3QgcHVibGlzaCA9IGFzeW5jICh0b3BpY0Fybjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IHNucy5zZW5kKG5ldyBQdWJsaXNoQ29tbWFuZCh7XG4gICAgVG9waWNBcm46IHRvcGljQXJuLFxuICAgIE1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KSk7XG59O1xuXG4vKipcbiAqIFdhaXRzIG9uIGEgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcHVibGlzaGVzIG5vdGlmaWNhdGlvbnMgd2hlbmV2ZXIgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgY2hhbmdlcy5cbiAqL1xuY29uc3Qgd2FpdFBpcGVsaW5lRXhlY3V0aW9uID0gYXN5bmMgKHBhcmFtczoge1xuICB0b3BpY0Fybjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgd2FpdEludGVydmFsU2Vjb25kczogbnVtYmVyO1xuICBtYXhXYWl0TWludXRlczogbnVtYmVyO1xuICBzdGFydEV2ZW50OiBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQ7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICB0b3BpY0FybixcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgZXhlY3V0aW9uSWQsXG4gICAgd2FpdEludGVydmFsU2Vjb25kcyxcbiAgICBtYXhXYWl0TWludXRlcyxcbiAgICBzdGFydEV2ZW50LFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIG1heFdhaXRNaW51dGVzICogNjBfMDAwO1xuICBsZXQgbGFzdFN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOacgOWIneOBqyBTVEFSVEVEIOOCkumAmuefpe+8iEV2ZW50QnJpZGdl55Sx5p2l77yJXG4gIGF3YWl0IHB1Ymxpc2godG9waWNBcm4sIHtcbiAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgcGhhc2U6ICdldmVudGJyaWRnZScsXG4gICAgcGlwZWxpbmVOYW1lLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIG9ic2VydmVkU3RhdGU6IHN0YXJ0RXZlbnQuZGV0YWlsPy5zdGF0ZSA/PyAnU1RBUlRFRCcsXG4gICAgb2JzZXJ2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGV2ZW50OiBzdGFydEV2ZW50LFxuICB9KTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY29kZXBpcGVsaW5lLnNlbmQobmV3IEdldFBpcGVsaW5lRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICBwaXBlbGluZU5hbWUsXG4gICAgICBwaXBlbGluZUV4ZWN1dGlvbklkOiBleGVjdXRpb25JZCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBub3JtYWxpemVFeGVjdXRpb25TdGF0dXMocmVzLnBpcGVsaW5lRXhlY3V0aW9uPy5zdGF0dXMpO1xuICAgIGlmIChzdGF0dXMgIT09IGxhc3RTdGF0dXMpIHtcbiAgICAgIGxhc3RTdGF0dXMgPSBzdGF0dXM7XG4gICAgICBhd2FpdCBwdWJsaXNoKHRvcGljQXJuLCB7XG4gICAgICAgIHR5cGU6ICdjb2RlcGlwZWxpbmUuZXhlY3V0aW9uJyxcbiAgICAgICAgcGhhc2U6ICd3YWl0JyxcbiAgICAgICAgcGlwZWxpbmVOYW1lLFxuICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgb2JzZXJ2ZWRTdGF0ZTogc3RhdHVzLFxuICAgICAgICBvYnNlcnZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNUZXJtaW5hbEV4ZWN1dGlvblN0YXR1cyhzdGF0dXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgc2xlZXAod2FpdEludGVydmFsU2Vjb25kcyAqIDEwMDApO1xuICB9XG5cbiAgYXdhaXQgcHVibGlzaCh0b3BpY0Fybiwge1xuICAgIHR5cGU6ICdjb2RlcGlwZWxpbmUuZXhlY3V0aW9uJyxcbiAgICBwaGFzZTogJ3dhaXQnLFxuICAgIHBpcGVsaW5lTmFtZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBvYnNlcnZlZFN0YXRlOiBsYXN0U3RhdHVzID8/ICdVTktOT1dOJyxcbiAgICBvYnNlcnZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgbm90ZTogJ1dhaXRpbmcgdGltZWQgb3V0IGJlZm9yZSB0ZXJtaW5hbCBzdGF0ZS4nLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwaXBlbGluZSBpbiB0aGUgZXZlbnQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCB0YWcgZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgRXZlbnRCcmlkZ2UgU1RBUlRFRCBldmVudFxuICogQHBhcmFtIHBpcGVsaW5lTmFtZSBwaXBlbGluZSBuYW1lIGZyb20gdGhlIGV2ZW50IGRldGFpbFxuICogQHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwaXBlbGluZSBzaG91bGQgYmUgbm90aWZpZWRcbiAqL1xuY29uc3QgaXNUYXJnZXRQaXBlbGluZUV2ZW50ID0gYXN5bmMgKFxuICBldmVudDogQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhcnRlZEV2ZW50LFxuICBwaXBlbGluZU5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB0YWdGaWx0ZXJzID0gcGFyc2VUYXJnZXRQaXBlbGluZVRhZ3MobXVzdEVudignVEFSR0VUX1BJUEVMSU5FX1RBR1MnKSk7XG4gIGNvbnN0IHBpcGVsaW5lQXJuID0gcmVzb2x2ZVBpcGVsaW5lQXJuKFxuICAgIGV2ZW50LnJlc291cmNlcyxcbiAgICBldmVudC5yZWdpb24sXG4gICAgZXZlbnQuYWNjb3VudCxcbiAgICBwaXBlbGluZU5hbWUsXG4gICk7XG4gIGlmICghcGlwZWxpbmVBcm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIHBpcGVsaW5lIEFSTiBmb3IgdGFnIGxvb2t1cCcpO1xuICB9XG5cbiAgY29uc3QgYWxsb3dlZEFybnMgPSBwYXJzZUFsbG93ZWRQaXBlbGluZUFybnMocHJvY2Vzcy5lbnYuVEFSR0VUX1BJUEVMSU5FX0FSTlMpO1xuICBpZiAoIWlzQWxsb3dlZFBpcGVsaW5lQXJuKHBpcGVsaW5lQXJuLCBhbGxvd2VkQXJucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsaXN0ZWQgPSBhd2FpdCBjb2RlcGlwZWxpbmUuc2VuZChuZXcgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQoe1xuICAgIHJlc291cmNlQXJuOiBwaXBlbGluZUFybixcbiAgfSkpO1xuXG4gIHJldHVybiBtYXRjaGVzVGFyZ2V0UGlwZWxpbmVUYWdzKHRvUGlwZWxpbmVUYWdNYXAobGlzdGVkLnRhZ3MpLCB0YWdGaWx0ZXJzKTtcbn07XG5cbi8qKlxuICogTGFtYmRhIGhhbmRsZXIgdHJpZ2dlcmVkIGJ5IEV2ZW50QnJpZGdlIHdoZW4gYSBwaXBlbGluZSBleGVjdXRpb24gdHJhbnNpdGlvbnMgdG8gU1RBUlRFRC5cbiAqIEl0IGlnbm9yZXMgcGlwZWxpbmVzIHRoYXQgZG8gbm90IG1hdGNoIGBUQVJHRVRfUElQRUxJTkVfVEFHU2AgKGFuZCBvcHRpb25hbCBgVEFSR0VUX1BJUEVMSU5FX0FSTlNgKSwgdGhlbiB3YWl0cyBmb3IgYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IENvZGVQaXBlbGluZUV4ZWN1dGlvblN0YXJ0ZWRFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0b3BpY0FybiA9IG11c3RFbnYoJ1NOU19UT1BJQ19BUk4nKTtcbiAgY29uc3QgaWRlbnRpdHkgPSByZXNvbHZlUGlwZWxpbmVFeGVjdXRpb25JZGVudGl0eShcbiAgICBldmVudC5kZXRhaWw/LnBpcGVsaW5lLFxuICAgIGV2ZW50LmRldGFpbD8uWydleGVjdXRpb24taWQnXSxcbiAgKTtcblxuICBpZiAoIWlkZW50aXR5KSB7XG4gICAgYXdhaXQgcHVibGlzaCh0b3BpY0Fybiwge1xuICAgICAgdHlwZTogJ2NvZGVwaXBlbGluZS5leGVjdXRpb24nLFxuICAgICAgcGhhc2U6ICdldmVudGJyaWRnZScsXG4gICAgICBvYnNlcnZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBub3RlOiAnTWlzc2luZyBwaXBlbGluZU5hbWUgb3IgZXhlY3V0aW9uSWQgaW4gZXZlbnQuZGV0YWlsJyxcbiAgICAgIGV2ZW50LFxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghYXdhaXQgaXNUYXJnZXRQaXBlbGluZUV2ZW50KGV2ZW50LCBpZGVudGl0eS5waXBlbGluZU5hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2FpdEludGVydmFsU2Vjb25kcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1dBSVRfSU5URVJWQUxfU0VDT05EUycsIFN0cmljdEVudlR5cGUuTnVtYmVyLCB7IGRlZmF1bHQ6IDEwIH0pO1xuICBjb25zdCBtYXhXYWl0TWludXRlcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ01BWF9XQUlUX01JTlVURVMnLCBTdHJpY3RFbnZUeXBlLk51bWJlciwgeyBkZWZhdWx0OiAxNCB9KTtcblxuICBhd2FpdCB3YWl0UGlwZWxpbmVFeGVjdXRpb24oe1xuICAgIHRvcGljQXJuLFxuICAgIHBpcGVsaW5lTmFtZTogaWRlbnRpdHkucGlwZWxpbmVOYW1lLFxuICAgIGV4ZWN1dGlvbklkOiBpZGVudGl0eS5leGVjdXRpb25JZCxcbiAgICB3YWl0SW50ZXJ2YWxTZWNvbmRzOiB3YWl0SW50ZXJ2YWxTZWNvbmRzID4gMCA/IHdhaXRJbnRlcnZhbFNlY29uZHMgOiAxMCxcbiAgICBtYXhXYWl0TWludXRlczogbWF4V2FpdE1pbnV0ZXMgPiAwID8gbWF4V2FpdE1pbnV0ZXMgOiAxNCxcbiAgICBzdGFydEV2ZW50OiBldmVudCxcbiAgfSk7XG59O1xuIl19
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Tag filter used to decide whether a CodePipeline should be notified.
3
+ */
4
+ export interface PipelineTagFilter {
5
+ /**
6
+ * Tag key that must be present on the pipeline.
7
+ */
8
+ readonly key: string;
9
+ /**
10
+ * Accepted values for {@link key}. Matching is OR within this list.
11
+ */
12
+ readonly values: readonly string[];
13
+ }
14
+ /**
15
+ * Returns whether `value` is a non-empty list of `{ key, values }` tag filters.
16
+ *
17
+ * @param value unknown JSON value
18
+ * @returns true when the value can be used as tag filters
19
+ */
20
+ export declare const isPipelineTagFilterList: (value: unknown) => value is PipelineTagFilter[];
21
+ /**
22
+ * Returns whether `value` is a single tag filter with a non-empty key and values.
23
+ *
24
+ * @param value unknown JSON value
25
+ * @returns true when the value is a tag filter
26
+ */
27
+ export declare const isPipelineTagFilter: (value: unknown) => value is PipelineTagFilter;
28
+ /**
29
+ * Parses `TARGET_PIPELINE_TAGS` JSON into tag filters.
30
+ *
31
+ * @param raw JSON string from the environment
32
+ * @returns normalized tag filters
33
+ * @throws when the JSON is invalid or not a tag-filter list
34
+ */
35
+ export declare const parseTargetPipelineTags: (raw: string) => PipelineTagFilter[];
36
+ /**
37
+ * Trims keys/values and rejects duplicate keys.
38
+ *
39
+ * @param filters tag filters to normalize
40
+ * @returns normalized filters
41
+ * @throws when a key is duplicated
42
+ */
43
+ export declare const normalizeTagFilters: (filters: readonly PipelineTagFilter[]) => PipelineTagFilter[];
44
+ /**
45
+ * Converts CodePipeline tag entries into a key/value map.
46
+ *
47
+ * @param tags tags returned by ListTagsForResource
48
+ * @returns map of tag key to tag value
49
+ */
50
+ export declare const toPipelineTagMap: (tags: readonly {
51
+ readonly key?: string;
52
+ readonly value?: string;
53
+ }[] | undefined) => {
54
+ readonly [key: string]: string;
55
+ };
56
+ /**
57
+ * Returns whether pipeline tags satisfy every filter.
58
+ * Keys are AND; values within a filter are OR.
59
+ *
60
+ * @param pipelineTags tags currently on the pipeline
61
+ * @param filters required tag filters
62
+ * @returns true when the pipeline matches all filters
63
+ */
64
+ export declare const matchesTargetPipelineTags: (pipelineTags: Readonly<{
65
+ [key: string]: string;
66
+ }>, filters: readonly PipelineTagFilter[]) => boolean;
67
+ /**
68
+ * Resolves a CodePipeline ARN for ListTagsForResource.
69
+ *
70
+ * @param resources EventBridge `resources` array
71
+ * @param region event region
72
+ * @param account event account
73
+ * @param pipelineName pipeline name from the event detail
74
+ * @returns ARN when it can be resolved
75
+ */
76
+ export declare const resolvePipelineArn: (resources: readonly string[] | undefined, region: string | undefined, account: string | undefined, pipelineName: string) => string | undefined;
77
+ /**
78
+ * Returns whether `value` is a non-empty list of non-empty strings.
79
+ *
80
+ * @param value unknown JSON value
81
+ * @returns true when the value is a string list
82
+ */
83
+ export declare const isNonEmptyStringList: (value: unknown) => value is string[];
84
+ /**
85
+ * Parses optional `TARGET_PIPELINE_ARNS` JSON into an ARN allowlist.
86
+ *
87
+ * @param raw JSON string from the environment, or undefined when unset
88
+ * @returns normalized ARNs, or undefined when the allowlist is not configured
89
+ * @throws when the JSON is invalid or not a string list
90
+ */
91
+ export declare const parseAllowedPipelineArns: (raw: string | undefined) => string[] | undefined;
92
+ /**
93
+ * Returns whether a pipeline ARN is allowed when an allowlist is configured.
94
+ *
95
+ * @param pipelineArn resolved pipeline ARN
96
+ * @param allowedArns optional allowlist
97
+ * @returns true when no allowlist is set, or the ARN is listed
98
+ */
99
+ export declare const isAllowedPipelineArn: (pipelineArn: string, allowedArns: readonly string[] | undefined) => boolean;
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAllowedPipelineArn = exports.parseAllowedPipelineArns = exports.isNonEmptyStringList = exports.resolvePipelineArn = exports.matchesTargetPipelineTags = exports.toPipelineTagMap = exports.normalizeTagFilters = exports.parseTargetPipelineTags = exports.isPipelineTagFilter = exports.isPipelineTagFilterList = void 0;
4
+ const isNonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0;
5
+ /**
6
+ * Returns whether `value` is a non-empty list of `{ key, values }` tag filters.
7
+ *
8
+ * @param value unknown JSON value
9
+ * @returns true when the value can be used as tag filters
10
+ */
11
+ const isPipelineTagFilterList = (value) => {
12
+ if (!Array.isArray(value) || value.length === 0) {
13
+ return false;
14
+ }
15
+ for (const item of value) {
16
+ if (!(0, exports.isPipelineTagFilter)(item)) {
17
+ return false;
18
+ }
19
+ }
20
+ return true;
21
+ };
22
+ exports.isPipelineTagFilterList = isPipelineTagFilterList;
23
+ /**
24
+ * Returns whether `value` is a single tag filter with a non-empty key and values.
25
+ *
26
+ * @param value unknown JSON value
27
+ * @returns true when the value is a tag filter
28
+ */
29
+ const isPipelineTagFilter = (value) => {
30
+ if (typeof value !== 'object' || value === null) {
31
+ return false;
32
+ }
33
+ if (!('key' in value) || !('values' in value)) {
34
+ return false;
35
+ }
36
+ if (!isNonEmptyString(value.key)) {
37
+ return false;
38
+ }
39
+ if (!Array.isArray(value.values) || value.values.length === 0) {
40
+ return false;
41
+ }
42
+ for (const tagValue of value.values) {
43
+ if (!isNonEmptyString(tagValue)) {
44
+ return false;
45
+ }
46
+ }
47
+ return true;
48
+ };
49
+ exports.isPipelineTagFilter = isPipelineTagFilter;
50
+ /**
51
+ * Parses `TARGET_PIPELINE_TAGS` JSON into tag filters.
52
+ *
53
+ * @param raw JSON string from the environment
54
+ * @returns normalized tag filters
55
+ * @throws when the JSON is invalid or not a tag-filter list
56
+ */
57
+ const parseTargetPipelineTags = (raw) => {
58
+ let parsed;
59
+ try {
60
+ parsed = JSON.parse(raw);
61
+ }
62
+ catch {
63
+ throw new Error('TARGET_PIPELINE_TAGS must be valid JSON');
64
+ }
65
+ if (!(0, exports.isPipelineTagFilterList)(parsed)) {
66
+ throw new Error('TARGET_PIPELINE_TAGS must be a non-empty array of { key, values }');
67
+ }
68
+ return (0, exports.normalizeTagFilters)(parsed);
69
+ };
70
+ exports.parseTargetPipelineTags = parseTargetPipelineTags;
71
+ /**
72
+ * Trims keys/values and rejects duplicate keys.
73
+ *
74
+ * @param filters tag filters to normalize
75
+ * @returns normalized filters
76
+ * @throws when a key is duplicated
77
+ */
78
+ const normalizeTagFilters = (filters) => {
79
+ const seenKeys = new Set();
80
+ const normalized = [];
81
+ for (const filter of filters) {
82
+ const key = filter.key.trim();
83
+ if (seenKeys.has(key)) {
84
+ throw new Error(`Tag filter list contains duplicate key: ${key}`);
85
+ }
86
+ seenKeys.add(key);
87
+ normalized.push({
88
+ key,
89
+ values: filter.values.map((value) => value.trim()),
90
+ });
91
+ }
92
+ return normalized;
93
+ };
94
+ exports.normalizeTagFilters = normalizeTagFilters;
95
+ /**
96
+ * Converts CodePipeline tag entries into a key/value map.
97
+ *
98
+ * @param tags tags returned by ListTagsForResource
99
+ * @returns map of tag key to tag value
100
+ */
101
+ const toPipelineTagMap = (tags) => {
102
+ const mapped = {};
103
+ if (!tags) {
104
+ return mapped;
105
+ }
106
+ for (const tag of tags) {
107
+ if (!tag.key || tag.value === undefined) {
108
+ continue;
109
+ }
110
+ mapped[tag.key] = tag.value;
111
+ }
112
+ return mapped;
113
+ };
114
+ exports.toPipelineTagMap = toPipelineTagMap;
115
+ /**
116
+ * Returns whether pipeline tags satisfy every filter.
117
+ * Keys are AND; values within a filter are OR.
118
+ *
119
+ * @param pipelineTags tags currently on the pipeline
120
+ * @param filters required tag filters
121
+ * @returns true when the pipeline matches all filters
122
+ */
123
+ const matchesTargetPipelineTags = (pipelineTags, filters) => {
124
+ for (const filter of filters) {
125
+ const actual = pipelineTags[filter.key];
126
+ if (actual === undefined) {
127
+ return false;
128
+ }
129
+ if (!filter.values.includes(actual)) {
130
+ return false;
131
+ }
132
+ }
133
+ return true;
134
+ };
135
+ exports.matchesTargetPipelineTags = matchesTargetPipelineTags;
136
+ /**
137
+ * Resolves a CodePipeline ARN for ListTagsForResource.
138
+ *
139
+ * @param resources EventBridge `resources` array
140
+ * @param region event region
141
+ * @param account event account
142
+ * @param pipelineName pipeline name from the event detail
143
+ * @returns ARN when it can be resolved
144
+ */
145
+ const resolvePipelineArn = (resources, region, account, pipelineName) => {
146
+ const fromResources = resources?.[0];
147
+ if (fromResources) {
148
+ return fromResources;
149
+ }
150
+ if (!region || !account) {
151
+ return undefined;
152
+ }
153
+ return `arn:aws:codepipeline:${region}:${account}:${pipelineName}`;
154
+ };
155
+ exports.resolvePipelineArn = resolvePipelineArn;
156
+ /**
157
+ * Returns whether `value` is a non-empty list of non-empty strings.
158
+ *
159
+ * @param value unknown JSON value
160
+ * @returns true when the value is a string list
161
+ */
162
+ const isNonEmptyStringList = (value) => {
163
+ if (!Array.isArray(value) || value.length === 0) {
164
+ return false;
165
+ }
166
+ for (const item of value) {
167
+ if (!isNonEmptyString(item)) {
168
+ return false;
169
+ }
170
+ }
171
+ return true;
172
+ };
173
+ exports.isNonEmptyStringList = isNonEmptyStringList;
174
+ /**
175
+ * Parses optional `TARGET_PIPELINE_ARNS` JSON into an ARN allowlist.
176
+ *
177
+ * @param raw JSON string from the environment, or undefined when unset
178
+ * @returns normalized ARNs, or undefined when the allowlist is not configured
179
+ * @throws when the JSON is invalid or not a string list
180
+ */
181
+ const parseAllowedPipelineArns = (raw) => {
182
+ if (raw === undefined || raw.trim() === '') {
183
+ return undefined;
184
+ }
185
+ let parsed;
186
+ try {
187
+ parsed = JSON.parse(raw);
188
+ }
189
+ catch {
190
+ throw new Error('TARGET_PIPELINE_ARNS must be valid JSON');
191
+ }
192
+ if (!(0, exports.isNonEmptyStringList)(parsed)) {
193
+ throw new Error('TARGET_PIPELINE_ARNS must be a non-empty array of strings');
194
+ }
195
+ return parsed.map((arn) => arn.trim());
196
+ };
197
+ exports.parseAllowedPipelineArns = parseAllowedPipelineArns;
198
+ /**
199
+ * Returns whether a pipeline ARN is allowed when an allowlist is configured.
200
+ *
201
+ * @param pipelineArn resolved pipeline ARN
202
+ * @param allowedArns optional allowlist
203
+ * @returns true when no allowlist is set, or the ARN is listed
204
+ */
205
+ const isAllowedPipelineArn = (pipelineArn, allowedArns) => {
206
+ if (!allowedArns) {
207
+ return true;
208
+ }
209
+ return allowedArns.includes(pipelineArn);
210
+ };
211
+ exports.isAllowedPipelineArn = isAllowedPipelineArn;
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LXBpcGVsaW5lLXByZWRpY2F0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvdGFyZ2V0LXBpcGVsaW5lLXByZWRpY2F0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZUEsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUMzRCxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSSxNQUFNLHVCQUF1QixHQUFHLENBQUMsS0FBYyxFQUFnQyxFQUFFO0lBQ3RGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBQSwyQkFBbUIsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQVpXLFFBQUEsdUJBQXVCLDJCQVlsQztBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWMsRUFBOEIsRUFBRTtJQUNoRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQXJCVyxRQUFBLG1CQUFtQix1QkFxQjlCO0FBRUY7Ozs7OztHQU1HO0FBQ0ksTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEdBQVcsRUFBdUIsRUFBRTtJQUMxRSxJQUFJLE1BQWUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLENBQUMsSUFBQSwrQkFBdUIsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxJQUFBLDJCQUFtQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQWJXLFFBQUEsdUJBQXVCLDJCQWFsQztBQUVGOzs7Ozs7R0FNRztBQUNJLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFxQyxFQUF1QixFQUFFO0lBQ2hHLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkMsTUFBTSxVQUFVLEdBQXdCLEVBQUUsQ0FBQztJQUUzQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVsQixVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2QsR0FBRztZQUNILE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFsQlcsUUFBQSxtQkFBbUIsdUJBa0I5QjtBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixJQUErRSxFQUMzQyxFQUFFO0lBQ3RDLE1BQU0sTUFBTSxHQUE4QixFQUFFLENBQUM7SUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBaEJXLFFBQUEsZ0JBQWdCLG9CQWdCM0I7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxZQUFpRCxFQUNqRCxPQUFxQyxFQUM1QixFQUFFO0lBQ1gsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQWZXLFFBQUEseUJBQXlCLDZCQWVwQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxTQUF3QyxFQUN4QyxNQUEwQixFQUMxQixPQUEyQixFQUMzQixZQUFvQixFQUNBLEVBQUU7SUFDdEIsTUFBTSxhQUFhLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLHdCQUF3QixNQUFNLElBQUksT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQ3JFLENBQUMsQ0FBQztBQWZXLFFBQUEsa0JBQWtCLHNCQWU3QjtBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQWMsRUFBcUIsRUFBRTtJQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBWlcsUUFBQSxvQkFBb0Isd0JBWS9CO0FBRUY7Ozs7OztHQU1HO0FBQ0ksTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEdBQXVCLEVBQXdCLEVBQUU7SUFDeEYsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMzQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxNQUFlLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUEsNEJBQW9CLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBakJXLFFBQUEsd0JBQXdCLDRCQWlCbkM7QUFFRjs7Ozs7O0dBTUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLFdBQW1CLEVBQ25CLFdBQTBDLEVBQ2pDLEVBQUU7SUFDWCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQVRXLFFBQUEsb0JBQW9CLHdCQVMvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGFnIGZpbHRlciB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIGEgQ29kZVBpcGVsaW5lIHNob3VsZCBiZSBub3RpZmllZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVRhZ0ZpbHRlciB7XG4gIC8qKlxuICAgKiBUYWcga2V5IHRoYXQgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZm9yIHtAbGluayBrZXl9LiBNYXRjaGluZyBpcyBPUiB3aXRoaW4gdGhpcyBsaXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuY29uc3QgaXNOb25FbXB0eVN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBgdmFsdWVgIGlzIGEgbm9uLWVtcHR5IGxpc3Qgb2YgYHsga2V5LCB2YWx1ZXMgfWAgdGFnIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIHZhbHVlIHVua25vd24gSlNPTiB2YWx1ZVxuICogQHJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0YWcgZmlsdGVyc1xuICovXG5leHBvcnQgY29uc3QgaXNQaXBlbGluZVRhZ0ZpbHRlckxpc3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaXBlbGluZVRhZ0ZpbHRlcltdID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICBpZiAoIWlzUGlwZWxpbmVUYWdGaWx0ZXIoaXRlbSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGB2YWx1ZWAgaXMgYSBzaW5nbGUgdGFnIGZpbHRlciB3aXRoIGEgbm9uLWVtcHR5IGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSB1bmtub3duIEpTT04gdmFsdWVcbiAqIEByZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSB0YWcgZmlsdGVyXG4gKi9cbmV4cG9ydCBjb25zdCBpc1BpcGVsaW5lVGFnRmlsdGVyID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlwZWxpbmVUYWdGaWx0ZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoISgna2V5JyBpbiB2YWx1ZSkgfHwgISgndmFsdWVzJyBpbiB2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFpc05vbkVtcHR5U3RyaW5nKHZhbHVlLmtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlLnZhbHVlcykgfHwgdmFsdWUudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFnVmFsdWUgb2YgdmFsdWUudmFsdWVzKSB7XG4gICAgaWYgKCFpc05vbkVtcHR5U3RyaW5nKHRhZ1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgYFRBUkdFVF9QSVBFTElORV9UQUdTYCBKU09OIGludG8gdGFnIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIHJhdyBKU09OIHN0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICogQHJldHVybnMgbm9ybWFsaXplZCB0YWcgZmlsdGVyc1xuICogQHRocm93cyB3aGVuIHRoZSBKU09OIGlzIGludmFsaWQgb3Igbm90IGEgdGFnLWZpbHRlciBsaXN0XG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVRhcmdldFBpcGVsaW5lVGFncyA9IChyYXc6IHN0cmluZyk6IFBpcGVsaW5lVGFnRmlsdGVyW10gPT4ge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUQVJHRVRfUElQRUxJTkVfVEFHUyBtdXN0IGJlIHZhbGlkIEpTT04nKTtcbiAgfVxuXG4gIGlmICghaXNQaXBlbGluZVRhZ0ZpbHRlckxpc3QocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVEFSR0VUX1BJUEVMSU5FX1RBR1MgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiB7IGtleSwgdmFsdWVzIH0nKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVUYWdGaWx0ZXJzKHBhcnNlZCk7XG59O1xuXG4vKipcbiAqIFRyaW1zIGtleXMvdmFsdWVzIGFuZCByZWplY3RzIGR1cGxpY2F0ZSBrZXlzLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXJzIHRhZyBmaWx0ZXJzIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMgbm9ybWFsaXplZCBmaWx0ZXJzXG4gKiBAdGhyb3dzIHdoZW4gYSBrZXkgaXMgZHVwbGljYXRlZFxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplVGFnRmlsdGVycyA9IChmaWx0ZXJzOiByZWFkb25seSBQaXBlbGluZVRhZ0ZpbHRlcltdKTogUGlwZWxpbmVUYWdGaWx0ZXJbXSA9PiB7XG4gIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IFBpcGVsaW5lVGFnRmlsdGVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgY29uc3Qga2V5ID0gZmlsdGVyLmtleS50cmltKCk7XG4gICAgaWYgKHNlZW5LZXlzLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhZyBmaWx0ZXIgbGlzdCBjb250YWlucyBkdXBsaWNhdGUga2V5OiAke2tleX1gKTtcbiAgICB9XG4gICAgc2VlbktleXMuYWRkKGtleSk7XG5cbiAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAga2V5LFxuICAgICAgdmFsdWVzOiBmaWx0ZXIudmFsdWVzLm1hcCgodmFsdWUpID0+IHZhbHVlLnRyaW0oKSksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgQ29kZVBpcGVsaW5lIHRhZyBlbnRyaWVzIGludG8gYSBrZXkvdmFsdWUgbWFwLlxuICpcbiAqIEBwYXJhbSB0YWdzIHRhZ3MgcmV0dXJuZWQgYnkgTGlzdFRhZ3NGb3JSZXNvdXJjZVxuICogQHJldHVybnMgbWFwIG9mIHRhZyBrZXkgdG8gdGFnIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCB0b1BpcGVsaW5lVGFnTWFwID0gKFxuICB0YWdzOiByZWFkb25seSB7IHJlYWRvbmx5IGtleT86IHN0cmluZzsgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkLFxuKTogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG1hcHBlZDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBpZiAoIXRhZ3MpIHtcbiAgICByZXR1cm4gbWFwcGVkO1xuICB9XG5cbiAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgIGlmICghdGFnLmtleSB8fCB0YWcudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG1hcHBlZFt0YWcua2V5XSA9IHRhZy52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBtYXBwZWQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBwaXBlbGluZSB0YWdzIHNhdGlzZnkgZXZlcnkgZmlsdGVyLlxuICogS2V5cyBhcmUgQU5EOyB2YWx1ZXMgd2l0aGluIGEgZmlsdGVyIGFyZSBPUi5cbiAqXG4gKiBAcGFyYW0gcGlwZWxpbmVUYWdzIHRhZ3MgY3VycmVudGx5IG9uIHRoZSBwaXBlbGluZVxuICogQHBhcmFtIGZpbHRlcnMgcmVxdWlyZWQgdGFnIGZpbHRlcnNcbiAqIEByZXR1cm5zIHRydWUgd2hlbiB0aGUgcGlwZWxpbmUgbWF0Y2hlcyBhbGwgZmlsdGVyc1xuICovXG5leHBvcnQgY29uc3QgbWF0Y2hlc1RhcmdldFBpcGVsaW5lVGFncyA9IChcbiAgcGlwZWxpbmVUYWdzOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PixcbiAgZmlsdGVyczogcmVhZG9ubHkgUGlwZWxpbmVUYWdGaWx0ZXJbXSxcbik6IGJvb2xlYW4gPT4ge1xuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgY29uc3QgYWN0dWFsID0gcGlwZWxpbmVUYWdzW2ZpbHRlci5rZXldO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWZpbHRlci52YWx1ZXMuaW5jbHVkZXMoYWN0dWFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIENvZGVQaXBlbGluZSBBUk4gZm9yIExpc3RUYWdzRm9yUmVzb3VyY2UuXG4gKlxuICogQHBhcmFtIHJlc291cmNlcyBFdmVudEJyaWRnZSBgcmVzb3VyY2VzYCBhcnJheVxuICogQHBhcmFtIHJlZ2lvbiBldmVudCByZWdpb25cbiAqIEBwYXJhbSBhY2NvdW50IGV2ZW50IGFjY291bnRcbiAqIEBwYXJhbSBwaXBlbGluZU5hbWUgcGlwZWxpbmUgbmFtZSBmcm9tIHRoZSBldmVudCBkZXRhaWxcbiAqIEByZXR1cm5zIEFSTiB3aGVuIGl0IGNhbiBiZSByZXNvbHZlZFxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBpcGVsaW5lQXJuID0gKFxuICByZXNvdXJjZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICByZWdpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYWNjb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwaXBlbGluZU5hbWU6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGZyb21SZXNvdXJjZXMgPSByZXNvdXJjZXM/LlswXTtcbiAgaWYgKGZyb21SZXNvdXJjZXMpIHtcbiAgICByZXR1cm4gZnJvbVJlc291cmNlcztcbiAgfVxuICBpZiAoIXJlZ2lvbiB8fCAhYWNjb3VudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7cmVnaW9ufToke2FjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBgdmFsdWVgIGlzIGEgbm9uLWVtcHR5IGxpc3Qgb2Ygbm9uLWVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHZhbHVlIHVua25vd24gSlNPTiB2YWx1ZVxuICogQHJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyBsaXN0XG4gKi9cbmV4cG9ydCBjb25zdCBpc05vbkVtcHR5U3RyaW5nTGlzdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICBpZiAoIWlzTm9uRW1wdHlTdHJpbmcoaXRlbSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUGFyc2VzIG9wdGlvbmFsIGBUQVJHRVRfUElQRUxJTkVfQVJOU2AgSlNPTiBpbnRvIGFuIEFSTiBhbGxvd2xpc3QuXG4gKlxuICogQHBhcmFtIHJhdyBKU09OIHN0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudCwgb3IgdW5kZWZpbmVkIHdoZW4gdW5zZXRcbiAqIEByZXR1cm5zIG5vcm1hbGl6ZWQgQVJOcywgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGFsbG93bGlzdCBpcyBub3QgY29uZmlndXJlZFxuICogQHRocm93cyB3aGVuIHRoZSBKU09OIGlzIGludmFsaWQgb3Igbm90IGEgc3RyaW5nIGxpc3RcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlQWxsb3dlZFBpcGVsaW5lQXJucyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdy50cmltKCkgPT09ICcnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RBUkdFVF9QSVBFTElORV9BUk5TIG11c3QgYmUgdmFsaWQgSlNPTicpO1xuICB9XG5cbiAgaWYgKCFpc05vbkVtcHR5U3RyaW5nTGlzdChwYXJzZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUQVJHRVRfUElQRUxJTkVfQVJOUyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWQubWFwKChhcm4pID0+IGFybi50cmltKCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSBwaXBlbGluZSBBUk4gaXMgYWxsb3dlZCB3aGVuIGFuIGFsbG93bGlzdCBpcyBjb25maWd1cmVkLlxuICpcbiAqIEBwYXJhbSBwaXBlbGluZUFybiByZXNvbHZlZCBwaXBlbGluZSBBUk5cbiAqIEBwYXJhbSBhbGxvd2VkQXJucyBvcHRpb25hbCBhbGxvd2xpc3RcbiAqIEByZXR1cm5zIHRydWUgd2hlbiBubyBhbGxvd2xpc3QgaXMgc2V0LCBvciB0aGUgQVJOIGlzIGxpc3RlZFxuICovXG5leHBvcnQgY29uc3QgaXNBbGxvd2VkUGlwZWxpbmVBcm4gPSAoXG4gIHBpcGVsaW5lQXJuOiBzdHJpbmcsXG4gIGFsbG93ZWRBcm5zOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWFsbG93ZWRBcm5zKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYWxsb3dlZEFybnMuaW5jbHVkZXMocGlwZWxpbmVBcm4pO1xufTtcblxuIl19
package/lib/index.d.ts CHANGED
@@ -1 +1 @@
1
- export { CodePipelineEventNotifier, CodePipelineEventNotifierProps, } from './constructs/codepipeline-event-notifier';
1
+ export { CodePipelineEventNotifier, CodePipelineEventNotifierProps, TargetPipeline, TargetPipelineTag, } from './constructs/codepipeline-event-notifier';
package/lib/index.js CHANGED
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CodePipelineEventNotifier = void 0;
4
4
  var codepipeline_event_notifier_1 = require("./constructs/codepipeline-event-notifier");
5
5
  Object.defineProperty(exports, "CodePipelineEventNotifier", { enumerable: true, get: function () { return codepipeline_event_notifier_1.CodePipelineEventNotifier; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0ZBR2tEO0FBRmhELHdJQUFBLHlCQUF5QixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcixcbiAgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllclByb3BzLFxufSBmcm9tICcuL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmaWVyJztcbiJdfQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0ZBS2tEO0FBSmhELHdJQUFBLHlCQUF5QixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcixcbiAgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllclByb3BzLFxuICBUYXJnZXRQaXBlbGluZSxcbiAgVGFyZ2V0UGlwZWxpbmVUYWcsXG59IGZyb20gJy4vY29uc3RydWN0cy9jb2RlcGlwZWxpbmUtZXZlbnQtbm90aWZpZXInO1xuIl19
@@ -13,8 +13,17 @@ class CodePipelineEventNotifyStack extends aws_cdk_lib_1.Stack {
13
13
  */
14
14
  constructor(scope, id) {
15
15
  super(scope, id);
16
- new codepipeline_event_notifier_1.CodePipelineEventNotifier(this, 'CodePipelineEventNotifier');
16
+ new codepipeline_event_notifier_1.CodePipelineEventNotifier(this, 'CodePipelineEventNotifier', {
17
+ targetPipeline: {
18
+ tags: [
19
+ {
20
+ key: 'Notify',
21
+ values: ['true'],
22
+ },
23
+ ],
24
+ },
25
+ });
17
26
  }
18
27
  }
19
28
  exports.CodePipelineEventNotifyStack = CodePipelineEventNotifyStack;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFja3MvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBb0M7QUFFcEMsMkZBQXNGO0FBRXRGOztHQUVHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxtQkFBSztJQUNyRDs7O09BR0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksdURBQXlCLENBQUMsSUFBSSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBVkQsb0VBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllciB9IGZyb20gJy4uL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmaWVyJztcblxuLyoqXG4gKiBFeGFtcGxlIHN0YWNrIHdpcmluZyB1cCB7QGxpbmsgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcn0uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlUGlwZWxpbmVFdmVudE5vdGlmeVN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBhcHAgc2NvcGVcbiAgICogQHBhcmFtIGlkIHRoZSBzdGFjayBpZFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcih0aGlzLCAnQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcicpO1xuICB9XG59Il19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFja3MvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBb0M7QUFFcEMsMkZBQXNGO0FBRXRGOztHQUVHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxtQkFBSztJQUNyRDs7O09BR0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksdURBQXlCLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQy9ELGNBQWMsRUFBRTtnQkFDZCxJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsR0FBRyxFQUFFLFFBQVE7d0JBQ2IsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO3FCQUNqQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkJELG9FQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb2RlUGlwZWxpbmVFdmVudE5vdGlmaWVyIH0gZnJvbSAnLi4vY29uc3RydWN0cy9jb2RlcGlwZWxpbmUtZXZlbnQtbm90aWZpZXInO1xuXG4vKipcbiAqIEV4YW1wbGUgc3RhY2sgd2lyaW5nIHVwIHtAbGluayBDb2RlUGlwZWxpbmVFdmVudE5vdGlmaWVyfS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvZGVQaXBlbGluZUV2ZW50Tm90aWZ5U3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIGFwcCBzY29wZVxuICAgKiBAcGFyYW0gaWQgdGhlIHN0YWNrIGlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBDb2RlUGlwZWxpbmVFdmVudE5vdGlmaWVyKHRoaXMsICdDb2RlUGlwZWxpbmVFdmVudE5vdGlmaWVyJywge1xuICAgICAgdGFyZ2V0UGlwZWxpbmU6IHtcbiAgICAgICAgdGFnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ05vdGlmeScsXG4gICAgICAgICAgICB2YWx1ZXM6IFsndHJ1ZSddLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59Il19
package/package.json CHANGED
@@ -41,6 +41,7 @@
41
41
  "devDependencies": {
42
42
  "@aws-sdk/client-codepipeline": "^3.1080.0",
43
43
  "@aws-sdk/client-sns": "^3.1080.0",
44
+ "@gammarers/projen-projects": "^0.2.4",
44
45
  "@stylistic/eslint-plugin": "^2",
45
46
  "@types/aws-lambda": "^8.10.162",
46
47
  "@types/jest": "^30.0.0",
@@ -48,20 +49,20 @@
48
49
  "@typescript-eslint/eslint-plugin": "^8",
49
50
  "@typescript-eslint/parser": "^8",
50
51
  "aws-cdk-lib": "2.232.0",
51
- "commit-and-tag-version": "^12",
52
+ "commit-and-tag-version": "^13",
52
53
  "constructs": "10.5.1",
53
54
  "esbuild": "^0.28.2",
54
55
  "eslint": "^9",
55
56
  "eslint-import-resolver-typescript": "^4.4.5",
56
57
  "eslint-plugin-import": "^2.32.0",
57
- "jest": "^30.5.1",
58
+ "jest": "^30.5.2",
58
59
  "jest-junit": "^17",
59
60
  "jsii": "6.0.x",
60
61
  "jsii-diff": "^1.140.0",
61
62
  "jsii-docgen": "^10.5.0",
62
63
  "jsii-pacmak": "^1.140.0",
63
64
  "jsii-rosetta": "6.0.x",
64
- "projen": "^0.103.23",
65
+ "projen": "^0.103.25",
65
66
  "strict-env-resolver": "^0.5.1",
66
67
  "ts-jest": "^29.4.12",
67
68
  "ts-node": "^10.9.2",
@@ -89,7 +90,7 @@
89
90
  "publishConfig": {
90
91
  "access": "public"
91
92
  },
92
- "version": "0.2.8",
93
+ "version": "0.3.1",
93
94
  "jest": {
94
95
  "coverageProvider": "v8",
95
96
  "testMatch": [