codepipeline-event-notifier 0.1.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.
@@ -0,0 +1,12 @@
1
+ import { Construct } from 'constructs';
2
+ /**
3
+ * Provisions an EventBridge rule that listens for CodePipeline execution STARTED events,
4
+ * then invokes a notifier Lambda which publishes execution state changes to an SNS topic.
5
+ */
6
+ export declare class CodePipelineEventNotifier extends Construct {
7
+ /**
8
+ * @param scope the construct scope
9
+ * @param id the construct id
10
+ */
11
+ constructor(scope: Construct, id: string);
12
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodePipelineEventNotifier = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const notifier_function_1 = require("../funcs/notifier-function");
7
+ /**
8
+ * Provisions an EventBridge rule that listens for CodePipeline execution STARTED events,
9
+ * then invokes a notifier Lambda which publishes execution state changes to an SNS topic.
10
+ */
11
+ class CodePipelineEventNotifier extends constructs_1.Construct {
12
+ /**
13
+ * @param scope the construct scope
14
+ * @param id the construct id
15
+ */
16
+ constructor(scope, id) {
17
+ super(scope, id);
18
+ /**
19
+ * SNS topic that receives CodePipeline execution notifications.
20
+ * Subscriptions (email/HTTP/etc.) are intentionally not defined here.
21
+ */
22
+ const topic = new aws_cdk_lib_1.aws_sns.Topic(this, 'PipelineEventTopic');
23
+ const fn = new notifier_function_1.NotifierFunction(this, 'NotifierFunction', {
24
+ environment: {
25
+ SNS_TOPIC_ARN: topic.topicArn,
26
+ POLL_INTERVAL_SECONDS: '10',
27
+ MAX_POLL_MINUTES: '14',
28
+ },
29
+ timeout: aws_cdk_lib_1.Duration.minutes(15),
30
+ });
31
+ // Allow the notifier to publish notifications.
32
+ topic.grantPublish(fn);
33
+ fn.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
34
+ actions: [
35
+ 'codepipeline:GetPipelineExecution',
36
+ ],
37
+ resources: ['*'],
38
+ }));
39
+ // Trigger the notifier when a pipeline execution enters STARTED.
40
+ new aws_cdk_lib_1.aws_events.Rule(this, 'OnPipelineExecutionStartedRule', {
41
+ eventPattern: {
42
+ source: ['aws.codepipeline'],
43
+ detailType: ['CodePipeline Pipeline Execution State Change'],
44
+ detail: {
45
+ state: ['STARTED'],
46
+ },
47
+ },
48
+ targets: [new aws_cdk_lib_1.aws_events_targets.LambdaFunction(fn)],
49
+ });
50
+ }
51
+ }
52
+ exports.CodePipelineEventNotifier = CodePipelineEventNotifier;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmaWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE0SDtBQUM1SCwyQ0FBdUM7QUFDdkMsa0VBQThEO0FBRTlEOzs7R0FHRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0JBQVM7SUFDdEQ7OztPQUdHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQjs7O1dBR0c7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLHFCQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxHQUFHLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3hELFdBQVcsRUFBRTtnQkFDWCxhQUFhLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQzdCLHFCQUFxQixFQUFFLElBQUk7Z0JBQzNCLGdCQUFnQixFQUFFLElBQUk7YUFDdkI7WUFDRCxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILCtDQUErQztRQUMvQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztZQUN6QyxPQUFPLEVBQUU7Z0JBQ1AsbUNBQW1DO2FBQ3BDO1lBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUosaUVBQWlFO1FBQ2pFLElBQUksd0JBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGdDQUFnQyxFQUFFO1lBQ3RELFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDNUIsVUFBVSxFQUFFLENBQUMsOENBQThDLENBQUM7Z0JBQzVELE1BQU0sRUFBRTtvQkFDTixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7aUJBQ25CO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLGdDQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVDRCw4REE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgYXdzX2V2ZW50cyBhcyBldmVudHMsIGF3c19ldmVudHNfdGFyZ2V0cyBhcyB0YXJnZXRzLCBhd3NfaWFtIGFzIGlhbSwgYXdzX3NucyBhcyBzbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IE5vdGlmaWVyRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jcy9ub3RpZmllci1mdW5jdGlvbic7XG5cbi8qKlxuICogUHJvdmlzaW9ucyBhbiBFdmVudEJyaWRnZSBydWxlIHRoYXQgbGlzdGVucyBmb3IgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBTVEFSVEVEIGV2ZW50cyxcbiAqIHRoZW4gaW52b2tlcyBhIG5vdGlmaWVyIExhbWJkYSB3aGljaCBwdWJsaXNoZXMgZXhlY3V0aW9uIHN0YXRlIGNoYW5nZXMgdG8gYW4gU05TIHRvcGljLlxuICovXG5leHBvcnQgY2xhc3MgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgdGhlIGNvbnN0cnVjdCBpZFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvKipcbiAgICAgKiBTTlMgdG9waWMgdGhhdCByZWNlaXZlcyBDb2RlUGlwZWxpbmUgZXhlY3V0aW9uIG5vdGlmaWNhdGlvbnMuXG4gICAgICogU3Vic2NyaXB0aW9ucyAoZW1haWwvSFRUUC9ldGMuKSBhcmUgaW50ZW50aW9uYWxseSBub3QgZGVmaW5lZCBoZXJlLlxuICAgICAqL1xuICAgIGNvbnN0IHRvcGljID0gbmV3IHNucy5Ub3BpYyh0aGlzLCAnUGlwZWxpbmVFdmVudFRvcGljJyk7XG5cbiAgICBjb25zdCBmbiA9IG5ldyBOb3RpZmllckZ1bmN0aW9uKHRoaXMsICdOb3RpZmllckZ1bmN0aW9uJywge1xuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU05TX1RPUElDX0FSTjogdG9waWMudG9waWNBcm4sXG4gICAgICAgIFBPTExfSU5URVJWQUxfU0VDT05EUzogJzEwJyxcbiAgICAgICAgTUFYX1BPTExfTUlOVVRFUzogJzE0JyxcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcblxuICAgIC8vIEFsbG93IHRoZSBub3RpZmllciB0byBwdWJsaXNoIG5vdGlmaWNhdGlvbnMuXG4gICAgdG9waWMuZ3JhbnRQdWJsaXNoKGZuKTtcbiAgICBmbi5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnY29kZXBpcGVsaW5lOkdldFBpcGVsaW5lRXhlY3V0aW9uJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcblxuICAgIC8vIFRyaWdnZXIgdGhlIG5vdGlmaWVyIHdoZW4gYSBwaXBlbGluZSBleGVjdXRpb24gZW50ZXJzIFNUQVJURUQuXG4gICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdPblBpcGVsaW5lRXhlY3V0aW9uU3RhcnRlZFJ1bGUnLCB7XG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgZGV0YWlsVHlwZTogWydDb2RlUGlwZWxpbmUgUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIENoYW5nZSddLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBzdGF0ZTogWydTVEFSVEVEJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZuKV0sXG4gICAgfSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for NotifierFunction
5
+ */
6
+ export interface NotifierFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/funcs/notifier.
10
+ */
11
+ export declare class NotifierFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: NotifierFunctionProps);
13
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NotifierFunction = void 0;
37
+ // ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
38
+ const path = __importStar(require("path"));
39
+ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
40
+ /**
41
+ * An AWS Lambda function which executes src/funcs/notifier.
42
+ */
43
+ class NotifierFunction extends lambda.Function {
44
+ constructor(scope, id, props) {
45
+ super(scope, id, {
46
+ description: 'src/funcs/notifier.lambda.ts',
47
+ ...props,
48
+ runtime: new lambda.Runtime('nodejs24.x', lambda.RuntimeFamily.NODEJS),
49
+ handler: 'index.handler',
50
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/funcs/notifier.lambda')),
51
+ });
52
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
53
+ }
54
+ }
55
+ exports.NotifierFunction = NotifierFunction;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXItZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Mvbm90aWZpZXItZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkVBQTZFO0FBQzdFLDJDQUE2QjtBQUM3QiwrREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ25ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsOEJBQThCO1lBQzNDLEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3hGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsNENBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIE5vdGlmaWVyRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmllckZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9mdW5jcy9ub3RpZmllci5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdGlmaWVyRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IE5vdGlmaWVyRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvZnVuY3Mvbm90aWZpZXIubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMyNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2Z1bmNzL25vdGlmaWVyLmxhbWJkYScpKSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KCdBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRCcsICcxJywgeyByZW1vdmVJbkVkZ2U6IHRydWUgfSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,20 @@
1
+ import type { EventBridgeEvent } from 'aws-lambda';
2
+ /**
3
+ * EventBridge detail payload for CodePipeline execution state-change events.
4
+ */
5
+ type CodePipelineExecutionStartedDetail = {
6
+ 'pipeline'?: string;
7
+ 'state'?: string;
8
+ 'version'?: string;
9
+ 'execution-id'?: string;
10
+ };
11
+ /**
12
+ * EventBridge event for CodePipeline execution state-change notifications.
13
+ */
14
+ type CodePipelineExecutionStartedEvent = EventBridgeEvent<'CodePipeline Pipeline Execution State Change', CodePipelineExecutionStartedDetail>;
15
+ /**
16
+ * Lambda handler triggered by EventBridge when a pipeline execution transitions to STARTED.
17
+ * It polls the execution status until it reaches a terminal state or times out.
18
+ */
19
+ export declare const handler: (event: CodePipelineExecutionStartedEvent) => Promise<void>;
20
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ const client_codepipeline_1 = require("@aws-sdk/client-codepipeline");
5
+ const client_sns_1 = require("@aws-sdk/client-sns");
6
+ const strict_env_resolver_1 = require("strict-env-resolver");
7
+ /**
8
+ * SNS client used to publish notifications.
9
+ */
10
+ const sns = new client_sns_1.SNSClient({});
11
+ /**
12
+ * CodePipeline client used to poll execution state.
13
+ */
14
+ const codepipeline = new client_codepipeline_1.CodePipelineClient({});
15
+ /**
16
+ * Reads a required environment variable.
17
+ */
18
+ const mustEnv = (name) => strict_env_resolver_1.StrictEnvResolver.resolve(name, strict_env_resolver_1.StrictEnvType.String, { trim: true });
19
+ /**
20
+ * Sleeps for the specified number of milliseconds.
21
+ */
22
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
23
+ /**
24
+ * Publishes a JSON payload to the given SNS topic ARN.
25
+ */
26
+ const publish = async (topicArn, payload) => {
27
+ await sns.send(new client_sns_1.PublishCommand({
28
+ TopicArn: topicArn,
29
+ Message: JSON.stringify(payload),
30
+ }));
31
+ };
32
+ /**
33
+ * Polls a CodePipeline execution and publishes notifications whenever the execution status changes.
34
+ */
35
+ const pollPipelineExecution = async (params) => {
36
+ const { topicArn, pipelineName, executionId, pollIntervalSeconds, maxPollMinutes, startEvent, } = params;
37
+ const deadline = Date.now() + maxPollMinutes * 60_000;
38
+ let lastStatus;
39
+ // 最初に STARTED を通知(EventBridge由来)
40
+ await publish(topicArn, {
41
+ type: 'codepipeline.execution',
42
+ phase: 'eventbridge',
43
+ pipelineName,
44
+ executionId,
45
+ observedState: startEvent.detail?.state ?? 'STARTED',
46
+ observedAt: new Date().toISOString(),
47
+ event: startEvent,
48
+ });
49
+ while (Date.now() < deadline) {
50
+ const res = await codepipeline.send(new client_codepipeline_1.GetPipelineExecutionCommand({
51
+ pipelineName,
52
+ pipelineExecutionId: executionId,
53
+ }));
54
+ const statusRaw = res.pipelineExecution?.status ?? 'UNKNOWN';
55
+ const status = String(statusRaw).toUpperCase();
56
+ if (status !== lastStatus) {
57
+ lastStatus = status;
58
+ await publish(topicArn, {
59
+ type: 'codepipeline.execution',
60
+ phase: 'poll',
61
+ pipelineName,
62
+ executionId,
63
+ observedState: status,
64
+ observedAt: new Date().toISOString(),
65
+ });
66
+ }
67
+ if (status === 'SUCCEEDED' || status === 'FAILED' || status === 'STOPPED' || status === 'SUPERSEDED') {
68
+ return;
69
+ }
70
+ await sleep(pollIntervalSeconds * 1000);
71
+ }
72
+ await publish(topicArn, {
73
+ type: 'codepipeline.execution',
74
+ phase: 'poll',
75
+ pipelineName,
76
+ executionId,
77
+ observedState: lastStatus ?? 'UNKNOWN',
78
+ observedAt: new Date().toISOString(),
79
+ note: 'Polling timed out before terminal state.',
80
+ });
81
+ };
82
+ /**
83
+ * Lambda handler triggered by EventBridge when a pipeline execution transitions to STARTED.
84
+ * It polls the execution status until it reaches a terminal state or times out.
85
+ */
86
+ const handler = async (event) => {
87
+ const topicArn = mustEnv('SNS_TOPIC_ARN');
88
+ const pipelineName = event.detail?.pipeline;
89
+ const executionId = event.detail?.['execution-id'];
90
+ if (!pipelineName || !executionId) {
91
+ await publish(topicArn, {
92
+ type: 'codepipeline.execution',
93
+ phase: 'eventbridge',
94
+ observedAt: new Date().toISOString(),
95
+ note: 'Missing pipelineName or executionId in event.detail',
96
+ event,
97
+ });
98
+ return;
99
+ }
100
+ const pollIntervalSeconds = strict_env_resolver_1.StrictEnvResolver.resolve('POLL_INTERVAL_SECONDS', strict_env_resolver_1.StrictEnvType.Number, { default: 10 });
101
+ const maxPollMinutes = strict_env_resolver_1.StrictEnvResolver.resolve('MAX_POLL_MINUTES', strict_env_resolver_1.StrictEnvType.Number, { default: 14 });
102
+ await pollPipelineExecution({
103
+ topicArn,
104
+ pipelineName,
105
+ executionId,
106
+ pollIntervalSeconds: pollIntervalSeconds > 0 ? pollIntervalSeconds : 10,
107
+ maxPollMinutes: maxPollMinutes > 0 ? maxPollMinutes : 14,
108
+ startEvent: event,
109
+ });
110
+ };
111
+ exports.handler = handler;
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL25vdGlmaWVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzRUFBK0Y7QUFDL0Ysb0RBQWdFO0FBRWhFLDZEQUF1RTtBQW9CdkU7O0dBRUc7QUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUI7O0dBRUc7QUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLHdDQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRSxDQUFDLHVDQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUNBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUVoSDs7R0FFRztBQUNILE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFpQixFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUUvRjs7R0FFRztBQUNILE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFFLE9BQWdCLEVBQWlCLEVBQUU7SUFDMUUsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksMkJBQWMsQ0FBQztRQUNoQyxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7S0FDakMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQUcsS0FBSyxFQUFFLE1BT3BDLEVBQWlCLEVBQUU7SUFDbEIsTUFBTSxFQUNKLFFBQVEsRUFDUixZQUFZLEVBQ1osV0FB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Ryx1Q0FBaUIsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsbUNBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0SCxNQUFNLGNBQWMsR0FBRyx1Q0FBaUIsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsbUNBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1RyxNQUFNLHFCQUFxQixDQUFDO1FBQzFCLFFBQVE7UUFDUixZQUFZO1FBQ1osV0FBVztRQUNYLG1CQUFtQixFQUFFLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkUsY0FBYyxFQUFFLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4RCxVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUEzQlcsUUFBQSxPQUFPLFdBMkJsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZGVQaXBlbGluZUNsaWVudCwgR2V0UGlwZWxpbmVFeGVjdXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgeyBQdWJsaXNoQ29tbWFuZCwgU05TQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNucyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50QnJpZGdlRXZlbnQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IFN0cmljdEVudlJlc29sdmVyLCBTdHJpY3RFbnZUeXBlIH0gZnJvbSAnc3RyaWN0LWVudi1yZXNvbHZlcic7XG5cbi8qKlxuICogRXZlbnRCcmlkZ2UgZGV0YWlsIHBheWxvYWQgZm9yIENvZGVQaXBlbGluZSBleGVjdXRpb24gc3RhdGUtY2hhbmdlIGV2ZW50cy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsID0ge1xuICAncGlwZWxpbmUnPzogc3RyaW5nO1xuICAnc3RhdGUnPzogc3RyaW5nO1xuICAndmVyc2lvbic/OiBzdHJpbmc7XG4gICdleGVjdXRpb24taWQnPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBFdmVudEJyaWRnZSBldmVudCBmb3IgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBzdGF0ZS1jaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAqL1xudHlwZSBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQgPSBFdmVudEJyaWRnZUV2ZW50PFxuICAnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnLFxuICBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRGV0YWlsXG4+O1xuXG4vKipcbiAqIFNOUyBjbGllbnQgdXNlZCB0byBwdWJsaXNoIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmNvbnN0IHNucyA9IG5ldyBTTlNDbGllbnQoe30pO1xuXG4vKipcbiAqIENvZGVQaXBlbGluZSBjbGllbnQgdXNlZCB0byBwb2xsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuY29uc3QgY29kZXBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7fSk7XG5cbi8qKlxuICogUmVhZHMgYSByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuY29uc3QgbXVzdEVudiA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZShuYW1lLCBTdHJpY3RFbnZUeXBlLlN0cmluZywgeyB0cmltOiB0cnVlIH0pO1xuXG4vKipcbiAqIFNsZWVwcyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICovXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEpTT04gcGF5bG9hZCB0byB0aGUgZ2l2ZW4gU05TIHRvcGljIEFSTi5cbiAqL1xuY29uc3QgcHVibGlzaCA9IGFzeW5jICh0b3BpY0Fybjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IHNucy5zZW5kKG5ldyBQdWJsaXNoQ29tbWFuZCh7XG4gICAgVG9waWNBcm46IHRvcGljQXJuLFxuICAgIE1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICB9KSk7XG59O1xuXG4vKipcbiAqIFBvbGxzIGEgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcHVibGlzaGVzIG5vdGlmaWNhdGlvbnMgd2hlbmV2ZXIgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgY2hhbmdlcy5cbiAqL1xuY29uc3QgcG9sbFBpcGVsaW5lRXhlY3V0aW9uID0gYXN5bmMgKHBhcmFtczoge1xuICB0b3BpY0Fybjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgcG9sbEludGVydmFsU2Vjb25kczogbnVtYmVyO1xuICBtYXhQb2xsTWludXRlczogbnVtYmVyO1xuICBzdGFydEV2ZW50OiBDb2RlUGlwZWxpbmVFeGVjdXRpb25TdGFydGVkRXZlbnQ7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICB0b3BpY0FybixcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgZXhlY3V0aW9uSWQsXG4gICAgcG9sbEludGVydmFsU2Vjb25kcyxcbiAgICBtYXhQb2xsTWludXRlcyxcbiAgICBzdGFydEV2ZW50LFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIG1heFBvbGxNaW51dGVzICogNjBfMDAwO1xuICBsZXQgbGFzdFN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOacgOWIneOBqyBTVEFSVEVEIOOCkumAmuefpe+8iEV2ZW50QnJpZGdl55Sx5p2l77yJXG4gIGF3YWl0IHB1Ymxpc2godG9waWNBcm4sIHtcbiAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgcGhhc2U6ICdldmVudGJyaWRnZScsXG4gICAgcGlwZWxpbmVOYW1lLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIG9ic2VydmVkU3RhdGU6IHN0YXJ0RXZlbnQuZGV0YWlsPy5zdGF0ZSA/PyAnU1RBUlRFRCcsXG4gICAgb2JzZXJ2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGV2ZW50OiBzdGFydEV2ZW50LFxuICB9KTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY29kZXBpcGVsaW5lLnNlbmQobmV3IEdldFBpcGVsaW5lRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICBwaXBlbGluZU5hbWUsXG4gICAgICBwaXBlbGluZUV4ZWN1dGlvbklkOiBleGVjdXRpb25JZCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzdGF0dXNSYXcgPSByZXMucGlwZWxpbmVFeGVjdXRpb24/LnN0YXR1cyA/PyAnVU5LTk9XTic7XG4gICAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c1JhdykudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoc3RhdHVzICE9PSBsYXN0U3RhdHVzKSB7XG4gICAgICBsYXN0U3RhdHVzID0gc3RhdHVzO1xuICAgICAgYXdhaXQgcHVibGlzaCh0b3BpY0Fybiwge1xuICAgICAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgICAgIHBoYXNlOiAncG9sbCcsXG4gICAgICAgIHBpcGVsaW5lTmFtZSxcbiAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgIG9ic2VydmVkU3RhdGU6IHN0YXR1cyxcbiAgICAgICAgb2JzZXJ2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ1NVQ0NFRURFRCcgfHwgc3RhdHVzID09PSAnRkFJTEVEJyB8fCBzdGF0dXMgPT09ICdTVE9QUEVEJyB8fCBzdGF0dXMgPT09ICdTVVBFUlNFREVEJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKHBvbGxJbnRlcnZhbFNlY29uZHMgKiAxMDAwKTtcbiAgfVxuXG4gIGF3YWl0IHB1Ymxpc2godG9waWNBcm4sIHtcbiAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgcGhhc2U6ICdwb2xsJyxcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgZXhlY3V0aW9uSWQsXG4gICAgb2JzZXJ2ZWRTdGF0ZTogbGFzdFN0YXR1cyA/PyAnVU5LTk9XTicsXG4gICAgb2JzZXJ2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIG5vdGU6ICdQb2xsaW5nIHRpbWVkIG91dCBiZWZvcmUgdGVybWluYWwgc3RhdGUuJyxcbiAgfSk7XG59O1xuXG4vKipcbiAqIExhbWJkYSBoYW5kbGVyIHRyaWdnZXJlZCBieSBFdmVudEJyaWRnZSB3aGVuIGEgcGlwZWxpbmUgZXhlY3V0aW9uIHRyYW5zaXRpb25zIHRvIFNUQVJURUQuXG4gKiBJdCBwb2xscyB0aGUgZXhlY3V0aW9uIHN0YXR1cyB1bnRpbCBpdCByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUgb3IgdGltZXMgb3V0LlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogQ29kZVBpcGVsaW5lRXhlY3V0aW9uU3RhcnRlZEV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRvcGljQXJuID0gbXVzdEVudignU05TX1RPUElDX0FSTicpO1xuICBjb25zdCBwaXBlbGluZU5hbWUgPSBldmVudC5kZXRhaWw/LnBpcGVsaW5lO1xuICBjb25zdCBleGVjdXRpb25JZCA9IGV2ZW50LmRldGFpbD8uWydleGVjdXRpb24taWQnXTtcblxuICBpZiAoIXBpcGVsaW5lTmFtZSB8fCAhZXhlY3V0aW9uSWQpIHtcbiAgICBhd2FpdCBwdWJsaXNoKHRvcGljQXJuLCB7XG4gICAgICB0eXBlOiAnY29kZXBpcGVsaW5lLmV4ZWN1dGlvbicsXG4gICAgICBwaGFzZTogJ2V2ZW50YnJpZGdlJyxcbiAgICAgIG9ic2VydmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG5vdGU6ICdNaXNzaW5nIHBpcGVsaW5lTmFtZSBvciBleGVjdXRpb25JZCBpbiBldmVudC5kZXRhaWwnLFxuICAgICAgZXZlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsU2Vjb25kcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1BPTExfSU5URVJWQUxfU0VDT05EUycsIFN0cmljdEVudlR5cGUuTnVtYmVyLCB7IGRlZmF1bHQ6IDEwIH0pO1xuICBjb25zdCBtYXhQb2xsTWludXRlcyA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ01BWF9QT0xMX01JTlVURVMnLCBTdHJpY3RFbnZUeXBlLk51bWJlciwgeyBkZWZhdWx0OiAxNCB9KTtcblxuICBhd2FpdCBwb2xsUGlwZWxpbmVFeGVjdXRpb24oe1xuICAgIHRvcGljQXJuLFxuICAgIHBpcGVsaW5lTmFtZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBwb2xsSW50ZXJ2YWxTZWNvbmRzOiBwb2xsSW50ZXJ2YWxTZWNvbmRzID4gMCA/IHBvbGxJbnRlcnZhbFNlY29uZHMgOiAxMCxcbiAgICBtYXhQb2xsTWludXRlczogbWF4UG9sbE1pbnV0ZXMgPiAwID8gbWF4UG9sbE1pbnV0ZXMgOiAxNCxcbiAgICBzdGFydEV2ZW50OiBldmVudCxcbiAgfSk7XG59O1xuIl19
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare class Hello {
2
+ sayHello(): string;
3
+ }
package/lib/index.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Hello = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ class Hello {
6
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "codepipeline-event-notifier.Hello", version: "0.1.1" };
7
+ sayHello() {
8
+ return 'hello, world!';
9
+ }
10
+ }
11
+ exports.Hello = Hello;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQWEsS0FBSzs7SUFDVCxRQUFRO1FBQ2IsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQzs7QUFISCxzQkFJQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBIZWxsbyB7XG4gIHB1YmxpYyBzYXlIZWxsbygpIHtcbiAgICByZXR1cm4gJ2hlbGxvLCB3b3JsZCEnO1xuICB9XG59Il19
@@ -0,0 +1,12 @@
1
+ import { Stack } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Example stack wiring up {@link CodePipelineEventNotifier}.
5
+ */
6
+ export declare class CodePipelineEventNotifyStack extends Stack {
7
+ /**
8
+ * @param scope the app scope
9
+ * @param id the stack id
10
+ */
11
+ constructor(scope: Construct, id: string);
12
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodePipelineEventNotifyStack = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const codepipeline_event_notifier_1 = require("../constructs/codepipeline-event-notifier");
6
+ /**
7
+ * Example stack wiring up {@link CodePipelineEventNotifier}.
8
+ */
9
+ class CodePipelineEventNotifyStack extends aws_cdk_lib_1.Stack {
10
+ /**
11
+ * @param scope the app scope
12
+ * @param id the stack id
13
+ */
14
+ constructor(scope, id) {
15
+ super(scope, id);
16
+ new codepipeline_event_notifier_1.CodePipelineEventNotifier(this, 'CodePipelineEventNotifier');
17
+ }
18
+ }
19
+ exports.CodePipelineEventNotifyStack = CodePipelineEventNotifyStack;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFja3MvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmeS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBb0M7QUFFcEMsMkZBQXNGO0FBRXRGOztHQUVHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxtQkFBSztJQUNyRDs7O09BR0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksdURBQXlCLENBQUMsSUFBSSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBVkQsb0VBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllciB9IGZyb20gJy4uL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLWV2ZW50LW5vdGlmaWVyJztcblxuLyoqXG4gKiBFeGFtcGxlIHN0YWNrIHdpcmluZyB1cCB7QGxpbmsgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcn0uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlUGlwZWxpbmVFdmVudE5vdGlmeVN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBhcHAgc2NvcGVcbiAgICogQHBhcmFtIGlkIHRoZSBzdGFjayBpZFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcih0aGlzLCAnQ29kZVBpcGVsaW5lRXZlbnROb3RpZmllcicpO1xuICB9XG59Il19
package/package.json ADDED
@@ -0,0 +1,144 @@
1
+ {
2
+ "name": "codepipeline-event-notifier",
3
+ "repository": {
4
+ "type": "git",
5
+ "url": "https://github.com/gammarers-aws-cdk-constructs/codepipeline-event-notifier.git"
6
+ },
7
+ "scripts": {
8
+ "build": "projen build",
9
+ "bump": "projen bump",
10
+ "bundle": "projen bundle",
11
+ "bundle:funcs/notifier.lambda": "projen bundle:funcs/notifier.lambda",
12
+ "bundle:funcs/notifier.lambda:watch": "projen bundle:funcs/notifier.lambda:watch",
13
+ "clobber": "projen clobber",
14
+ "compat": "projen compat",
15
+ "compile": "projen compile",
16
+ "default": "projen default",
17
+ "docgen": "projen docgen",
18
+ "eject": "projen eject",
19
+ "eslint": "projen eslint",
20
+ "package": "projen package",
21
+ "package-all": "projen package-all",
22
+ "package:js": "projen package:js",
23
+ "post-compile": "projen post-compile",
24
+ "post-upgrade": "projen post-upgrade",
25
+ "pre-compile": "projen pre-compile",
26
+ "release": "projen release",
27
+ "test": "projen test",
28
+ "test:watch": "projen test:watch",
29
+ "unbump": "projen unbump",
30
+ "upgrade": "projen upgrade",
31
+ "watch": "projen watch",
32
+ "projen": "projen"
33
+ },
34
+ "author": {
35
+ "name": "yicr",
36
+ "email": "yicr@users.noreply.github.com",
37
+ "organization": false
38
+ },
39
+ "devDependencies": {
40
+ "@aws-sdk/client-codepipeline": "^3.1080.0",
41
+ "@aws-sdk/client-sns": "^3.1080.0",
42
+ "@stylistic/eslint-plugin": "^2",
43
+ "@types/aws-lambda": "^8.10.162",
44
+ "@types/jest": "^30.0.0",
45
+ "@types/node": "^20",
46
+ "@typescript-eslint/eslint-plugin": "^8",
47
+ "@typescript-eslint/parser": "^8",
48
+ "aws-cdk-lib": "2.232.0",
49
+ "commit-and-tag-version": "^12",
50
+ "constructs": "10.5.1",
51
+ "esbuild": "^0.28.1",
52
+ "eslint": "^9",
53
+ "eslint-import-resolver-typescript": "^4.4.5",
54
+ "eslint-plugin-import": "^2.32.0",
55
+ "jest": "^30.4.2",
56
+ "jest-junit": "^17",
57
+ "jsii": "6.0.x",
58
+ "jsii-diff": "^1.138.0",
59
+ "jsii-docgen": "^10.5.0",
60
+ "jsii-pacmak": "^1.138.0",
61
+ "jsii-rosetta": "6.0.x",
62
+ "projen": "^0.101.4",
63
+ "strict-env-resolver": "^0.5.1",
64
+ "ts-jest": "^29.4.11",
65
+ "ts-node": "^10.9.2",
66
+ "typescript": "6.0.x"
67
+ },
68
+ "peerDependencies": {
69
+ "aws-cdk-lib": "^2.232.0",
70
+ "constructs": "^10.5.1"
71
+ },
72
+ "keywords": [
73
+ "cdk"
74
+ ],
75
+ "engines": {
76
+ "node": ">= 20.0.0"
77
+ },
78
+ "devEngines": {
79
+ "packageManager": {
80
+ "name": "npm",
81
+ "onFail": "ignore"
82
+ }
83
+ },
84
+ "main": "lib/index.js",
85
+ "license": "Apache-2.0",
86
+ "stability": "stable",
87
+ "publishConfig": {
88
+ "access": "public"
89
+ },
90
+ "version": "0.1.1",
91
+ "jest": {
92
+ "coverageProvider": "v8",
93
+ "testMatch": [
94
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
95
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
96
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
97
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
98
+ ],
99
+ "clearMocks": true,
100
+ "collectCoverage": true,
101
+ "coverageReporters": [
102
+ "json",
103
+ "lcov",
104
+ "clover",
105
+ "cobertura",
106
+ "text"
107
+ ],
108
+ "coverageDirectory": "coverage",
109
+ "coveragePathIgnorePatterns": [
110
+ "/node_modules/"
111
+ ],
112
+ "testPathIgnorePatterns": [
113
+ "/node_modules/"
114
+ ],
115
+ "watchPathIgnorePatterns": [
116
+ "/node_modules/"
117
+ ],
118
+ "reporters": [
119
+ "default",
120
+ [
121
+ "jest-junit",
122
+ {
123
+ "outputDirectory": "test-reports"
124
+ }
125
+ ]
126
+ ],
127
+ "transform": {
128
+ "^.+\\.[t]sx?$": [
129
+ "ts-jest",
130
+ {
131
+ "tsconfig": "test/tsconfig.json"
132
+ }
133
+ ]
134
+ }
135
+ },
136
+ "types": "lib/index.d.ts",
137
+ "jsii": {
138
+ "outdir": "dist",
139
+ "targets": {},
140
+ "tsconfig": "tsconfig.json",
141
+ "validateTsconfig": "strict"
142
+ },
143
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
144
+ }