@jaypie/constructs 0.1.0 → 0.1.2

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,34 @@
1
+ import { Construct } from "constructs";
2
+ import { SecretValue, RemovalPolicy, Stack } from "aws-cdk-lib";
3
+ import { ISecret, ISecretAttachmentTarget, RotationSchedule, RotationScheduleOptions } from "aws-cdk-lib/aws-secretsmanager";
4
+ import { IKey } from "aws-cdk-lib/aws-kms";
5
+ import { Grant, IGrantable, PolicyStatement, AddToResourcePolicyResult } from "aws-cdk-lib/aws-iam";
6
+ export interface JaypieEnvSecretProps {
7
+ consumer?: boolean;
8
+ export?: string;
9
+ provider?: boolean;
10
+ role?: string;
11
+ value?: string;
12
+ }
13
+ export declare class JaypieEnvSecret extends Construct implements ISecret {
14
+ private readonly _secret;
15
+ constructor(scope: Construct, id: string, props?: JaypieEnvSecretProps);
16
+ get stack(): Stack;
17
+ get env(): {
18
+ account: string;
19
+ region: string;
20
+ };
21
+ applyRemovalPolicy(policy: RemovalPolicy): void;
22
+ get secretArn(): string;
23
+ get secretName(): string;
24
+ get secretFullArn(): string | undefined;
25
+ get encryptionKey(): IKey | undefined;
26
+ get secretValue(): SecretValue;
27
+ secretValueFromJson(key: string): SecretValue;
28
+ grantRead(grantee: IGrantable, versionStages?: string[]): Grant;
29
+ grantWrite(grantee: IGrantable): Grant;
30
+ addRotationSchedule(id: string, options: RotationScheduleOptions): RotationSchedule;
31
+ addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult;
32
+ denyAccountRootDelete(): void;
33
+ attach(target: ISecretAttachmentTarget): ISecret;
34
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export { JaypieEnvSecret } from "./JaypieEnvSecret";
package/dist/index.js ADDED
@@ -0,0 +1,124 @@
1
+ import { Construct } from 'constructs';
2
+ import { Fn, CfnOutput, SecretValue, Tags, Stack } from 'aws-cdk-lib';
3
+ import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
4
+ import { CDK } from '@jaypie/cdk';
5
+
6
+ // It is a consumer if the environment is ephemeral
7
+ function checkEnvIsConsumer(env = process.env) {
8
+ return (!!process.env.CDK_ENV_EPHEMERAL || env.PROJECT_ENV === CDK.ENV.EPHEMERAL);
9
+ }
10
+ function checkEnvIsProvider(env = process.env) {
11
+ return env.PROJECT_ENV === CDK.ENV.SANDBOX;
12
+ }
13
+ function cleanName(name) {
14
+ return name.replace(/[^a-zA-Z0-9:-]/g, "");
15
+ }
16
+ function exportEnvName(name, env = process.env) {
17
+ let rawName;
18
+ if (checkEnvIsProvider(env)) {
19
+ rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;
20
+ // Clean the entire name to only allow alphanumeric, colons, and hyphens
21
+ return cleanName(rawName);
22
+ }
23
+ else {
24
+ rawName = `env-${CDK.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;
25
+ }
26
+ return cleanName(rawName);
27
+ }
28
+ class JaypieEnvSecret extends Construct {
29
+ constructor(scope, id, props) {
30
+ super(scope, id);
31
+ const { consumer = checkEnvIsConsumer(), export: exportParam, provider = checkEnvIsProvider(), role, value, } = props || {};
32
+ let exportName;
33
+ if (!exportParam) {
34
+ exportName = exportEnvName(id);
35
+ }
36
+ else {
37
+ exportName = cleanName(exportParam);
38
+ }
39
+ if (consumer) {
40
+ const secretName = Fn.importValue(exportName);
41
+ this._secret = secretsmanager.Secret.fromSecretNameV2(this, id, secretName);
42
+ // Add CfnOutput for consumer secrets
43
+ new CfnOutput(this, `ConsumedName`, {
44
+ value: this._secret.secretName,
45
+ });
46
+ }
47
+ else {
48
+ const secretProps = {
49
+ secretStringValue: value
50
+ ? SecretValue.unsafePlainText(value)
51
+ : undefined,
52
+ };
53
+ this._secret = new secretsmanager.Secret(this, id, secretProps);
54
+ if (role) {
55
+ Tags.of(this._secret).add(CDK.TAG.ROLE, role);
56
+ }
57
+ if (provider) {
58
+ new CfnOutput(this, `ProvidedName`, {
59
+ value: this._secret.secretName,
60
+ exportName,
61
+ });
62
+ }
63
+ else {
64
+ new CfnOutput(this, `CreatedName`, {
65
+ value: this._secret.secretName,
66
+ exportName,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ // IResource implementation
72
+ get stack() {
73
+ return Stack.of(this);
74
+ }
75
+ get env() {
76
+ return {
77
+ account: Stack.of(this).account,
78
+ region: Stack.of(this).region,
79
+ };
80
+ }
81
+ applyRemovalPolicy(policy) {
82
+ this._secret.applyRemovalPolicy(policy);
83
+ }
84
+ // ISecret implementation
85
+ get secretArn() {
86
+ return this._secret.secretArn;
87
+ }
88
+ get secretName() {
89
+ return this._secret.secretName;
90
+ }
91
+ get secretFullArn() {
92
+ return this._secret.secretFullArn;
93
+ }
94
+ get encryptionKey() {
95
+ return this._secret.encryptionKey;
96
+ }
97
+ get secretValue() {
98
+ return this._secret.secretValue;
99
+ }
100
+ secretValueFromJson(key) {
101
+ return this._secret.secretValueFromJson(key);
102
+ }
103
+ grantRead(grantee, versionStages) {
104
+ return this._secret.grantRead(grantee, versionStages);
105
+ }
106
+ grantWrite(grantee) {
107
+ return this._secret.grantWrite(grantee);
108
+ }
109
+ addRotationSchedule(id, options) {
110
+ return this._secret.addRotationSchedule(id, options);
111
+ }
112
+ addToResourcePolicy(statement) {
113
+ return this._secret.addToResourcePolicy(statement);
114
+ }
115
+ denyAccountRootDelete() {
116
+ this._secret.denyAccountRootDelete();
117
+ }
118
+ attach(target) {
119
+ return this._secret.attach(target);
120
+ }
121
+ }
122
+
123
+ export { JaypieEnvSecret };
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/JaypieEnvSecret.ts"],"sourcesContent":["import { Construct } from \"constructs\";\nimport {\n CfnOutput,\n Fn,\n SecretValue,\n Tags,\n RemovalPolicy,\n Stack,\n} from \"aws-cdk-lib\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { CDK } from \"@jaypie/cdk\";\nimport {\n ISecret,\n ISecretAttachmentTarget,\n RotationSchedule,\n RotationScheduleOptions,\n} from \"aws-cdk-lib/aws-secretsmanager\";\nimport { IKey } from \"aws-cdk-lib/aws-kms\";\nimport {\n Grant,\n IGrantable,\n PolicyStatement,\n AddToResourcePolicyResult,\n} from \"aws-cdk-lib/aws-iam\";\n\n// It is a consumer if the environment is ephemeral\nfunction checkEnvIsConsumer(env = process.env): boolean {\n return (\n !!process.env.CDK_ENV_EPHEMERAL || env.PROJECT_ENV === CDK.ENV.EPHEMERAL\n );\n}\n\nfunction checkEnvIsProvider(env = process.env): boolean {\n return env.PROJECT_ENV === CDK.ENV.SANDBOX;\n}\n\nfunction cleanName(name: string): string {\n return name.replace(/[^a-zA-Z0-9:-]/g, \"\");\n}\n\nfunction exportEnvName(name: string, env = process.env): string {\n let rawName;\n if (checkEnvIsProvider(env)) {\n rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;\n // Clean the entire name to only allow alphanumeric, colons, and hyphens\n return cleanName(rawName);\n } else {\n rawName = `env-${CDK.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;\n }\n return cleanName(rawName);\n}\n\nexport interface JaypieEnvSecretProps {\n consumer?: boolean;\n export?: string;\n provider?: boolean;\n role?: string;\n value?: string;\n}\n\nexport class JaypieEnvSecret extends Construct implements ISecret {\n private readonly _secret: secretsmanager.ISecret;\n\n constructor(scope: Construct, id: string, props?: JaypieEnvSecretProps) {\n super(scope, id);\n\n const {\n consumer = checkEnvIsConsumer(),\n export: exportParam,\n provider = checkEnvIsProvider(),\n role,\n value,\n } = props || {};\n\n let exportName;\n\n if (!exportParam) {\n exportName = exportEnvName(id);\n } else {\n exportName = cleanName(exportParam);\n }\n\n if (consumer) {\n const secretName = Fn.importValue(exportName);\n this._secret = secretsmanager.Secret.fromSecretNameV2(\n this,\n id,\n secretName,\n );\n\n // Add CfnOutput for consumer secrets\n new CfnOutput(this, `ConsumedName`, {\n value: this._secret.secretName,\n });\n } else {\n const secretProps: secretsmanager.SecretProps = {\n secretStringValue: value\n ? SecretValue.unsafePlainText(value)\n : undefined,\n };\n\n this._secret = new secretsmanager.Secret(this, id, secretProps);\n\n if (role) {\n Tags.of(this._secret).add(CDK.TAG.ROLE, role);\n }\n\n if (provider) {\n new CfnOutput(this, `ProvidedName`, {\n value: this._secret.secretName,\n exportName,\n });\n } else {\n new CfnOutput(this, `CreatedName`, {\n value: this._secret.secretName,\n exportName,\n });\n }\n }\n }\n\n // IResource implementation\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public get env(): { account: string; region: string } {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._secret.applyRemovalPolicy(policy);\n }\n\n // ISecret implementation\n public get secretArn(): string {\n return this._secret.secretArn;\n }\n\n public get secretName(): string {\n return this._secret.secretName;\n }\n\n public get secretFullArn(): string | undefined {\n return this._secret.secretFullArn;\n }\n\n public get encryptionKey(): IKey | undefined {\n return this._secret.encryptionKey;\n }\n\n public get secretValue(): SecretValue {\n return this._secret.secretValue;\n }\n\n public secretValueFromJson(key: string): SecretValue {\n return this._secret.secretValueFromJson(key);\n }\n\n public grantRead(grantee: IGrantable, versionStages?: string[]): Grant {\n return this._secret.grantRead(grantee, versionStages);\n }\n\n public grantWrite(grantee: IGrantable): Grant {\n return this._secret.grantWrite(grantee);\n }\n\n public addRotationSchedule(\n id: string,\n options: RotationScheduleOptions,\n ): RotationSchedule {\n return this._secret.addRotationSchedule(id, options);\n }\n\n public addToResourcePolicy(\n statement: PolicyStatement,\n ): AddToResourcePolicyResult {\n return this._secret.addToResourcePolicy(statement);\n }\n\n public denyAccountRootDelete(): void {\n this._secret.denyAccountRootDelete();\n }\n\n public attach(target: ISecretAttachmentTarget): ISecret {\n return this._secret.attach(target);\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/constructs",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "CDK constructs for Jaypie applications",
5
5
  "license": "MIT",
6
6
  "author": "Finlayson Studio",
@@ -44,5 +44,5 @@
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "68357264135565eb7a726a9c9ad417363f030cb3"
47
+ "gitHead": "049cd5e264c064c28bcd8bb246af736a962b5754"
48
48
  }