alchemy 2.0.0-beta.17 → 2.0.0-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/alchemy.js +1 -1
- package/bin/alchemy.js.map +1 -1
- package/lib/AWS/CloudFront/CachePolicy.d.ts +106 -0
- package/lib/AWS/CloudFront/CachePolicy.d.ts.map +1 -0
- package/lib/AWS/CloudFront/CachePolicy.js +147 -0
- package/lib/AWS/CloudFront/CachePolicy.js.map +1 -0
- package/lib/AWS/CloudFront/KeyGroup.d.ts +72 -0
- package/lib/AWS/CloudFront/KeyGroup.d.ts.map +1 -0
- package/lib/AWS/CloudFront/KeyGroup.js +136 -0
- package/lib/AWS/CloudFront/KeyGroup.js.map +1 -0
- package/lib/AWS/CloudFront/OriginRequestPolicy.d.ts +84 -0
- package/lib/AWS/CloudFront/OriginRequestPolicy.d.ts.map +1 -0
- package/lib/AWS/CloudFront/OriginRequestPolicy.js +139 -0
- package/lib/AWS/CloudFront/OriginRequestPolicy.js.map +1 -0
- package/lib/AWS/CloudFront/PublicKey.d.ts +72 -0
- package/lib/AWS/CloudFront/PublicKey.d.ts.map +1 -0
- package/lib/AWS/CloudFront/PublicKey.js +137 -0
- package/lib/AWS/CloudFront/PublicKey.js.map +1 -0
- package/lib/AWS/CloudFront/ResponseHeadersPolicy.d.ts +114 -0
- package/lib/AWS/CloudFront/ResponseHeadersPolicy.d.ts.map +1 -0
- package/lib/AWS/CloudFront/ResponseHeadersPolicy.js +162 -0
- package/lib/AWS/CloudFront/ResponseHeadersPolicy.js.map +1 -0
- package/lib/AWS/CloudFront/index.d.ts +5 -0
- package/lib/AWS/CloudFront/index.d.ts.map +1 -1
- package/lib/AWS/CloudFront/index.js +5 -0
- package/lib/AWS/CloudFront/index.js.map +1 -1
- package/lib/AWS/ECS/CapacityProvider.d.ts +102 -0
- package/lib/AWS/ECS/CapacityProvider.d.ts.map +1 -0
- package/lib/AWS/ECS/CapacityProvider.js +217 -0
- package/lib/AWS/ECS/CapacityProvider.js.map +1 -0
- package/lib/AWS/ECS/index.d.ts +1 -0
- package/lib/AWS/ECS/index.d.ts.map +1 -1
- package/lib/AWS/ECS/index.js +1 -0
- package/lib/AWS/ECS/index.js.map +1 -1
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +7 -1
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/GitHub/Secrets.d.ts +45 -0
- package/lib/GitHub/Secrets.d.ts.map +1 -0
- package/lib/GitHub/Secrets.js +30 -0
- package/lib/GitHub/Secrets.js.map +1 -0
- package/lib/GitHub/index.d.ts +1 -0
- package/lib/GitHub/index.d.ts.map +1 -1
- package/lib/GitHub/index.js +1 -0
- package/lib/GitHub/index.js.map +1 -1
- package/package.json +1 -1
- package/src/AWS/CloudFront/CachePolicy.ts +271 -0
- package/src/AWS/CloudFront/KeyGroup.ts +233 -0
- package/src/AWS/CloudFront/OriginRequestPolicy.ts +256 -0
- package/src/AWS/CloudFront/PublicKey.ts +245 -0
- package/src/AWS/CloudFront/ResponseHeadersPolicy.ts +308 -0
- package/src/AWS/CloudFront/index.ts +11 -0
- package/src/AWS/ECS/CapacityProvider.ts +336 -0
- package/src/AWS/ECS/index.ts +4 -0
- package/src/AWS/Providers.ts +12 -0
- package/src/GitHub/Secrets.ts +66 -0
- package/src/GitHub/index.ts +1 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as cloudfront from "@distilled.cloud/aws/cloudfront";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { isResolved } from "../../Diff.js";
|
|
4
|
+
import { createPhysicalName } from "../../PhysicalName.js";
|
|
5
|
+
import * as Provider from "../../Provider.js";
|
|
6
|
+
import { Resource } from "../../Resource.js";
|
|
7
|
+
/**
|
|
8
|
+
* A CloudFront origin request policy.
|
|
9
|
+
*
|
|
10
|
+
* Origin request policies control which values from the viewer request (in
|
|
11
|
+
* addition to those used in the cache key) CloudFront includes when sending
|
|
12
|
+
* a request to the origin. They are referenced by ID on a Distribution's
|
|
13
|
+
* default behavior or per-path cache behaviors.
|
|
14
|
+
*
|
|
15
|
+
* @section Creating Origin Request Policies
|
|
16
|
+
* @example Forward all viewer headers and cookies
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const originRequestPolicy = yield* OriginRequestPolicy("AppOriginRequest", {
|
|
19
|
+
* comment: "Forward auth + locale",
|
|
20
|
+
* headersConfig: {
|
|
21
|
+
* HeaderBehavior: "whitelist",
|
|
22
|
+
* Headers: { Quantity: 2, Items: ["Authorization", "Accept-Language"] },
|
|
23
|
+
* },
|
|
24
|
+
* cookiesConfig: { CookieBehavior: "all" },
|
|
25
|
+
* queryStringsConfig: { QueryStringBehavior: "all" },
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const OriginRequestPolicy = Resource("AWS.CloudFront.OriginRequestPolicy");
|
|
30
|
+
export const OriginRequestPolicyProvider = () => Provider.effect(OriginRequestPolicy, Effect.gen(function* () {
|
|
31
|
+
const getById = Effect.fn(function* (id) {
|
|
32
|
+
const config = yield* cloudfront
|
|
33
|
+
.getOriginRequestPolicyConfig({ Id: id })
|
|
34
|
+
.pipe(Effect.catchTag("NoSuchOriginRequestPolicy", () => Effect.succeed(undefined)));
|
|
35
|
+
if (!config?.OriginRequestPolicyConfig)
|
|
36
|
+
return undefined;
|
|
37
|
+
return { config: config.OriginRequestPolicyConfig, etag: config.ETag };
|
|
38
|
+
});
|
|
39
|
+
const getByName = Effect.fn(function* (name) {
|
|
40
|
+
const listed = yield* cloudfront.listOriginRequestPolicies({
|
|
41
|
+
Type: "custom",
|
|
42
|
+
});
|
|
43
|
+
const summary = listed.OriginRequestPolicyList?.Items?.find((item) => item.OriginRequestPolicy?.OriginRequestPolicyConfig?.Name === name);
|
|
44
|
+
if (!summary?.OriginRequestPolicy?.Id)
|
|
45
|
+
return undefined;
|
|
46
|
+
return yield* getById(summary.OriginRequestPolicy.Id).pipe(Effect.map((found) => found ? { id: summary.OriginRequestPolicy.Id, ...found } : undefined));
|
|
47
|
+
});
|
|
48
|
+
const buildConfig = (name, props) => ({
|
|
49
|
+
Name: name,
|
|
50
|
+
Comment: props.comment,
|
|
51
|
+
HeadersConfig: props.headersConfig,
|
|
52
|
+
CookiesConfig: props.cookiesConfig,
|
|
53
|
+
QueryStringsConfig: props.queryStringsConfig,
|
|
54
|
+
});
|
|
55
|
+
const toAttrs = (id, config, etag) => ({
|
|
56
|
+
originRequestPolicyId: id,
|
|
57
|
+
name: config.Name,
|
|
58
|
+
etag,
|
|
59
|
+
comment: config.Comment,
|
|
60
|
+
headersConfig: config.HeadersConfig,
|
|
61
|
+
cookiesConfig: config.CookiesConfig,
|
|
62
|
+
queryStringsConfig: config.QueryStringsConfig,
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
stables: ["originRequestPolicyId"],
|
|
66
|
+
diff: Effect.fn(function* ({ id, news, olds }) {
|
|
67
|
+
if (!isResolved(news))
|
|
68
|
+
return undefined;
|
|
69
|
+
if ((yield* createName(id, olds ?? {})) !==
|
|
70
|
+
(yield* createName(id, news))) {
|
|
71
|
+
return { action: "replace" };
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
75
|
+
if (output?.originRequestPolicyId) {
|
|
76
|
+
const found = yield* getById(output.originRequestPolicyId);
|
|
77
|
+
if (found) {
|
|
78
|
+
return toAttrs(output.originRequestPolicyId, found.config, found.etag);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const name = yield* createName(id, olds ?? {});
|
|
82
|
+
const found = yield* getByName(name);
|
|
83
|
+
if (!found)
|
|
84
|
+
return undefined;
|
|
85
|
+
return toAttrs(found.id, found.config, found.etag);
|
|
86
|
+
}),
|
|
87
|
+
create: Effect.fn(function* ({ id, news, session }) {
|
|
88
|
+
const name = yield* createName(id, news);
|
|
89
|
+
const created = yield* cloudfront
|
|
90
|
+
.createOriginRequestPolicy({
|
|
91
|
+
OriginRequestPolicyConfig: buildConfig(name, news),
|
|
92
|
+
})
|
|
93
|
+
.pipe(Effect.catchTag("OriginRequestPolicyAlreadyExists", () => getByName(name).pipe(Effect.flatMap((existing) => existing
|
|
94
|
+
? Effect.succeed({
|
|
95
|
+
OriginRequestPolicy: {
|
|
96
|
+
Id: existing.id,
|
|
97
|
+
LastModifiedTime: new Date(),
|
|
98
|
+
OriginRequestPolicyConfig: existing.config,
|
|
99
|
+
},
|
|
100
|
+
ETag: existing.etag,
|
|
101
|
+
Location: undefined,
|
|
102
|
+
})
|
|
103
|
+
: Effect.fail(new Error(`Origin request policy '${name}' already exists but could not be recovered`))))));
|
|
104
|
+
if (!created.OriginRequestPolicy?.Id) {
|
|
105
|
+
return yield* Effect.fail(new Error("createOriginRequestPolicy returned no identifier"));
|
|
106
|
+
}
|
|
107
|
+
yield* session.note(created.OriginRequestPolicy.Id);
|
|
108
|
+
return toAttrs(created.OriginRequestPolicy.Id, created.OriginRequestPolicy.OriginRequestPolicyConfig, created.ETag);
|
|
109
|
+
}),
|
|
110
|
+
update: Effect.fn(function* ({ news, output, session }) {
|
|
111
|
+
const current = yield* getById(output.originRequestPolicyId);
|
|
112
|
+
const updated = yield* cloudfront.updateOriginRequestPolicy({
|
|
113
|
+
Id: output.originRequestPolicyId,
|
|
114
|
+
IfMatch: current?.etag ?? output.etag,
|
|
115
|
+
OriginRequestPolicyConfig: buildConfig(output.name, news),
|
|
116
|
+
});
|
|
117
|
+
if (!updated.OriginRequestPolicy?.Id) {
|
|
118
|
+
return yield* Effect.fail(new Error("updateOriginRequestPolicy returned no identifier"));
|
|
119
|
+
}
|
|
120
|
+
yield* session.note(output.originRequestPolicyId);
|
|
121
|
+
return toAttrs(updated.OriginRequestPolicy.Id, updated.OriginRequestPolicy.OriginRequestPolicyConfig, updated.ETag);
|
|
122
|
+
}),
|
|
123
|
+
delete: Effect.fn(function* ({ output }) {
|
|
124
|
+
const current = yield* getById(output.originRequestPolicyId);
|
|
125
|
+
if (!current)
|
|
126
|
+
return;
|
|
127
|
+
yield* cloudfront
|
|
128
|
+
.deleteOriginRequestPolicy({
|
|
129
|
+
Id: output.originRequestPolicyId,
|
|
130
|
+
IfMatch: current.etag,
|
|
131
|
+
})
|
|
132
|
+
.pipe(Effect.catchTag("NoSuchOriginRequestPolicy", () => Effect.void));
|
|
133
|
+
}),
|
|
134
|
+
};
|
|
135
|
+
}));
|
|
136
|
+
const createName = (id, props) => props.name
|
|
137
|
+
? Effect.succeed(props.name)
|
|
138
|
+
: createPhysicalName({ id, maxLength: 128, lowercase: true });
|
|
139
|
+
//# sourceMappingURL=OriginRequestPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OriginRequestPolicy.js","sourceRoot":"","sources":["../../../src/AWS/CloudFront/OriginRequestPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAiE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CACzC,oCAAoC,CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE,CAC9C,QAAQ,CAAC,MAAM,CACb,mBAAmB,EACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAU;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU;aAC7B,4BAA4B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;aACxC,IAAI,CACH,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAChD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAC1B,CACF,CAAC;QACJ,IAAI,CAAC,MAAM,EAAE,yBAAyB;YAAE,OAAO,SAAS,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAY;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,yBAAyB,CAAC;YACzD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,uBAAuB,EAAE,KAAK,EAAE,IAAI,CACzD,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,IAAI,KAAK,IAAI,CACrE,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE;YAAE,OAAO,SAAS,CAAC;QACxD,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,IAAI,CACxD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CACrE,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAClB,IAAY,EACZ,KAA+B,EACO,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CACd,EAAU,EACV,MAA4C,EAC5C,IAAwB,EACxB,EAAE,CAAC,CAAC;QACJ,qBAAqB,EAAE,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,CAAC,uBAAuB,CAAC;QAClC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxC,IACE,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBACnC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAC7B,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAW,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;QACF,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAC7C,IAAI,MAAM,EAAE,qBAAqB,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBAC3D,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,OAAO,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU;iBAC9B,yBAAyB,CAAC;gBACzB,yBAAyB,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;aACnD,CAAC;iBACD,IAAI,CACH,MAAM,CAAC,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE,CACvD,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAClB,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,QAAQ;gBACN,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;oBACb,mBAAmB,EAAE;wBACnB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,gBAAgB,EAAE,IAAI,IAAI,EAAE;wBAC5B,yBAAyB,EAAE,QAAQ,CAAC,MAAM;qBAC3C;oBACD,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,QAAQ,EAAE,SAAS;iBACpB,CAAC;gBACJ,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,IAAI,KAAK,CACP,0BAA0B,IAAI,6CAA6C,CAC5E,CACF,CACN,CACF,CACF,CACF,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAC9D,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,OAAO,CACZ,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAC9B,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,EACrD,OAAO,CAAC,IAAI,CACb,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;YACpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,yBAAyB,CAAC;gBAC1D,EAAE,EAAE,MAAM,CAAC,qBAAqB;gBAChC,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI;gBACrC,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;aAC1D,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAC9D,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAClD,OAAO,OAAO,CACZ,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAC9B,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,EACrD,OAAO,CAAC,IAAI,CACb,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,KAAK,CAAC,CAAC,UAAU;iBACd,yBAAyB,CAAC;gBACzB,EAAE,EAAE,MAAM,CAAC,qBAAqB;gBAChC,OAAO,EAAE,OAAO,CAAC,IAAI;aACtB,CAAC;iBACD,IAAI,CACH,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAChE,CAAC;QACN,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CACH,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,KAA+B,EAAE,EAAE,CACjE,KAAK,CAAC,IAAI;IACR,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as Redacted from "effect/Redacted";
|
|
2
|
+
import * as Provider from "../../Provider.ts";
|
|
3
|
+
import { Resource } from "../../Resource.ts";
|
|
4
|
+
import type { Providers } from "../Providers.ts";
|
|
5
|
+
export interface PublicKeyProps {
|
|
6
|
+
/**
|
|
7
|
+
* Name of the public key. If omitted, a deterministic name is generated.
|
|
8
|
+
*
|
|
9
|
+
* Names must be unique per AWS account. Changing the name triggers
|
|
10
|
+
* a replacement.
|
|
11
|
+
*/
|
|
12
|
+
name?: string;
|
|
13
|
+
/**
|
|
14
|
+
* PEM-encoded public key body. Changing the key material triggers a
|
|
15
|
+
* replacement (CloudFront does not allow rotating an existing public
|
|
16
|
+
* key in place).
|
|
17
|
+
*/
|
|
18
|
+
encodedKey: Redacted.Redacted<string> | string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional comment describing the key.
|
|
21
|
+
*/
|
|
22
|
+
comment?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PublicKey extends Resource<"AWS.CloudFront.PublicKey", PublicKeyProps, {
|
|
25
|
+
/**
|
|
26
|
+
* CloudFront-assigned public key identifier. Used by KeyGroups to
|
|
27
|
+
* reference the key.
|
|
28
|
+
*/
|
|
29
|
+
publicKeyId: string;
|
|
30
|
+
/**
|
|
31
|
+
* Name of the public key.
|
|
32
|
+
*/
|
|
33
|
+
name: string;
|
|
34
|
+
/**
|
|
35
|
+
* PEM-encoded public key body.
|
|
36
|
+
*/
|
|
37
|
+
encodedKey: string;
|
|
38
|
+
/**
|
|
39
|
+
* Caller reference used at create time. Stable across updates.
|
|
40
|
+
*/
|
|
41
|
+
callerReference: string;
|
|
42
|
+
/**
|
|
43
|
+
* Most recent entity tag for update/delete operations.
|
|
44
|
+
*/
|
|
45
|
+
etag: string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Current comment on the key.
|
|
48
|
+
*/
|
|
49
|
+
comment: string | undefined;
|
|
50
|
+
}, never, Providers> {
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A CloudFront public key.
|
|
54
|
+
*
|
|
55
|
+
* Public keys are uploaded ahead of being grouped into a {@link KeyGroup} and
|
|
56
|
+
* used by Distributions for signed URL or signed cookie verification.
|
|
57
|
+
*
|
|
58
|
+
* The key body is immutable after creation — changing `encodedKey` triggers
|
|
59
|
+
* a replacement (CloudFront returns no API to rotate a key in place).
|
|
60
|
+
*
|
|
61
|
+
* @section Creating Public Keys
|
|
62
|
+
* @example PEM-encoded RSA public key
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const key = yield* PublicKey("SignedUrlKey", {
|
|
65
|
+
* encodedKey: Redacted.make(yield* fs.readFileString("./public_key.pem")),
|
|
66
|
+
* comment: "RSA-2048 signed URL key for /private",
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare const PublicKey: import("../../Resource.ts").ResourceClass<PublicKey>;
|
|
71
|
+
export declare const PublicKeyProvider: () => import("effect/Layer").Layer<Provider.Provider<PublicKey>, never, import("effect/unstable/http/HttpClient").HttpClient | import("../../Stage.ts").Stage | import("../../Stack.ts").Stack | import("@distilled.cloud/aws/Region").Region | import("@distilled.cloud/aws/Credentials").Credentials>;
|
|
72
|
+
//# sourceMappingURL=PublicKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicKey.d.ts","sourceRoot":"","sources":["../../../src/AWS/CloudFront/PublicKey.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ,CACzC,0BAA0B,EAC1B,cAAc,EACd;IACE;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,EACD,KAAK,EACL,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,sDAAkD,CAAC;AAEzE,eAAO,MAAM,iBAAiB,ySA2J3B,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as cloudfront from "@distilled.cloud/aws/cloudfront";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Redacted from "effect/Redacted";
|
|
4
|
+
import { isResolved } from "../../Diff.js";
|
|
5
|
+
import { createPhysicalName } from "../../PhysicalName.js";
|
|
6
|
+
import * as Provider from "../../Provider.js";
|
|
7
|
+
import { Resource } from "../../Resource.js";
|
|
8
|
+
import { extractValue } from "./common.js";
|
|
9
|
+
/**
|
|
10
|
+
* A CloudFront public key.
|
|
11
|
+
*
|
|
12
|
+
* Public keys are uploaded ahead of being grouped into a {@link KeyGroup} and
|
|
13
|
+
* used by Distributions for signed URL or signed cookie verification.
|
|
14
|
+
*
|
|
15
|
+
* The key body is immutable after creation — changing `encodedKey` triggers
|
|
16
|
+
* a replacement (CloudFront returns no API to rotate a key in place).
|
|
17
|
+
*
|
|
18
|
+
* @section Creating Public Keys
|
|
19
|
+
* @example PEM-encoded RSA public key
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const key = yield* PublicKey("SignedUrlKey", {
|
|
22
|
+
* encodedKey: Redacted.make(yield* fs.readFileString("./public_key.pem")),
|
|
23
|
+
* comment: "RSA-2048 signed URL key for /private",
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const PublicKey = Resource("AWS.CloudFront.PublicKey");
|
|
28
|
+
export const PublicKeyProvider = () => Provider.effect(PublicKey, Effect.gen(function* () {
|
|
29
|
+
const getById = Effect.fn(function* (id) {
|
|
30
|
+
const config = yield* cloudfront
|
|
31
|
+
.getPublicKeyConfig({ Id: id })
|
|
32
|
+
.pipe(Effect.catchTag("NoSuchPublicKey", () => Effect.succeed(undefined)));
|
|
33
|
+
if (!config?.PublicKeyConfig)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { config: config.PublicKeyConfig, etag: config.ETag };
|
|
36
|
+
});
|
|
37
|
+
const getByName = Effect.fn(function* (name) {
|
|
38
|
+
const listed = yield* cloudfront.listPublicKeys({});
|
|
39
|
+
const summary = listed.PublicKeyList?.Items?.find((item) => item.Name === name);
|
|
40
|
+
if (!summary?.Id)
|
|
41
|
+
return undefined;
|
|
42
|
+
return yield* getById(summary.Id).pipe(Effect.map((found) => found ? { id: summary.Id, ...found } : undefined));
|
|
43
|
+
});
|
|
44
|
+
const buildConfig = (name, callerReference, props) => ({
|
|
45
|
+
Name: name,
|
|
46
|
+
CallerReference: callerReference,
|
|
47
|
+
EncodedKey: extractValue(props.encodedKey),
|
|
48
|
+
Comment: props.comment,
|
|
49
|
+
});
|
|
50
|
+
const toAttrs = (id, config, etag) => ({
|
|
51
|
+
publicKeyId: id,
|
|
52
|
+
name: config.Name,
|
|
53
|
+
encodedKey: config.EncodedKey,
|
|
54
|
+
callerReference: config.CallerReference,
|
|
55
|
+
etag,
|
|
56
|
+
comment: config.Comment,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
stables: ["publicKeyId", "callerReference"],
|
|
60
|
+
diff: Effect.fn(function* ({ id, news, olds }) {
|
|
61
|
+
if (!isResolved(news))
|
|
62
|
+
return undefined;
|
|
63
|
+
if ((yield* createName(id, olds ?? {})) !==
|
|
64
|
+
(yield* createName(id, news))) {
|
|
65
|
+
return { action: "replace" };
|
|
66
|
+
}
|
|
67
|
+
if (isResolved(olds.encodedKey) &&
|
|
68
|
+
extractValue(olds.encodedKey) !== extractValue(news.encodedKey)) {
|
|
69
|
+
return { action: "replace" };
|
|
70
|
+
}
|
|
71
|
+
}),
|
|
72
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
73
|
+
if (output?.publicKeyId) {
|
|
74
|
+
const found = yield* getById(output.publicKeyId);
|
|
75
|
+
if (found)
|
|
76
|
+
return toAttrs(output.publicKeyId, found.config, found.etag);
|
|
77
|
+
}
|
|
78
|
+
const name = yield* createName(id, olds ?? {});
|
|
79
|
+
const found = yield* getByName(name);
|
|
80
|
+
if (!found)
|
|
81
|
+
return undefined;
|
|
82
|
+
return toAttrs(found.id, found.config, found.etag);
|
|
83
|
+
}),
|
|
84
|
+
create: Effect.fn(function* ({ id, news, session }) {
|
|
85
|
+
const name = yield* createName(id, news);
|
|
86
|
+
const callerReference = name;
|
|
87
|
+
const created = yield* cloudfront
|
|
88
|
+
.createPublicKey({
|
|
89
|
+
PublicKeyConfig: buildConfig(name, callerReference, news),
|
|
90
|
+
})
|
|
91
|
+
.pipe(Effect.catchTag("PublicKeyAlreadyExists", () => getByName(name).pipe(Effect.flatMap((existing) => existing
|
|
92
|
+
? Effect.succeed({
|
|
93
|
+
PublicKey: {
|
|
94
|
+
Id: existing.id,
|
|
95
|
+
CreatedTime: new Date(),
|
|
96
|
+
PublicKeyConfig: existing.config,
|
|
97
|
+
},
|
|
98
|
+
ETag: existing.etag,
|
|
99
|
+
Location: undefined,
|
|
100
|
+
})
|
|
101
|
+
: Effect.fail(new Error(`Public key '${name}' already exists but could not be recovered`))))));
|
|
102
|
+
if (!created.PublicKey?.Id) {
|
|
103
|
+
return yield* Effect.fail(new Error("createPublicKey returned no identifier"));
|
|
104
|
+
}
|
|
105
|
+
yield* session.note(created.PublicKey.Id);
|
|
106
|
+
return toAttrs(created.PublicKey.Id, created.PublicKey.PublicKeyConfig, created.ETag);
|
|
107
|
+
}),
|
|
108
|
+
update: Effect.fn(function* ({ news, output, session }) {
|
|
109
|
+
const current = yield* getById(output.publicKeyId);
|
|
110
|
+
const updated = yield* cloudfront.updatePublicKey({
|
|
111
|
+
Id: output.publicKeyId,
|
|
112
|
+
IfMatch: current?.etag ?? output.etag,
|
|
113
|
+
PublicKeyConfig: buildConfig(output.name, output.callerReference, news),
|
|
114
|
+
});
|
|
115
|
+
if (!updated.PublicKey?.Id) {
|
|
116
|
+
return yield* Effect.fail(new Error("updatePublicKey returned no identifier"));
|
|
117
|
+
}
|
|
118
|
+
yield* session.note(output.publicKeyId);
|
|
119
|
+
return toAttrs(updated.PublicKey.Id, updated.PublicKey.PublicKeyConfig, updated.ETag);
|
|
120
|
+
}),
|
|
121
|
+
delete: Effect.fn(function* ({ output }) {
|
|
122
|
+
const current = yield* getById(output.publicKeyId);
|
|
123
|
+
if (!current)
|
|
124
|
+
return;
|
|
125
|
+
yield* cloudfront
|
|
126
|
+
.deletePublicKey({
|
|
127
|
+
Id: output.publicKeyId,
|
|
128
|
+
IfMatch: current.etag,
|
|
129
|
+
})
|
|
130
|
+
.pipe(Effect.catchTag("NoSuchPublicKey", () => Effect.void));
|
|
131
|
+
}),
|
|
132
|
+
};
|
|
133
|
+
}));
|
|
134
|
+
const createName = (id, props) => props.name
|
|
135
|
+
? Effect.succeed(props.name)
|
|
136
|
+
: createPhysicalName({ id, maxLength: 128, lowercase: true });
|
|
137
|
+
//# sourceMappingURL=PublicKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicKey.js","sourceRoot":"","sources":["../../../src/AWS/CloudFront/PublicKey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as cloudfront from "@distilled.cloud/aws/cloudfront";
|
|
2
|
+
import * as Provider from "../../Provider.ts";
|
|
3
|
+
import { Resource } from "../../Resource.ts";
|
|
4
|
+
import type { Providers } from "../Providers.ts";
|
|
5
|
+
export interface ResponseHeadersPolicyProps {
|
|
6
|
+
/**
|
|
7
|
+
* Name of the response headers policy. If omitted, a deterministic name is
|
|
8
|
+
* generated. Names must be unique per AWS account. Changing the name
|
|
9
|
+
* triggers a replacement.
|
|
10
|
+
*/
|
|
11
|
+
name?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Optional comment describing the policy.
|
|
14
|
+
*/
|
|
15
|
+
comment?: string;
|
|
16
|
+
/**
|
|
17
|
+
* CORS configuration applied to viewer responses.
|
|
18
|
+
*/
|
|
19
|
+
corsConfig?: cloudfront.ResponseHeadersPolicyCorsConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Standard security headers (HSTS, X-Frame-Options, etc.) added to
|
|
22
|
+
* viewer responses.
|
|
23
|
+
*/
|
|
24
|
+
securityHeadersConfig?: cloudfront.ResponseHeadersPolicySecurityHeadersConfig;
|
|
25
|
+
/**
|
|
26
|
+
* Server-Timing header configuration for measuring CloudFront performance.
|
|
27
|
+
*/
|
|
28
|
+
serverTimingHeadersConfig?: cloudfront.ResponseHeadersPolicyServerTimingHeadersConfig;
|
|
29
|
+
/**
|
|
30
|
+
* Custom headers to add to viewer responses.
|
|
31
|
+
*/
|
|
32
|
+
customHeadersConfig?: cloudfront.ResponseHeadersPolicyCustomHeadersConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Headers to remove from viewer responses.
|
|
35
|
+
*/
|
|
36
|
+
removeHeadersConfig?: cloudfront.ResponseHeadersPolicyRemoveHeadersConfig;
|
|
37
|
+
}
|
|
38
|
+
export interface ResponseHeadersPolicy extends Resource<"AWS.CloudFront.ResponseHeadersPolicy", ResponseHeadersPolicyProps, {
|
|
39
|
+
/**
|
|
40
|
+
* CloudFront-assigned response headers policy identifier.
|
|
41
|
+
*/
|
|
42
|
+
responseHeadersPolicyId: string;
|
|
43
|
+
/**
|
|
44
|
+
* Name of the response headers policy.
|
|
45
|
+
*/
|
|
46
|
+
name: string;
|
|
47
|
+
/**
|
|
48
|
+
* Most recent entity tag for update/delete operations.
|
|
49
|
+
*/
|
|
50
|
+
etag: string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Current comment on the policy.
|
|
53
|
+
*/
|
|
54
|
+
comment: string | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Current CORS configuration.
|
|
57
|
+
*/
|
|
58
|
+
corsConfig: cloudfront.ResponseHeadersPolicyCorsConfig | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Current security headers configuration.
|
|
61
|
+
*/
|
|
62
|
+
securityHeadersConfig: cloudfront.ResponseHeadersPolicySecurityHeadersConfig | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Current Server-Timing configuration.
|
|
65
|
+
*/
|
|
66
|
+
serverTimingHeadersConfig: cloudfront.ResponseHeadersPolicyServerTimingHeadersConfig | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Current custom headers configuration.
|
|
69
|
+
*/
|
|
70
|
+
customHeadersConfig: cloudfront.ResponseHeadersPolicyCustomHeadersConfig | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Current remove-headers configuration.
|
|
73
|
+
*/
|
|
74
|
+
removeHeadersConfig: cloudfront.ResponseHeadersPolicyRemoveHeadersConfig | undefined;
|
|
75
|
+
}, never, Providers> {
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A CloudFront response headers policy.
|
|
79
|
+
*
|
|
80
|
+
* Response headers policies add or remove headers in viewer responses,
|
|
81
|
+
* including CORS, standard security headers (HSTS, X-Frame-Options,
|
|
82
|
+
* X-Content-Type-Options, Referrer-Policy, etc.), Server-Timing, custom
|
|
83
|
+
* headers and explicit header removal. They are referenced by ID on a
|
|
84
|
+
* Distribution's default behavior or per-path cache behaviors.
|
|
85
|
+
*
|
|
86
|
+
* @section Creating Response Headers Policies
|
|
87
|
+
* @example Standard security + CORS
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const responseHeadersPolicy = yield* ResponseHeadersPolicy("AppResponseHeaders", {
|
|
90
|
+
* comment: "Default app security + CORS",
|
|
91
|
+
* corsConfig: {
|
|
92
|
+
* AccessControlAllowOrigins: { Quantity: 1, Items: ["https://app.example.com"] },
|
|
93
|
+
* AccessControlAllowMethods: { Quantity: 2, Items: ["GET", "OPTIONS"] },
|
|
94
|
+
* AccessControlAllowHeaders: { Quantity: 1, Items: ["Authorization"] },
|
|
95
|
+
* AccessControlAllowCredentials: false,
|
|
96
|
+
* OriginOverride: true,
|
|
97
|
+
* },
|
|
98
|
+
* securityHeadersConfig: {
|
|
99
|
+
* StrictTransportSecurity: {
|
|
100
|
+
* AccessControlMaxAgeSec: 31536000,
|
|
101
|
+
* IncludeSubdomains: true,
|
|
102
|
+
* Preload: true,
|
|
103
|
+
* Override: true,
|
|
104
|
+
* },
|
|
105
|
+
* ContentTypeOptions: { Override: true },
|
|
106
|
+
* FrameOptions: { FrameOption: "DENY", Override: true },
|
|
107
|
+
* ReferrerPolicy: { ReferrerPolicy: "no-referrer", Override: true },
|
|
108
|
+
* },
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare const ResponseHeadersPolicy: import("../../Resource.ts").ResourceClass<ResponseHeadersPolicy>;
|
|
113
|
+
export declare const ResponseHeadersPolicyProvider: () => import("effect/Layer").Layer<Provider.Provider<ResponseHeadersPolicy>, never, import("effect/unstable/http/HttpClient").HttpClient | import("../../Stage.ts").Stage | import("../../Stack.ts").Stack | import("@distilled.cloud/aws/Region").Region | import("@distilled.cloud/aws/Credentials").Credentials>;
|
|
114
|
+
//# sourceMappingURL=ResponseHeadersPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseHeadersPolicy.d.ts","sourceRoot":"","sources":["../../../src/AWS/CloudFront/ResponseHeadersPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAI9D,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC,+BAA+B,CAAC;IACxD;;;OAGG;IACH,qBAAqB,CAAC,EAAE,UAAU,CAAC,0CAA0C,CAAC;IAC9E;;OAEG;IACH,yBAAyB,CAAC,EAAE,UAAU,CAAC,8CAA8C,CAAC;IACtF;;OAEG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,wCAAwC,CAAC;IAC1E;;OAEG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,wCAAwC,CAAC;CAC3E;AAED,MAAM,WAAW,qBAAsB,SAAQ,QAAQ,CACrD,sCAAsC,EACtC,0BAA0B,EAC1B;IACE;;OAEG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,+BAA+B,GAAG,SAAS,CAAC;IACnE;;OAEG;IACH,qBAAqB,EACjB,UAAU,CAAC,0CAA0C,GACrD,SAAS,CAAC;IACd;;OAEG;IACH,yBAAyB,EACrB,UAAU,CAAC,8CAA8C,GACzD,SAAS,CAAC;IACd;;OAEG;IACH,mBAAmB,EACf,UAAU,CAAC,wCAAwC,GACnD,SAAS,CAAC;IACd;;OAEG;IACH,mBAAmB,EACf,UAAU,CAAC,wCAAwC,GACnD,SAAS,CAAC;CACf,EACD,KAAK,EACL,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,qBAAqB,kEAEjC,CAAC;AAEF,eAAO,MAAM,6BAA6B,qTAwKvC,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import * as cloudfront from "@distilled.cloud/aws/cloudfront";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { isResolved } from "../../Diff.js";
|
|
4
|
+
import { createPhysicalName } from "../../PhysicalName.js";
|
|
5
|
+
import * as Provider from "../../Provider.js";
|
|
6
|
+
import { Resource } from "../../Resource.js";
|
|
7
|
+
/**
|
|
8
|
+
* A CloudFront response headers policy.
|
|
9
|
+
*
|
|
10
|
+
* Response headers policies add or remove headers in viewer responses,
|
|
11
|
+
* including CORS, standard security headers (HSTS, X-Frame-Options,
|
|
12
|
+
* X-Content-Type-Options, Referrer-Policy, etc.), Server-Timing, custom
|
|
13
|
+
* headers and explicit header removal. They are referenced by ID on a
|
|
14
|
+
* Distribution's default behavior or per-path cache behaviors.
|
|
15
|
+
*
|
|
16
|
+
* @section Creating Response Headers Policies
|
|
17
|
+
* @example Standard security + CORS
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const responseHeadersPolicy = yield* ResponseHeadersPolicy("AppResponseHeaders", {
|
|
20
|
+
* comment: "Default app security + CORS",
|
|
21
|
+
* corsConfig: {
|
|
22
|
+
* AccessControlAllowOrigins: { Quantity: 1, Items: ["https://app.example.com"] },
|
|
23
|
+
* AccessControlAllowMethods: { Quantity: 2, Items: ["GET", "OPTIONS"] },
|
|
24
|
+
* AccessControlAllowHeaders: { Quantity: 1, Items: ["Authorization"] },
|
|
25
|
+
* AccessControlAllowCredentials: false,
|
|
26
|
+
* OriginOverride: true,
|
|
27
|
+
* },
|
|
28
|
+
* securityHeadersConfig: {
|
|
29
|
+
* StrictTransportSecurity: {
|
|
30
|
+
* AccessControlMaxAgeSec: 31536000,
|
|
31
|
+
* IncludeSubdomains: true,
|
|
32
|
+
* Preload: true,
|
|
33
|
+
* Override: true,
|
|
34
|
+
* },
|
|
35
|
+
* ContentTypeOptions: { Override: true },
|
|
36
|
+
* FrameOptions: { FrameOption: "DENY", Override: true },
|
|
37
|
+
* ReferrerPolicy: { ReferrerPolicy: "no-referrer", Override: true },
|
|
38
|
+
* },
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export const ResponseHeadersPolicy = Resource("AWS.CloudFront.ResponseHeadersPolicy");
|
|
43
|
+
export const ResponseHeadersPolicyProvider = () => Provider.effect(ResponseHeadersPolicy, Effect.gen(function* () {
|
|
44
|
+
const getById = Effect.fn(function* (id) {
|
|
45
|
+
const config = yield* cloudfront
|
|
46
|
+
.getResponseHeadersPolicyConfig({ Id: id })
|
|
47
|
+
.pipe(Effect.catchTag("NoSuchResponseHeadersPolicy", () => Effect.succeed(undefined)));
|
|
48
|
+
if (!config?.ResponseHeadersPolicyConfig)
|
|
49
|
+
return undefined;
|
|
50
|
+
return {
|
|
51
|
+
config: config.ResponseHeadersPolicyConfig,
|
|
52
|
+
etag: config.ETag,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const getByName = Effect.fn(function* (name) {
|
|
56
|
+
const listed = yield* cloudfront.listResponseHeadersPolicies({
|
|
57
|
+
Type: "custom",
|
|
58
|
+
});
|
|
59
|
+
const summary = listed.ResponseHeadersPolicyList?.Items?.find((item) => item.ResponseHeadersPolicy?.ResponseHeadersPolicyConfig?.Name ===
|
|
60
|
+
name);
|
|
61
|
+
if (!summary?.ResponseHeadersPolicy?.Id)
|
|
62
|
+
return undefined;
|
|
63
|
+
return yield* getById(summary.ResponseHeadersPolicy.Id).pipe(Effect.map((found) => found
|
|
64
|
+
? { id: summary.ResponseHeadersPolicy.Id, ...found }
|
|
65
|
+
: undefined));
|
|
66
|
+
});
|
|
67
|
+
const buildConfig = (name, props) => ({
|
|
68
|
+
Name: name,
|
|
69
|
+
Comment: props.comment,
|
|
70
|
+
CorsConfig: props.corsConfig,
|
|
71
|
+
SecurityHeadersConfig: props.securityHeadersConfig,
|
|
72
|
+
ServerTimingHeadersConfig: props.serverTimingHeadersConfig,
|
|
73
|
+
CustomHeadersConfig: props.customHeadersConfig,
|
|
74
|
+
RemoveHeadersConfig: props.removeHeadersConfig,
|
|
75
|
+
});
|
|
76
|
+
const toAttrs = (id, config, etag) => ({
|
|
77
|
+
responseHeadersPolicyId: id,
|
|
78
|
+
name: config.Name,
|
|
79
|
+
etag,
|
|
80
|
+
comment: config.Comment,
|
|
81
|
+
corsConfig: config.CorsConfig,
|
|
82
|
+
securityHeadersConfig: config.SecurityHeadersConfig,
|
|
83
|
+
serverTimingHeadersConfig: config.ServerTimingHeadersConfig,
|
|
84
|
+
customHeadersConfig: config.CustomHeadersConfig,
|
|
85
|
+
removeHeadersConfig: config.RemoveHeadersConfig,
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
stables: ["responseHeadersPolicyId"],
|
|
89
|
+
diff: Effect.fn(function* ({ id, news, olds }) {
|
|
90
|
+
if (!isResolved(news))
|
|
91
|
+
return undefined;
|
|
92
|
+
if ((yield* createName(id, olds ?? {})) !==
|
|
93
|
+
(yield* createName(id, news))) {
|
|
94
|
+
return { action: "replace" };
|
|
95
|
+
}
|
|
96
|
+
}),
|
|
97
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
98
|
+
if (output?.responseHeadersPolicyId) {
|
|
99
|
+
const found = yield* getById(output.responseHeadersPolicyId);
|
|
100
|
+
if (found) {
|
|
101
|
+
return toAttrs(output.responseHeadersPolicyId, found.config, found.etag);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const name = yield* createName(id, olds ?? {});
|
|
105
|
+
const found = yield* getByName(name);
|
|
106
|
+
if (!found)
|
|
107
|
+
return undefined;
|
|
108
|
+
return toAttrs(found.id, found.config, found.etag);
|
|
109
|
+
}),
|
|
110
|
+
create: Effect.fn(function* ({ id, news, session }) {
|
|
111
|
+
const name = yield* createName(id, news);
|
|
112
|
+
const created = yield* cloudfront
|
|
113
|
+
.createResponseHeadersPolicy({
|
|
114
|
+
ResponseHeadersPolicyConfig: buildConfig(name, news),
|
|
115
|
+
})
|
|
116
|
+
.pipe(Effect.catchTag("ResponseHeadersPolicyAlreadyExists", () => getByName(name).pipe(Effect.flatMap((existing) => existing
|
|
117
|
+
? Effect.succeed({
|
|
118
|
+
ResponseHeadersPolicy: {
|
|
119
|
+
Id: existing.id,
|
|
120
|
+
LastModifiedTime: new Date(),
|
|
121
|
+
ResponseHeadersPolicyConfig: existing.config,
|
|
122
|
+
},
|
|
123
|
+
ETag: existing.etag,
|
|
124
|
+
Location: undefined,
|
|
125
|
+
})
|
|
126
|
+
: Effect.fail(new Error(`Response headers policy '${name}' already exists but could not be recovered`))))));
|
|
127
|
+
if (!created.ResponseHeadersPolicy?.Id) {
|
|
128
|
+
return yield* Effect.fail(new Error("createResponseHeadersPolicy returned no identifier"));
|
|
129
|
+
}
|
|
130
|
+
yield* session.note(created.ResponseHeadersPolicy.Id);
|
|
131
|
+
return toAttrs(created.ResponseHeadersPolicy.Id, created.ResponseHeadersPolicy.ResponseHeadersPolicyConfig, created.ETag);
|
|
132
|
+
}),
|
|
133
|
+
update: Effect.fn(function* ({ news, output, session }) {
|
|
134
|
+
const current = yield* getById(output.responseHeadersPolicyId);
|
|
135
|
+
const updated = yield* cloudfront.updateResponseHeadersPolicy({
|
|
136
|
+
Id: output.responseHeadersPolicyId,
|
|
137
|
+
IfMatch: current?.etag ?? output.etag,
|
|
138
|
+
ResponseHeadersPolicyConfig: buildConfig(output.name, news),
|
|
139
|
+
});
|
|
140
|
+
if (!updated.ResponseHeadersPolicy?.Id) {
|
|
141
|
+
return yield* Effect.fail(new Error("updateResponseHeadersPolicy returned no identifier"));
|
|
142
|
+
}
|
|
143
|
+
yield* session.note(output.responseHeadersPolicyId);
|
|
144
|
+
return toAttrs(updated.ResponseHeadersPolicy.Id, updated.ResponseHeadersPolicy.ResponseHeadersPolicyConfig, updated.ETag);
|
|
145
|
+
}),
|
|
146
|
+
delete: Effect.fn(function* ({ output }) {
|
|
147
|
+
const current = yield* getById(output.responseHeadersPolicyId);
|
|
148
|
+
if (!current)
|
|
149
|
+
return;
|
|
150
|
+
yield* cloudfront
|
|
151
|
+
.deleteResponseHeadersPolicy({
|
|
152
|
+
Id: output.responseHeadersPolicyId,
|
|
153
|
+
IfMatch: current.etag,
|
|
154
|
+
})
|
|
155
|
+
.pipe(Effect.catchTag("NoSuchResponseHeadersPolicy", () => Effect.void));
|
|
156
|
+
}),
|
|
157
|
+
};
|
|
158
|
+
}));
|
|
159
|
+
const createName = (id, props) => props.name
|
|
160
|
+
? Effect.succeed(props.name)
|
|
161
|
+
: createPhysicalName({ id, maxLength: 128, lowercase: true });
|
|
162
|
+
//# sourceMappingURL=ResponseHeadersPolicy.js.map
|