alchemy 2.0.0-beta.16 → 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.
Files changed (99) hide show
  1. package/bin/alchemy.js +79 -6
  2. package/bin/alchemy.js.map +1 -1
  3. package/bin/cli.js +9 -7
  4. package/bin/commands/deploy.ts +11 -2
  5. package/bin/commands/profile.ts +21 -1
  6. package/bin/commands/state.ts +91 -1
  7. package/lib/AWS/CloudFront/CachePolicy.d.ts +106 -0
  8. package/lib/AWS/CloudFront/CachePolicy.d.ts.map +1 -0
  9. package/lib/AWS/CloudFront/CachePolicy.js +147 -0
  10. package/lib/AWS/CloudFront/CachePolicy.js.map +1 -0
  11. package/lib/AWS/CloudFront/KeyGroup.d.ts +72 -0
  12. package/lib/AWS/CloudFront/KeyGroup.d.ts.map +1 -0
  13. package/lib/AWS/CloudFront/KeyGroup.js +136 -0
  14. package/lib/AWS/CloudFront/KeyGroup.js.map +1 -0
  15. package/lib/AWS/CloudFront/OriginRequestPolicy.d.ts +84 -0
  16. package/lib/AWS/CloudFront/OriginRequestPolicy.d.ts.map +1 -0
  17. package/lib/AWS/CloudFront/OriginRequestPolicy.js +139 -0
  18. package/lib/AWS/CloudFront/OriginRequestPolicy.js.map +1 -0
  19. package/lib/AWS/CloudFront/PublicKey.d.ts +72 -0
  20. package/lib/AWS/CloudFront/PublicKey.d.ts.map +1 -0
  21. package/lib/AWS/CloudFront/PublicKey.js +137 -0
  22. package/lib/AWS/CloudFront/PublicKey.js.map +1 -0
  23. package/lib/AWS/CloudFront/ResponseHeadersPolicy.d.ts +114 -0
  24. package/lib/AWS/CloudFront/ResponseHeadersPolicy.d.ts.map +1 -0
  25. package/lib/AWS/CloudFront/ResponseHeadersPolicy.js +162 -0
  26. package/lib/AWS/CloudFront/ResponseHeadersPolicy.js.map +1 -0
  27. package/lib/AWS/CloudFront/index.d.ts +5 -0
  28. package/lib/AWS/CloudFront/index.d.ts.map +1 -1
  29. package/lib/AWS/CloudFront/index.js +5 -0
  30. package/lib/AWS/CloudFront/index.js.map +1 -1
  31. package/lib/AWS/ECS/CapacityProvider.d.ts +102 -0
  32. package/lib/AWS/ECS/CapacityProvider.d.ts.map +1 -0
  33. package/lib/AWS/ECS/CapacityProvider.js +217 -0
  34. package/lib/AWS/ECS/CapacityProvider.js.map +1 -0
  35. package/lib/AWS/ECS/index.d.ts +1 -0
  36. package/lib/AWS/ECS/index.d.ts.map +1 -1
  37. package/lib/AWS/ECS/index.js +1 -0
  38. package/lib/AWS/ECS/index.js.map +1 -1
  39. package/lib/AWS/Providers.d.ts.map +1 -1
  40. package/lib/AWS/Providers.js +7 -1
  41. package/lib/AWS/Providers.js.map +1 -1
  42. package/lib/Auth/Credentials.d.ts +6 -0
  43. package/lib/Auth/Credentials.d.ts.map +1 -1
  44. package/lib/Auth/Credentials.js +12 -1
  45. package/lib/Auth/Credentials.js.map +1 -1
  46. package/lib/Auth/Profile.d.ts +5 -0
  47. package/lib/Auth/Profile.d.ts.map +1 -1
  48. package/lib/Auth/Profile.js +11 -0
  49. package/lib/Auth/Profile.js.map +1 -1
  50. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +2 -1
  51. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
  52. package/lib/Cloudflare/ApiToken/AccountApiToken.js +6 -5
  53. package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
  54. package/lib/Cloudflare/ApiToken/Common.d.ts +5 -11
  55. package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
  56. package/lib/Cloudflare/ApiToken/Common.js +4 -14
  57. package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
  58. package/lib/Cloudflare/ApiToken/UserApiToken.js +4 -4
  59. package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
  60. package/lib/GitHub/Comment.d.ts +2 -1
  61. package/lib/GitHub/Comment.d.ts.map +1 -1
  62. package/lib/GitHub/Comment.js +1 -0
  63. package/lib/GitHub/Comment.js.map +1 -1
  64. package/lib/GitHub/Providers.d.ts.map +1 -1
  65. package/lib/GitHub/Providers.js +2 -1
  66. package/lib/GitHub/Providers.js.map +1 -1
  67. package/lib/GitHub/Secret.d.ts +2 -2
  68. package/lib/GitHub/Secret.d.ts.map +1 -1
  69. package/lib/GitHub/Secrets.d.ts +45 -0
  70. package/lib/GitHub/Secrets.d.ts.map +1 -0
  71. package/lib/GitHub/Secrets.js +30 -0
  72. package/lib/GitHub/Secrets.js.map +1 -0
  73. package/lib/GitHub/Variable.d.ts +2 -2
  74. package/lib/GitHub/Variable.d.ts.map +1 -1
  75. package/lib/GitHub/index.d.ts +1 -0
  76. package/lib/GitHub/index.d.ts.map +1 -1
  77. package/lib/GitHub/index.js +1 -0
  78. package/lib/GitHub/index.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/AWS/CloudFront/CachePolicy.ts +271 -0
  81. package/src/AWS/CloudFront/KeyGroup.ts +233 -0
  82. package/src/AWS/CloudFront/OriginRequestPolicy.ts +256 -0
  83. package/src/AWS/CloudFront/PublicKey.ts +245 -0
  84. package/src/AWS/CloudFront/ResponseHeadersPolicy.ts +308 -0
  85. package/src/AWS/CloudFront/index.ts +11 -0
  86. package/src/AWS/ECS/CapacityProvider.ts +336 -0
  87. package/src/AWS/ECS/index.ts +4 -0
  88. package/src/AWS/Providers.ts +12 -0
  89. package/src/Auth/Credentials.ts +17 -1
  90. package/src/Auth/Profile.ts +15 -0
  91. package/src/Cloudflare/ApiToken/AccountApiToken.ts +6 -5
  92. package/src/Cloudflare/ApiToken/Common.ts +6 -18
  93. package/src/Cloudflare/ApiToken/UserApiToken.ts +4 -4
  94. package/src/GitHub/Comment.ts +4 -1
  95. package/src/GitHub/Providers.ts +8 -2
  96. package/src/GitHub/Secret.ts +2 -2
  97. package/src/GitHub/Secrets.ts +66 -0
  98. package/src/GitHub/Variable.ts +2 -2
  99. package/src/GitHub/index.ts +1 -0
@@ -0,0 +1,136 @@
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 key group.
9
+ *
10
+ * Key groups bundle one or more {@link PublicKey} resources for use as
11
+ * `TrustedKeyGroups` on a Distribution's cache behavior. CloudFront uses
12
+ * the keys in the group to verify the signatures on signed URLs and
13
+ * signed cookies for that behavior.
14
+ *
15
+ * @section Creating Key Groups
16
+ * @example Group two public keys for signed URL verification
17
+ * ```typescript
18
+ * const primary = yield* PublicKey("PrimarySigningKey", {
19
+ * encodedKey: yield* fs.readFileString("./primary.pem"),
20
+ * });
21
+ * const secondary = yield* PublicKey("SecondarySigningKey", {
22
+ * encodedKey: yield* fs.readFileString("./secondary.pem"),
23
+ * });
24
+ *
25
+ * const keyGroup = yield* KeyGroup("SignedUrlKeys", {
26
+ * comment: "Trusted signers for /private",
27
+ * items: [primary.publicKeyId, secondary.publicKeyId],
28
+ * });
29
+ * ```
30
+ */
31
+ export const KeyGroup = Resource("AWS.CloudFront.KeyGroup");
32
+ export const KeyGroupProvider = () => Provider.effect(KeyGroup, Effect.gen(function* () {
33
+ const getById = Effect.fn(function* (id) {
34
+ const config = yield* cloudfront
35
+ .getKeyGroupConfig({ Id: id })
36
+ .pipe(Effect.catchTag("NoSuchResource", () => Effect.succeed(undefined)));
37
+ if (!config?.KeyGroupConfig)
38
+ return undefined;
39
+ return { config: config.KeyGroupConfig, etag: config.ETag };
40
+ });
41
+ const getByName = Effect.fn(function* (name) {
42
+ const listed = yield* cloudfront.listKeyGroups({});
43
+ const summary = listed.KeyGroupList?.Items?.find((item) => item.KeyGroup?.KeyGroupConfig?.Name === name);
44
+ if (!summary?.KeyGroup?.Id)
45
+ return undefined;
46
+ return yield* getById(summary.KeyGroup.Id).pipe(Effect.map((found) => found ? { id: summary.KeyGroup.Id, ...found } : undefined));
47
+ });
48
+ const buildConfig = (name, items, comment) => ({
49
+ Name: name,
50
+ Items: items,
51
+ Comment: comment,
52
+ });
53
+ const toAttrs = (id, config, etag) => ({
54
+ keyGroupId: id,
55
+ name: config.Name,
56
+ items: config.Items,
57
+ etag,
58
+ comment: config.Comment,
59
+ });
60
+ return {
61
+ stables: ["keyGroupId"],
62
+ diff: Effect.fn(function* ({ id, news, olds }) {
63
+ if (!isResolved(news))
64
+ return undefined;
65
+ if ((yield* createName(id, olds ?? {})) !==
66
+ (yield* createName(id, news))) {
67
+ return { action: "replace" };
68
+ }
69
+ }),
70
+ read: Effect.fn(function* ({ id, olds, output }) {
71
+ if (output?.keyGroupId) {
72
+ const found = yield* getById(output.keyGroupId);
73
+ if (found)
74
+ return toAttrs(output.keyGroupId, found.config, found.etag);
75
+ }
76
+ const name = yield* createName(id, olds ?? {});
77
+ const found = yield* getByName(name);
78
+ if (!found)
79
+ return undefined;
80
+ return toAttrs(found.id, found.config, found.etag);
81
+ }),
82
+ create: Effect.fn(function* ({ id, news, session }) {
83
+ const name = yield* createName(id, news);
84
+ const items = news.items;
85
+ const created = yield* cloudfront
86
+ .createKeyGroup({
87
+ KeyGroupConfig: buildConfig(name, items, news.comment),
88
+ })
89
+ .pipe(Effect.catchTag("KeyGroupAlreadyExists", () => getByName(name).pipe(Effect.flatMap((existing) => existing
90
+ ? Effect.succeed({
91
+ KeyGroup: {
92
+ Id: existing.id,
93
+ LastModifiedTime: new Date(),
94
+ KeyGroupConfig: existing.config,
95
+ },
96
+ ETag: existing.etag,
97
+ Location: undefined,
98
+ })
99
+ : Effect.fail(new Error(`Key group '${name}' already exists but could not be recovered`))))));
100
+ if (!created.KeyGroup?.Id) {
101
+ return yield* Effect.fail(new Error("createKeyGroup returned no identifier"));
102
+ }
103
+ yield* session.note(created.KeyGroup.Id);
104
+ return toAttrs(created.KeyGroup.Id, created.KeyGroup.KeyGroupConfig, created.ETag);
105
+ }),
106
+ update: Effect.fn(function* ({ news, output, session }) {
107
+ const current = yield* getById(output.keyGroupId);
108
+ const items = news.items;
109
+ const updated = yield* cloudfront.updateKeyGroup({
110
+ Id: output.keyGroupId,
111
+ IfMatch: current?.etag ?? output.etag,
112
+ KeyGroupConfig: buildConfig(output.name, items, news.comment),
113
+ });
114
+ if (!updated.KeyGroup?.Id) {
115
+ return yield* Effect.fail(new Error("updateKeyGroup returned no identifier"));
116
+ }
117
+ yield* session.note(output.keyGroupId);
118
+ return toAttrs(updated.KeyGroup.Id, updated.KeyGroup.KeyGroupConfig, updated.ETag);
119
+ }),
120
+ delete: Effect.fn(function* ({ output }) {
121
+ const current = yield* getById(output.keyGroupId);
122
+ if (!current)
123
+ return;
124
+ yield* cloudfront
125
+ .deleteKeyGroup({
126
+ Id: output.keyGroupId,
127
+ IfMatch: current.etag,
128
+ })
129
+ .pipe(Effect.catchTag("NoSuchResource", () => Effect.void));
130
+ }),
131
+ };
132
+ }));
133
+ const createName = (id, props) => props.name
134
+ ? Effect.succeed(props.name)
135
+ : createPhysicalName({ id, maxLength: 128, lowercase: true });
136
+ //# sourceMappingURL=KeyGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyGroup.js","sourceRoot":"","sources":["../../../src/AWS/CloudFront/KeyGroup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
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 OriginRequestPolicyProps {
6
+ /**
7
+ * Name of the origin request 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
+ * Headers to forward to the origin (in addition to the cache key).
18
+ */
19
+ headersConfig: cloudfront.OriginRequestPolicyHeadersConfig;
20
+ /**
21
+ * Cookies to forward to the origin (in addition to the cache key).
22
+ */
23
+ cookiesConfig: cloudfront.OriginRequestPolicyCookiesConfig;
24
+ /**
25
+ * Query strings to forward to the origin (in addition to the cache key).
26
+ */
27
+ queryStringsConfig: cloudfront.OriginRequestPolicyQueryStringsConfig;
28
+ }
29
+ export interface OriginRequestPolicy extends Resource<"AWS.CloudFront.OriginRequestPolicy", OriginRequestPolicyProps, {
30
+ /**
31
+ * CloudFront-assigned origin request policy identifier.
32
+ */
33
+ originRequestPolicyId: string;
34
+ /**
35
+ * Name of the origin request policy.
36
+ */
37
+ name: string;
38
+ /**
39
+ * Most recent entity tag for update/delete operations.
40
+ */
41
+ etag: string | undefined;
42
+ /**
43
+ * Current comment on the policy.
44
+ */
45
+ comment: string | undefined;
46
+ /**
47
+ * Current headers configuration.
48
+ */
49
+ headersConfig: cloudfront.OriginRequestPolicyHeadersConfig;
50
+ /**
51
+ * Current cookies configuration.
52
+ */
53
+ cookiesConfig: cloudfront.OriginRequestPolicyCookiesConfig;
54
+ /**
55
+ * Current query strings configuration.
56
+ */
57
+ queryStringsConfig: cloudfront.OriginRequestPolicyQueryStringsConfig;
58
+ }, never, Providers> {
59
+ }
60
+ /**
61
+ * A CloudFront origin request policy.
62
+ *
63
+ * Origin request policies control which values from the viewer request (in
64
+ * addition to those used in the cache key) CloudFront includes when sending
65
+ * a request to the origin. They are referenced by ID on a Distribution's
66
+ * default behavior or per-path cache behaviors.
67
+ *
68
+ * @section Creating Origin Request Policies
69
+ * @example Forward all viewer headers and cookies
70
+ * ```typescript
71
+ * const originRequestPolicy = yield* OriginRequestPolicy("AppOriginRequest", {
72
+ * comment: "Forward auth + locale",
73
+ * headersConfig: {
74
+ * HeaderBehavior: "whitelist",
75
+ * Headers: { Quantity: 2, Items: ["Authorization", "Accept-Language"] },
76
+ * },
77
+ * cookiesConfig: { CookieBehavior: "all" },
78
+ * queryStringsConfig: { QueryStringBehavior: "all" },
79
+ * });
80
+ * ```
81
+ */
82
+ export declare const OriginRequestPolicy: import("../../Resource.ts").ResourceClass<OriginRequestPolicy>;
83
+ export declare const OriginRequestPolicyProvider: () => import("effect/Layer").Layer<Provider.Provider<OriginRequestPolicy>, 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>;
84
+ //# sourceMappingURL=OriginRequestPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OriginRequestPolicy.d.ts","sourceRoot":"","sources":["../../../src/AWS/CloudFront/OriginRequestPolicy.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,wBAAwB;IACvC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,aAAa,EAAE,UAAU,CAAC,gCAAgC,CAAC;IAC3D;;OAEG;IACH,aAAa,EAAE,UAAU,CAAC,gCAAgC,CAAC;IAC3D;;OAEG;IACH,kBAAkB,EAAE,UAAU,CAAC,qCAAqC,CAAC;CACtE;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CACnD,oCAAoC,EACpC,wBAAwB,EACxB;IACE;;OAEG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;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,aAAa,EAAE,UAAU,CAAC,gCAAgC,CAAC;IAC3D;;OAEG;IACH,aAAa,EAAE,UAAU,CAAC,gCAAgC,CAAC;IAC3D;;OAEG;IACH,kBAAkB,EAAE,UAAU,CAAC,qCAAqC,CAAC;CACtE,EACD,KAAK,EACL,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,mBAAmB,gEAE/B,CAAC;AAEF,eAAO,MAAM,2BAA2B,mTA0JrC,CAAC"}
@@ -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":"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"}
@@ -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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"}