@staticforge/aws 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +6 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/clients.d.ts +22 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +64 -0
- package/dist/clients.js.map +1 -0
- package/dist/deployer.d.ts +6 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +379 -0
- package/dist/deployer.js.map +1 -0
- package/dist/iac.d.ts +26 -0
- package/dist/iac.d.ts.map +1 -0
- package/dist/iac.js +223 -0
- package/dist/iac.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/routing.d.ts +32 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +111 -0
- package/dist/routing.js.map +1 -0
- package/package.json +59 -3
- package/terraform/modules/site/cdn.tf +191 -0
- package/terraform/modules/site/ci.tf +117 -0
- package/terraform/modules/site/domain.tf +77 -0
- package/terraform/modules/site/logging.tf +82 -0
- package/terraform/modules/site/outputs.tf +69 -0
- package/terraform/modules/site/router.js +136 -0
- package/terraform/modules/site/router.tf +33 -0
- package/terraform/modules/site/storage.tf +107 -0
- package/terraform/modules/site/variables.tf +106 -0
- package/terraform/modules/site/versions.tf +11 -0
- package/terraform/state-bootstrap/main.tf +104 -0
- package/terraform/state-bootstrap/outputs.tf +11 -0
- package/terraform/state-bootstrap/variables.tf +21 -0
- package/terraform/state-bootstrap/versions.tf +10 -0
package/dist/iac.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { ListOpenIDConnectProviderTagsCommand, ListOpenIDConnectProvidersCommand, } from '@aws-sdk/client-iam';
|
|
3
|
+
import { HeadBucketCommand } from '@aws-sdk/client-s3';
|
|
4
|
+
import { GetCallerIdentityCommand } from '@aws-sdk/client-sts';
|
|
5
|
+
import { ErrorCode, SforgeError } from '@staticforge/core';
|
|
6
|
+
import { projectName, } from '@staticforge/iac';
|
|
7
|
+
import { searchPaths, securityHeaders } from '@staticforge/provider-api';
|
|
8
|
+
import { awsError, defaultClients, errorName, httpStatus } from './clients.js';
|
|
9
|
+
/** Packaged HCL, next to src/ and dist/. */
|
|
10
|
+
const terraformDir = (path) => fileURLToPath(new URL(`../terraform/${path}`, import.meta.url));
|
|
11
|
+
export const SITE_MODULE_DIR = terraformDir('modules/site');
|
|
12
|
+
export const STATE_BOOTSTRAP_DIR = terraformDir('state-bootstrap');
|
|
13
|
+
const AWS_PROVIDER = { source: 'hashicorp/aws', version: '>= 6.0, < 7.0' };
|
|
14
|
+
const GITHUB_OIDC_HOST = 'token.actions.githubusercontent.com';
|
|
15
|
+
/** `sforge-state-<accountId>-<region>` unless configured, key `<site>/<target>.tfstate`. */
|
|
16
|
+
export function stateLocation(target, accountId, project, targetName) {
|
|
17
|
+
const region = target.state.region ?? target.region;
|
|
18
|
+
return {
|
|
19
|
+
bucket: target.state.bucket ?? `sforge-state-${accountId}-${region}`,
|
|
20
|
+
region,
|
|
21
|
+
key: `${project}/${targetName}.tfstate`,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function s3Backend(location, kmsKeyArn) {
|
|
25
|
+
return {
|
|
26
|
+
type: 's3',
|
|
27
|
+
config: {
|
|
28
|
+
bucket: location.bucket,
|
|
29
|
+
key: location.key,
|
|
30
|
+
region: location.region,
|
|
31
|
+
encrypt: true,
|
|
32
|
+
use_lockfile: true,
|
|
33
|
+
...(kmsKeyArn !== undefined && { kms_key_id: kmsKeyArn }),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function accountId(clients, region) {
|
|
38
|
+
try {
|
|
39
|
+
const identity = await clients.sts(region).send(new GetCallerIdentityCommand({}));
|
|
40
|
+
if (identity.Account === undefined)
|
|
41
|
+
throw new Error('no account in the caller identity');
|
|
42
|
+
return identity.Account;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw awsError(error, 'Could not identify the AWS account', ErrorCode.CloudAuth);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function bucketExists(clients, bucket, region) {
|
|
49
|
+
try {
|
|
50
|
+
await clients.s3(region).send(new HeadBucketCommand({ Bucket: bucket }));
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const status = httpStatus(error);
|
|
55
|
+
if (status === 404 || errorName(error) === 'NotFound' || errorName(error) === 'NoSuchBucket') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (status === 403) {
|
|
59
|
+
throw new SforgeError(ErrorCode.CloudAuth, `The state bucket ${bucket} exists but this AWS identity cannot access it`, {
|
|
60
|
+
hint: 'Bucket names are global: if another account owns it, set targets.<name>.state.bucket.',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
throw awsError(error, `Could not check the state bucket ${bucket}`, ErrorCode.CloudAuth);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The account's GitHub OIDC provider is shared: reuse an existing one, unless
|
|
68
|
+
* this target created it (tagged `sforge:owner = <site>-<target>`), in which
|
|
69
|
+
* case it stays managed here.
|
|
70
|
+
*/
|
|
71
|
+
export async function chooseOidcProvider(clients, owner) {
|
|
72
|
+
try {
|
|
73
|
+
const iam = clients.iam();
|
|
74
|
+
const list = await iam.send(new ListOpenIDConnectProvidersCommand({}));
|
|
75
|
+
const arn = list.OpenIDConnectProviderList?.map((p) => p.Arn).find((a) => a !== undefined && a.endsWith(`/${GITHUB_OIDC_HOST}`));
|
|
76
|
+
if (arn === undefined)
|
|
77
|
+
return { create: true };
|
|
78
|
+
const tags = await iam.send(new ListOpenIDConnectProviderTagsCommand({ OpenIDConnectProviderArn: arn }));
|
|
79
|
+
const ours = tags.Tags?.some((t) => t.Key === 'sforge:owner' && t.Value === owner) ?? false;
|
|
80
|
+
return ours ? { create: true } : { create: false, arn };
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw awsError(error, 'Could not look up the GitHub OIDC provider', ErrorCode.CloudAuth);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Instructions for DNS records the user must create (no Route 53 hosted zone). */
|
|
87
|
+
export function describeValidation(outputs) {
|
|
88
|
+
const records = outputs.validation_records;
|
|
89
|
+
if (records === undefined || records.length === 0)
|
|
90
|
+
return undefined;
|
|
91
|
+
const lines = records.map((r) => ` ${r.name} ${r.type} ${r.value}`);
|
|
92
|
+
return [
|
|
93
|
+
'Create these DNS records to validate the certificate (provisioning waits until they resolve):',
|
|
94
|
+
...lines,
|
|
95
|
+
].join('\n');
|
|
96
|
+
}
|
|
97
|
+
export function createAwsIacProfile(clients = defaultClients()) {
|
|
98
|
+
return {
|
|
99
|
+
provider: 'aws',
|
|
100
|
+
async prepare(input) {
|
|
101
|
+
const target = input.target;
|
|
102
|
+
const project = projectName(input.config);
|
|
103
|
+
const id = `${project}-${input.targetName}`;
|
|
104
|
+
const account = await accountId(clients, target.region);
|
|
105
|
+
const location = stateLocation(target, account, project, input.targetName);
|
|
106
|
+
const outputsOnly = input.purpose === 'outputs';
|
|
107
|
+
const exists = outputsOnly
|
|
108
|
+
? true
|
|
109
|
+
: await bucketExists(clients, location.bucket, location.region);
|
|
110
|
+
if (target.previewDomain !== undefined && target.domain === undefined) {
|
|
111
|
+
throw new SforgeError(ErrorCode.ConfigInvalid, `targets.${input.targetName}.previewDomain needs a domain`, {
|
|
112
|
+
hint: 'PR previews are served from a wildcard certificate of the custom domain.',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const oidc = target.ci === undefined || outputsOnly ? undefined : await chooseOidcProvider(clients, id);
|
|
116
|
+
const headers = securityHeaders(input.config);
|
|
117
|
+
const tags = { 'sforge:managed-by': 'staticforge' };
|
|
118
|
+
const inputs = {
|
|
119
|
+
name: project,
|
|
120
|
+
target: input.targetName,
|
|
121
|
+
trailing_slash: input.config.build.trailingSlash,
|
|
122
|
+
domain: target.domain ?? null,
|
|
123
|
+
hosted_zone: target.hostedZone ?? null,
|
|
124
|
+
preview_domain: target.previewDomain ?? null,
|
|
125
|
+
logging: target.logging,
|
|
126
|
+
waf_web_acl_arn: target.wafWebAclArn ?? null,
|
|
127
|
+
force_destroy: false,
|
|
128
|
+
security_headers: {
|
|
129
|
+
content_security_policy: headers.contentSecurityPolicy,
|
|
130
|
+
search_content_security_policy: headers.searchContentSecurityPolicy,
|
|
131
|
+
hsts_max_age: headers.hsts?.maxAge ?? null,
|
|
132
|
+
hsts_include_subdomains: headers.hsts?.includeSubDomains ?? false,
|
|
133
|
+
hsts_preload: headers.hsts?.preload ?? false,
|
|
134
|
+
referrer_policy: headers.referrerPolicy,
|
|
135
|
+
frame_options: headers.frameOptions,
|
|
136
|
+
permissions_policy: headers.permissionsPolicy,
|
|
137
|
+
},
|
|
138
|
+
search_paths: searchPaths(input.config),
|
|
139
|
+
ci: target.ci === undefined
|
|
140
|
+
? null
|
|
141
|
+
: {
|
|
142
|
+
repo: target.ci.repo,
|
|
143
|
+
branches: target.ci.branches,
|
|
144
|
+
environments: target.ci.environments,
|
|
145
|
+
pull_requests: target.ci.pullRequests,
|
|
146
|
+
// Reading outputs never applies, so the choice does not matter there.
|
|
147
|
+
create_oidc_provider: oidc?.create ?? false,
|
|
148
|
+
oidc_provider_arn: oidc?.arn ?? null,
|
|
149
|
+
state_bucket: location.bucket,
|
|
150
|
+
state_key: location.key,
|
|
151
|
+
},
|
|
152
|
+
tags,
|
|
153
|
+
...input.inputs,
|
|
154
|
+
};
|
|
155
|
+
const defaultTags = [
|
|
156
|
+
{ tags: { ...tags, 'sforge:site': project, 'sforge:target': input.targetName } },
|
|
157
|
+
];
|
|
158
|
+
const spec = {
|
|
159
|
+
requiredProviders: { aws: AWS_PROVIDER },
|
|
160
|
+
providers: {
|
|
161
|
+
aws: [
|
|
162
|
+
{ region: target.region, default_tags: defaultTags },
|
|
163
|
+
{ alias: 'us_east_1', region: 'us-east-1', default_tags: defaultTags },
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
module: {
|
|
167
|
+
name: 'site',
|
|
168
|
+
dir: SITE_MODULE_DIR,
|
|
169
|
+
inputs,
|
|
170
|
+
providers: { aws: 'aws', 'aws.us_east_1': 'aws.us_east_1' },
|
|
171
|
+
},
|
|
172
|
+
outputs: [
|
|
173
|
+
'bucket',
|
|
174
|
+
'bucket_region',
|
|
175
|
+
'distribution_id',
|
|
176
|
+
'distribution_arn',
|
|
177
|
+
'distribution_domain',
|
|
178
|
+
'kvs_arn',
|
|
179
|
+
'url',
|
|
180
|
+
'preview_domain',
|
|
181
|
+
'trailing_slash',
|
|
182
|
+
'certificate_arn',
|
|
183
|
+
'validation_records',
|
|
184
|
+
'dns_records',
|
|
185
|
+
'ci_role_arn',
|
|
186
|
+
'oidc_provider_arn',
|
|
187
|
+
],
|
|
188
|
+
backend: s3Backend(location, target.state.kmsKeyArn),
|
|
189
|
+
};
|
|
190
|
+
const bootstrap = {
|
|
191
|
+
requiredProviders: { aws: AWS_PROVIDER },
|
|
192
|
+
providers: { aws: [{ region: location.region, default_tags: [{ tags }] }] },
|
|
193
|
+
module: {
|
|
194
|
+
name: 'state',
|
|
195
|
+
dir: STATE_BOOTSTRAP_DIR,
|
|
196
|
+
inputs: { bucket_name: location.bucket, kms_key_arn: target.state.kmsKeyArn ?? null },
|
|
197
|
+
},
|
|
198
|
+
outputs: ['bucket', 'region'],
|
|
199
|
+
backend: s3Backend({ ...location, key: '_sforge/state-bootstrap.tfstate' }, target.state.kmsKeyArn),
|
|
200
|
+
};
|
|
201
|
+
return {
|
|
202
|
+
spec,
|
|
203
|
+
state: {
|
|
204
|
+
id: `aws-${account}-${location.region}${target.state.bucket ? `-${target.state.bucket}` : ''}`,
|
|
205
|
+
description: `s3://${location.bucket}/${location.key}`,
|
|
206
|
+
exists,
|
|
207
|
+
bootstrap,
|
|
208
|
+
},
|
|
209
|
+
preDestroyInputs: { force_destroy: true },
|
|
210
|
+
// Deploys and rollbacks switch the active version with the SDK.
|
|
211
|
+
expectedDrift: ['module.site.aws_cloudfrontkeyvaluestore_key.active'],
|
|
212
|
+
...(target.domain !== undefined &&
|
|
213
|
+
target.hostedZone === undefined && {
|
|
214
|
+
prePhase: {
|
|
215
|
+
targets: ['module.site.aws_acm_certificate.site'],
|
|
216
|
+
describe: describeValidation,
|
|
217
|
+
},
|
|
218
|
+
}),
|
|
219
|
+
};
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=iac.js.map
|
package/dist/iac.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iac.js","sourceRoot":"","sources":["../src/iac.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Provider } from '@staticforge/provider-api';
|
|
2
|
+
import { type AwsClients } from './clients.js';
|
|
3
|
+
export * from './clients.js';
|
|
4
|
+
export * from './deployer.js';
|
|
5
|
+
export * from './iac.js';
|
|
6
|
+
export * from './routing.js';
|
|
7
|
+
/** The AWS provider: private S3 + CloudFront with OAC, versions in a KeyValueStore. */
|
|
8
|
+
export declare function createAwsProvider(clients?: AwsClients): Provider;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,cAAc,CAAC;AAI/D,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAE7B,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,UAA6B,GAAG,QAAQ,CAOlF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defaultClients } from './clients.js';
|
|
2
|
+
import { REQUIRED_OUTPUTS, createAwsDeployer } from './deployer.js';
|
|
3
|
+
import { createAwsIacProfile } from './iac.js';
|
|
4
|
+
export * from './clients.js';
|
|
5
|
+
export * from './deployer.js';
|
|
6
|
+
export * from './iac.js';
|
|
7
|
+
export * from './routing.js';
|
|
8
|
+
/** The AWS provider: private S3 + CloudFront with OAC, versions in a KeyValueStore. */
|
|
9
|
+
export function createAwsProvider(clients = defaultClients()) {
|
|
10
|
+
return {
|
|
11
|
+
id: 'aws',
|
|
12
|
+
iac: createAwsIacProfile(clients),
|
|
13
|
+
createDeployer: (context) => createAwsDeployer(context, clients),
|
|
14
|
+
requiredOutputs: REQUIRED_OUTPUTS,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAE7B,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,UAAsB,cAAc,EAAE;IACtE,OAAO;QACL,EAAE,EAAE,KAAK;QACT,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACjC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC;QAChE,eAAe,EAAE,gBAAgB;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type TrailingSlash = 'always' | 'never';
|
|
2
|
+
/** What the CloudFront router does with a URL path, before route exceptions. */
|
|
3
|
+
export type RouterTarget = {
|
|
4
|
+
file: string;
|
|
5
|
+
key?: string;
|
|
6
|
+
} | {
|
|
7
|
+
redirect: string;
|
|
8
|
+
key?: string;
|
|
9
|
+
} | {
|
|
10
|
+
missing: true;
|
|
11
|
+
key?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The rule-based part of terraform/modules/site/router.js, mirrored for
|
|
15
|
+
* computing route exceptions. `key` (page-like URLs only) is the canonical
|
|
16
|
+
* path under which an exception is looked up.
|
|
17
|
+
*/
|
|
18
|
+
export declare function routeByRule(uri: string, trailingSlash: TrailingSlash): RouterTarget;
|
|
19
|
+
export interface RouteExceptions {
|
|
20
|
+
/** KVS key (without the "r:<version>:" prefix) → value. */
|
|
21
|
+
entries: Record<string, string>;
|
|
22
|
+
/** Page URLs whose exception key would be too long for the KVS. */
|
|
23
|
+
skipped: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The URLs of a build that the router's rules would serve differently from
|
|
27
|
+
* `sforge preview` (resolveRequest), such as section pages with trailingSlash
|
|
28
|
+
* "never" or files without an extension. `sforge deploy` stores them in the
|
|
29
|
+
* KVS so CloudFront matches the local server.
|
|
30
|
+
*/
|
|
31
|
+
export declare function routeExceptions(files: Iterable<string>, trailingSlash: TrailingSlash, versionId: string): RouteExceptions;
|
|
32
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,gFAAgF;AAChF,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CA8BnF;AA6BD,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,GAChB,eAAe,CA+BjB"}
|
package/dist/routing.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { resolveRequest } from '@staticforge/server';
|
|
2
|
+
/**
|
|
3
|
+
* The rule-based part of terraform/modules/site/router.js, mirrored for
|
|
4
|
+
* computing route exceptions. `key` (page-like URLs only) is the canonical
|
|
5
|
+
* path under which an exception is looked up.
|
|
6
|
+
*/
|
|
7
|
+
export function routeByRule(uri, trailingSlash) {
|
|
8
|
+
if (!uri.startsWith('/'))
|
|
9
|
+
return { missing: true };
|
|
10
|
+
const raw = uri.slice(1).split('/');
|
|
11
|
+
const trailing = raw.at(-1) === '';
|
|
12
|
+
if (trailing)
|
|
13
|
+
raw.pop();
|
|
14
|
+
const canonical = [];
|
|
15
|
+
for (const part of raw) {
|
|
16
|
+
let segment;
|
|
17
|
+
try {
|
|
18
|
+
segment = decodeURIComponent(part);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { missing: true };
|
|
22
|
+
}
|
|
23
|
+
if (segment === '' || segment.startsWith('.') || /[\\\0]/.test(segment))
|
|
24
|
+
return { missing: true };
|
|
25
|
+
canonical.push(encodeURIComponent(segment));
|
|
26
|
+
}
|
|
27
|
+
if (raw.length === 0)
|
|
28
|
+
return { file: 'index.html' };
|
|
29
|
+
const path = raw.join('/');
|
|
30
|
+
const key = `/${canonical.join('/')}${trailing ? '/' : ''}`;
|
|
31
|
+
if (trailing) {
|
|
32
|
+
if (trailingSlash === 'always')
|
|
33
|
+
return { file: `${path}/index.html`, key };
|
|
34
|
+
// "/style.css/" is not a page; only pages lose their slash.
|
|
35
|
+
return raw.at(-1).includes('.') ? { missing: true, key } : { redirect: `/${path}`, key };
|
|
36
|
+
}
|
|
37
|
+
if (raw.at(-1).includes('.'))
|
|
38
|
+
return { file: path };
|
|
39
|
+
return trailingSlash === 'always'
|
|
40
|
+
? { redirect: `/${path}/`, key }
|
|
41
|
+
: { file: `${path}.html`, key };
|
|
42
|
+
}
|
|
43
|
+
/** The S3 key part of a router file target (URL-decoded). */
|
|
44
|
+
function decodedFile(file) {
|
|
45
|
+
return file.split('/').map(decodeURIComponent).join('/');
|
|
46
|
+
}
|
|
47
|
+
function encodePath(path) {
|
|
48
|
+
return path.split('/').map(encodeURIComponent).join('/');
|
|
49
|
+
}
|
|
50
|
+
/** Value of an "r:<version>:<key>" KVS entry: f:<file>, r:<location> or 404. */
|
|
51
|
+
function exceptionValue(truth) {
|
|
52
|
+
if (truth.kind === 'redirect')
|
|
53
|
+
return `r:${truth.location}`;
|
|
54
|
+
if (truth.kind === 'file' && truth.status === 200)
|
|
55
|
+
return `f:${encodePath(truth.path)}`;
|
|
56
|
+
return '404';
|
|
57
|
+
}
|
|
58
|
+
function sameOutcome(rule, truth) {
|
|
59
|
+
if ('redirect' in rule)
|
|
60
|
+
return truth.kind === 'redirect' && truth.location === rule.redirect;
|
|
61
|
+
if ('missing' in rule)
|
|
62
|
+
return truth.kind !== 'file' || truth.status === 404;
|
|
63
|
+
if (truth.kind === 'file' && truth.status === 200)
|
|
64
|
+
return decodedFile(rule.file) === truth.path;
|
|
65
|
+
// The rule names a file that does not exist: S3 answers 404, like the local server.
|
|
66
|
+
return truth.kind !== 'redirect';
|
|
67
|
+
}
|
|
68
|
+
/** Longest KVS key is 512 bytes. */
|
|
69
|
+
const MAX_KEY_BYTES = 512;
|
|
70
|
+
/**
|
|
71
|
+
* The URLs of a build that the router's rules would serve differently from
|
|
72
|
+
* `sforge preview` (resolveRequest), such as section pages with trailingSlash
|
|
73
|
+
* "never" or files without an extension. `sforge deploy` stores them in the
|
|
74
|
+
* KVS so CloudFront matches the local server.
|
|
75
|
+
*/
|
|
76
|
+
export function routeExceptions(files, trailingSlash, versionId) {
|
|
77
|
+
const set = new Set(files);
|
|
78
|
+
const exists = (path) => set.has(path);
|
|
79
|
+
const candidates = new Set();
|
|
80
|
+
for (const file of set) {
|
|
81
|
+
const encoded = `/${encodePath(file)}`;
|
|
82
|
+
if (file.endsWith('/index.html')) {
|
|
83
|
+
const dir = encoded.slice(0, -'index.html'.length);
|
|
84
|
+
candidates.add(dir).add(dir.slice(0, -1));
|
|
85
|
+
}
|
|
86
|
+
else if (file.endsWith('.html')) {
|
|
87
|
+
const page = encoded.slice(0, -'.html'.length);
|
|
88
|
+
candidates.add(page).add(`${page}/`);
|
|
89
|
+
}
|
|
90
|
+
else if (!file.split('/').at(-1).includes('.')) {
|
|
91
|
+
candidates.add(encoded).add(`${encoded}/`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const entries = {};
|
|
95
|
+
const skipped = [];
|
|
96
|
+
for (const url of [...candidates].sort()) {
|
|
97
|
+
const rule = routeByRule(url, trailingSlash);
|
|
98
|
+
if (rule.key === undefined)
|
|
99
|
+
continue;
|
|
100
|
+
const truth = resolveRequest(url, exists, { trailingSlash });
|
|
101
|
+
if (sameOutcome(rule, truth))
|
|
102
|
+
continue;
|
|
103
|
+
if (Buffer.byteLength(`r:${versionId}:${rule.key}`) > MAX_KEY_BYTES) {
|
|
104
|
+
skipped.push(url);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
entries[rule.key] = exceptionValue(truth);
|
|
108
|
+
}
|
|
109
|
+
return { entries, skipped };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@staticforge/aws",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "AWS provider for staticforge: private S3 + CloudFront (OAC), KeyValueStore versions, previews",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"staticforge",
|
|
7
|
+
"aws",
|
|
8
|
+
"s3",
|
|
9
|
+
"cloudfront",
|
|
10
|
+
"opentofu",
|
|
11
|
+
"terraform"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/elchanio-76/sforge#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/elchanio-76/sforge/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/elchanio-76/sforge.git",
|
|
20
|
+
"directory": "packages/providers/aws"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Eleftherios Chaniotakis",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"@staticforge/source": "./src/index.ts",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"default": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"terraform/**/*.tf",
|
|
35
|
+
"terraform/**/*.js",
|
|
36
|
+
"terraform/**/*.hcl",
|
|
37
|
+
"!terraform/**/.terraform.lock.hcl",
|
|
38
|
+
"!terraform/**/tests/**"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": "^22.22.0 || >=24.8.0"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@aws-sdk/client-cloudfront": "^3.1138.0",
|
|
48
|
+
"@aws-sdk/client-cloudfront-keyvaluestore": "^3.1138.0",
|
|
49
|
+
"@aws-sdk/client-iam": "^3.1138.0",
|
|
50
|
+
"@aws-sdk/client-s3": "^3.1138.0",
|
|
51
|
+
"@aws-sdk/client-sts": "^3.1138.0",
|
|
52
|
+
"@aws-sdk/signature-v4a": "^3.1138.0",
|
|
53
|
+
"@staticforge/core": "0.1.1",
|
|
54
|
+
"@staticforge/iac": "0.1.1",
|
|
55
|
+
"@staticforge/provider-api": "0.1.1",
|
|
56
|
+
"@staticforge/server": "0.1.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@smithy/util-stream": "^4.8.2",
|
|
60
|
+
"aws-sdk-client-mock": "^4.1.0"
|
|
61
|
+
}
|
|
6
62
|
}
|