headroom-cms 0.1.10 → 0.1.11
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/README.md +11 -6
- package/admin/assets/{AdminsPage-BIWASote.js → AdminsPage-BnzH9TL3.js} +1 -1
- package/admin/assets/{AllContentPage-1gXe2OC7.js → AllContentPage-BtObN6oy.js} +1 -1
- package/admin/assets/{ApiKeysPage-BBW4ATBx.js → ApiKeysPage-DEAa8eyC.js} +1 -1
- package/admin/assets/{AuditPage-B5GGFWGG.js → AuditPage-BN9yNsxh.js} +1 -1
- package/admin/assets/{BlockEditor-ClskiZoX.js → BlockEditor-3wnisTOZ.js} +3 -3
- package/admin/assets/{BlockTypeEditPage-CY0gCPei.js → BlockTypeEditPage-C2evAESK.js} +1 -1
- package/admin/assets/{BlockTypesPage-D8Me6OeX.js → BlockTypesPage-Dhkho6T_.js} +1 -1
- package/admin/assets/{BulkActionBar--35xjnOP.js → BulkActionBar-BxdfUSrN.js} +1 -1
- package/admin/assets/CollectionEditPage-lOb4hEZy.js +1 -0
- package/admin/assets/{CollectionsPage-BQmGXpvW.js → CollectionsPage-CgtOloa1.js} +1 -1
- package/admin/assets/{ContentCreatePage-DlgxamOe.js → ContentCreatePage-LeQjahp_.js} +1 -1
- package/admin/assets/ContentEditPage-xczr4d_h.js +1 -0
- package/admin/assets/{ContentField-D04Uo1Ov.js → ContentField-pilCbdnA.js} +1 -1
- package/admin/assets/{ContentListPage-BDMx7pWb.js → ContentListPage-BAKDn1Xy.js} +1 -1
- package/admin/assets/{CustomBlockPreview-Cs9bFDh4.js → CustomBlockPreview-DNnTFM0z.js} +1 -1
- package/admin/assets/FieldRenderer-DiOKvkWV.js +2 -0
- package/admin/assets/{FilterBar-kFcOLffg.js → FilterBar-BZoa63zh.js} +1 -1
- package/admin/assets/{FloatingComposerController-D4uLQfUX-C0Lhbmda.js → FloatingComposerController-D4uLQfUX-BMIvFCoE.js} +1 -1
- package/admin/assets/{IconPicker-BrgSAsa_.js → IconPicker-CpIgiQTC.js} +2 -2
- package/admin/assets/{LoginPage-Bi7TBzK4.js → LoginPage-D9ZsGLIi.js} +1 -1
- package/admin/assets/{MediaField-B-Cz8TlK.js → MediaField-CxccCFGQ.js} +1 -1
- package/admin/assets/{MediaPage-C84p9d1U.js → MediaPage-QvMaH2YJ.js} +1 -1
- package/admin/assets/{Pagination-CuHwUPHi.js → Pagination-Df9nQ7Z0.js} +1 -1
- package/admin/assets/{RelationshipPicker-Dv7GaLcU.js → RelationshipPicker-B3Ftmqxp.js} +1 -1
- package/admin/assets/{SiteSettingsPage-nBT7NzkA.js → SiteSettingsPage-6NvH7CiQ.js} +1 -1
- package/admin/assets/{SiteUserEditPage-DroUTii9.js → SiteUserEditPage-D5VaQ1Xq.js} +1 -1
- package/admin/assets/{SiteUsersPage-iVXPCBPe.js → SiteUsersPage-BYVduiqs.js} +1 -1
- package/admin/assets/{SitesPage-BefZeWuJ.js → SitesPage-rfWWE0yK.js} +1 -1
- package/admin/assets/{SubmissionDetailPage-ktmzzOE1.js → SubmissionDetailPage-BSUR685F.js} +1 -1
- package/admin/assets/{SubmissionEditPage-C-ykTI2t.js → SubmissionEditPage-DjLXHjWU.js} +1 -1
- package/admin/assets/{SubmissionListPage-DA-8deUy.js → SubmissionListPage-DBxNEvde.js} +1 -1
- package/admin/assets/{TagInput-d-Hw1fkL.js → TagInput-57c4DG1w.js} +1 -1
- package/admin/assets/{TagsPage-BZzDvcKa.js → TagsPage-BEO5AwCv.js} +1 -1
- package/admin/assets/{UsersPage-CnQAOOGF.js → UsersPage-BpIRorJ1.js} +1 -1
- package/admin/assets/{WebhookEditPage-KeS8hmdW.js → WebhookEditPage-D5xgi56h.js} +1 -1
- package/admin/assets/{WebhooksPage-CASjmlPN.js → WebhooksPage-BY7AaiGr.js} +1 -1
- package/admin/assets/{card-CZTHR2Qa.js → card-C9hfyHXf.js} +1 -1
- package/admin/assets/{checkbox-DEgzM8H9.js → checkbox-DVJcwUt1.js} +1 -1
- package/admin/assets/{command-CdzYw11U.js → command-Bfmj0MEL.js} +1 -1
- package/admin/assets/index-BB9Syqw2.css +1 -0
- package/admin/assets/{index-BA3y7HJs.js → index-Ce5pmRMj.js} +2 -2
- package/admin/assets/media-url-DdCoIedP.js +1 -0
- package/admin/assets/{popover-BFw_h3j6.js → popover-CzaQYEEP.js} +1 -1
- package/admin/assets/{select-dX9e6VDt.js → select-CrRhFGIi.js} +1 -1
- package/admin/assets/serializeToText-2VrsuRUh.js +2 -0
- package/admin/assets/{table-Dk7eeOt2.js → table-_3bMY0_z.js} +1 -1
- package/admin/assets/{textarea-CpDSUg2s.js → textarea-6fq0R6VV.js} +1 -1
- package/admin/assets/{useAdminResolver-Bljb4XGQ.js → useAdminResolver-BJNPz3OG.js} +1 -1
- package/admin/assets/{useContent-CW0tm0FY.js → useContent-Bs7nel7C.js} +1 -1
- package/admin/assets/{useContentSearch-_bwacEth.js → useContentSearch-B3aTjuCu.js} +1 -1
- package/admin/assets/{useMedia-Cu5N4rY8.js → useMedia-ae3s_ajC.js} +1 -1
- package/admin/assets/{usePageTitle-DYvuJQp6.js → usePageTitle-C1r1-C00.js} +1 -1
- package/admin/assets/{useSiteUsers-CKtC_8Jc.js → useSiteUsers-DIaqgNSp.js} +1 -1
- package/admin/assets/{useTags-ybsMbCst.js → useTags-B-HgMVwo.js} +1 -1
- package/admin/assets/{useWebhooks-BAB-3sLa.js → useWebhooks-BvZjUJkJ.js} +1 -1
- package/admin/favicon-16x16.png +0 -0
- package/admin/favicon-32x32.png +0 -0
- package/admin/icons/icon-180x180.png +0 -0
- package/admin/icons/icon-192x192.png +0 -0
- package/admin/icons/icon-512x512.png +0 -0
- package/admin/icons/maskable-icon-512x512.png +0 -0
- package/admin/index.html +2 -2
- package/admin/sw.js +1 -1
- package/dist/admin-site.d.ts +4 -2
- package/dist/admin-site.d.ts.map +1 -1
- package/dist/admin-site.js +3 -3
- package/dist/admin-site.js.map +1 -1
- package/dist/cdn-api.d.ts +25 -0
- package/dist/cdn-api.d.ts.map +1 -0
- package/dist/{cdn.js → cdn-api.js} +7 -139
- package/dist/cdn-api.js.map +1 -0
- package/dist/cdn-media.d.ts +26 -0
- package/dist/cdn-media.d.ts.map +1 -0
- package/dist/cdn-media.js +202 -0
- package/dist/cdn-media.js.map +1 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/lambda/api/bootstrap +0 -0
- package/lambda/image-lambda/node_modules/.package-lock.json +3 -3
- package/lambda/image-lambda/node_modules/semver/README.md +19 -4
- package/lambda/image-lambda/node_modules/semver/bin/semver.js +14 -10
- package/lambda/image-lambda/node_modules/semver/functions/truncate.js +48 -0
- package/lambda/image-lambda/node_modules/semver/index.js +2 -0
- package/lambda/image-lambda/node_modules/semver/internal/re.js +1 -1
- package/lambda/image-lambda/node_modules/semver/package.json +3 -3
- package/lambda/image-lambda/node_modules/semver/range.bnf +5 -4
- package/lambda/webhook-worker/bootstrap +0 -0
- package/package.json +1 -1
- package/src/admin-site.ts +7 -5
- package/src/{cdn.ts → cdn-api.ts} +8 -161
- package/src/cdn-media.ts +250 -0
- package/src/index.ts +34 -11
- package/admin/assets/CollectionEditPage-y8t0ZO89.js +0 -1
- package/admin/assets/ContentEditPage-WkSbCnnG.js +0 -1
- package/admin/assets/FieldRenderer-wE-mtqZB.js +0 -2
- package/admin/assets/index-c7UygSvP.css +0 -1
- package/admin/assets/media-url-DIg_vSyf.js +0 -1
- package/admin/assets/serializeToText-Zin3gYPm.js +0 -2
- package/dist/cdn.d.ts +0 -27
- package/dist/cdn.d.ts.map +0 -1
- package/dist/cdn.js.map +0 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media CDN Infrastructure
|
|
3
|
+
*
|
|
4
|
+
* CloudFront distribution for the public media surface — `/media/*` and
|
|
5
|
+
* `/img/*` only. No edge auth (`/media/*` is OAC-public, `/img/*` is HMAC
|
|
6
|
+
* signed at the Sharp Lambda). The default behavior targets the S3 origin
|
|
7
|
+
* with no rewrite, so unmatched paths return AccessDenied from S3 — defense
|
|
8
|
+
* in depth.
|
|
9
|
+
*/
|
|
10
|
+
export function createMediaCdn(name, args) {
|
|
11
|
+
const { image, contentBucket } = args;
|
|
12
|
+
// =========================================================================
|
|
13
|
+
// CloudFront Function: Media Rewrite
|
|
14
|
+
// =========================================================================
|
|
15
|
+
const mediaRewriteFunction = new aws.cloudfront.Function(`${name}MediaRewrite`, {
|
|
16
|
+
name: $interpolate `${$app.name}-${$app.stage}-media-rewrite`,
|
|
17
|
+
runtime: "cloudfront-js-2.0",
|
|
18
|
+
publish: true,
|
|
19
|
+
code: `
|
|
20
|
+
function handler(event) {
|
|
21
|
+
var request = event.request;
|
|
22
|
+
var uri = request.uri;
|
|
23
|
+
|
|
24
|
+
// Rewrite /media/{site}/{mediaId}/{file} → /sites/{site}/media/{mediaId}/{file}
|
|
25
|
+
var parts = uri.split('/');
|
|
26
|
+
// parts: ['', 'media', '{site}', '{mediaId}', '{file}']
|
|
27
|
+
if (parts.length >= 5 && parts[1] === 'media') {
|
|
28
|
+
var site = parts[2];
|
|
29
|
+
var mediaId = parts[3];
|
|
30
|
+
var rest = parts.slice(4).join('/');
|
|
31
|
+
request.uri = '/sites/' + site + '/media/' + mediaId + '/' + rest;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return request;
|
|
35
|
+
}
|
|
36
|
+
`,
|
|
37
|
+
});
|
|
38
|
+
// =========================================================================
|
|
39
|
+
// Cache Policies
|
|
40
|
+
// =========================================================================
|
|
41
|
+
const imageCachePolicy = new aws.cloudfront.CachePolicy(`${name}ImageCachePolicy`, {
|
|
42
|
+
name: $interpolate `${$app.name}-${$app.stage}-image-cache`,
|
|
43
|
+
comment: "Cache policy for transformed images (immutable)",
|
|
44
|
+
defaultTtl: 31536000,
|
|
45
|
+
maxTtl: 31536000,
|
|
46
|
+
minTtl: 31536000,
|
|
47
|
+
parametersInCacheKeyAndForwardedToOrigin: {
|
|
48
|
+
cookiesConfig: { cookieBehavior: "none" },
|
|
49
|
+
headersConfig: { headerBehavior: "none" },
|
|
50
|
+
queryStringsConfig: {
|
|
51
|
+
queryStringBehavior: "whitelist",
|
|
52
|
+
queryStrings: {
|
|
53
|
+
items: ["w", "h", "fit", "format", "q", "sig"],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
enableAcceptEncodingBrotli: true,
|
|
57
|
+
enableAcceptEncodingGzip: true,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const mediaCachePolicy = new aws.cloudfront.CachePolicy(`${name}MediaCachePolicy`, {
|
|
61
|
+
name: $interpolate `${$app.name}-${$app.stage}-media-cache`,
|
|
62
|
+
comment: "Cache policy for original media files (immutable)",
|
|
63
|
+
defaultTtl: 31536000,
|
|
64
|
+
maxTtl: 31536000,
|
|
65
|
+
minTtl: 31536000,
|
|
66
|
+
parametersInCacheKeyAndForwardedToOrigin: {
|
|
67
|
+
cookiesConfig: { cookieBehavior: "none" },
|
|
68
|
+
headersConfig: { headerBehavior: "none" },
|
|
69
|
+
queryStringsConfig: { queryStringBehavior: "none" },
|
|
70
|
+
enableAcceptEncodingBrotli: true,
|
|
71
|
+
enableAcceptEncodingGzip: true,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
// =========================================================================
|
|
75
|
+
// Origin Access Controls (OAC)
|
|
76
|
+
// =========================================================================
|
|
77
|
+
const mediaOAC = new aws.cloudfront.OriginAccessControl(`${name}MediaOAC`, {
|
|
78
|
+
name: $interpolate `${$app.name}-${$app.stage}-media-oac`,
|
|
79
|
+
description: "OAC for S3 media origin",
|
|
80
|
+
originAccessControlOriginType: "s3",
|
|
81
|
+
signingBehavior: "always",
|
|
82
|
+
signingProtocol: "sigv4",
|
|
83
|
+
});
|
|
84
|
+
const imageOAC = new aws.cloudfront.OriginAccessControl(`${name}ImageOAC`, {
|
|
85
|
+
name: $interpolate `${$app.name}-${$app.stage}-image-oac`,
|
|
86
|
+
description: "OAC for image transform Lambda origin",
|
|
87
|
+
originAccessControlOriginType: "lambda",
|
|
88
|
+
signingBehavior: "always",
|
|
89
|
+
signingProtocol: "sigv4",
|
|
90
|
+
});
|
|
91
|
+
// =========================================================================
|
|
92
|
+
// CloudFront Distribution
|
|
93
|
+
// =========================================================================
|
|
94
|
+
const imageLambdaDomain = image.imageLambda.url.apply((url) => {
|
|
95
|
+
const parsed = new URL(url);
|
|
96
|
+
return parsed.hostname;
|
|
97
|
+
});
|
|
98
|
+
const s3RegionalDomain = $interpolate `${contentBucket.name}.s3.${aws.getRegionOutput().name}.amazonaws.com`;
|
|
99
|
+
const priceClass = args.priceClass ?? "PriceClass_100";
|
|
100
|
+
// Build aliases and certificate config for custom domain
|
|
101
|
+
const aliases = args.domain ? [args.domain.name] : undefined;
|
|
102
|
+
const viewerCertificate = args.domain
|
|
103
|
+
? {
|
|
104
|
+
acmCertificateArn: args.domain.certificateArn,
|
|
105
|
+
sslSupportMethod: "sni-only",
|
|
106
|
+
minimumProtocolVersion: "TLSv1.2_2021",
|
|
107
|
+
}
|
|
108
|
+
: {
|
|
109
|
+
cloudfrontDefaultCertificate: true,
|
|
110
|
+
};
|
|
111
|
+
// Fresh resource ID `${name}MediaDistribution` (parallel to
|
|
112
|
+
// `${name}ApiDistribution` in cdn-api.ts) — same blue/green rationale.
|
|
113
|
+
const distribution = new aws.cloudfront.Distribution(`${name}MediaDistribution`, {
|
|
114
|
+
enabled: true,
|
|
115
|
+
comment: $interpolate `Headroom CMS Media - ${$app.stage}`,
|
|
116
|
+
httpVersion: "http2and3",
|
|
117
|
+
priceClass,
|
|
118
|
+
aliases,
|
|
119
|
+
origins: [
|
|
120
|
+
{
|
|
121
|
+
originId: "media-s3",
|
|
122
|
+
domainName: s3RegionalDomain,
|
|
123
|
+
originAccessControlId: mediaOAC.id,
|
|
124
|
+
s3OriginConfig: {
|
|
125
|
+
originAccessIdentity: "",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
originId: "image-lambda",
|
|
130
|
+
domainName: imageLambdaDomain,
|
|
131
|
+
originAccessControlId: imageOAC.id,
|
|
132
|
+
customOriginConfig: {
|
|
133
|
+
httpPort: 80,
|
|
134
|
+
httpsPort: 443,
|
|
135
|
+
originProtocolPolicy: "https-only",
|
|
136
|
+
originSslProtocols: ["TLSv1.2"],
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
// Default behavior: target media-s3 with mediaCachePolicy and NO
|
|
141
|
+
// viewer-request rewrite. Anything not under /media/* or /img/* hits
|
|
142
|
+
// S3 with the original URI and returns 403 AccessDenied — defense in
|
|
143
|
+
// depth so a typo can't accidentally rewrite to a real S3 key.
|
|
144
|
+
defaultCacheBehavior: {
|
|
145
|
+
targetOriginId: "media-s3",
|
|
146
|
+
viewerProtocolPolicy: "redirect-to-https",
|
|
147
|
+
allowedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
148
|
+
cachedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
149
|
+
compress: true,
|
|
150
|
+
cachePolicyId: mediaCachePolicy.id,
|
|
151
|
+
},
|
|
152
|
+
orderedCacheBehaviors: [
|
|
153
|
+
// Media originals: served directly from S3 via OAC. Explicit (not
|
|
154
|
+
// implicit-via-default) so the rewrite never runs on unrelated paths.
|
|
155
|
+
{
|
|
156
|
+
pathPattern: "/media/*",
|
|
157
|
+
targetOriginId: "media-s3",
|
|
158
|
+
viewerProtocolPolicy: "redirect-to-https",
|
|
159
|
+
allowedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
160
|
+
cachedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
161
|
+
compress: true,
|
|
162
|
+
cachePolicyId: mediaCachePolicy.id,
|
|
163
|
+
functionAssociations: [
|
|
164
|
+
{
|
|
165
|
+
eventType: "viewer-request",
|
|
166
|
+
functionArn: mediaRewriteFunction.arn,
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
// Image transforms: served via Sharp Lambda
|
|
171
|
+
{
|
|
172
|
+
pathPattern: "/img/*",
|
|
173
|
+
targetOriginId: "image-lambda",
|
|
174
|
+
viewerProtocolPolicy: "redirect-to-https",
|
|
175
|
+
allowedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
176
|
+
cachedMethods: ["GET", "HEAD", "OPTIONS"],
|
|
177
|
+
compress: true,
|
|
178
|
+
cachePolicyId: imageCachePolicy.id,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
restrictions: {
|
|
182
|
+
geoRestriction: { restrictionType: "none" },
|
|
183
|
+
},
|
|
184
|
+
viewerCertificate,
|
|
185
|
+
});
|
|
186
|
+
// Allow CloudFront to invoke the image Lambda via OAC.
|
|
187
|
+
// CRITICAL: sourceArn must reference the MEDIA distribution's ARN. Pointing
|
|
188
|
+
// it at the API CDN ARN would silently break image transforms in a way
|
|
189
|
+
// that's hard to spot from logs. (Single most-important consistency point
|
|
190
|
+
// per the design doc.)
|
|
191
|
+
new aws.lambda.Permission(`${name}ImageLambdaCFPermission`, {
|
|
192
|
+
action: "lambda:InvokeFunctionUrl",
|
|
193
|
+
function: image.imageLambda.name,
|
|
194
|
+
principal: "cloudfront.amazonaws.com",
|
|
195
|
+
sourceArn: distribution.arn,
|
|
196
|
+
});
|
|
197
|
+
const url = args.domain
|
|
198
|
+
? $interpolate `https://${args.domain.name}`
|
|
199
|
+
: $interpolate `https://${distribution.domainName}`;
|
|
200
|
+
return { distribution, url };
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=cdn-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn-media.js","sourceRoot":"","sources":["../src/cdn-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAkB;IAC7D,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAEtC,4EAA4E;IAC5E,qCAAqC;IACrC,4EAA4E;IAC5E,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CACtD,GAAG,IAAI,cAAc,EACrB;QACE,IAAI,EAAE,YAAY,CAAA,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,gBAAgB;QAC5D,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;;;;;;;;;;;;;;;;;GAiBT;KACE,CACF,CAAC;IAEF,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CACrD,GAAG,IAAI,kBAAkB,EACzB;QACE,IAAI,EAAE,YAAY,CAAA,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,cAAc;QAC1D,OAAO,EAAE,iDAAiD;QAC1D,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,wCAAwC,EAAE;YACxC,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;YACzC,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;YACzC,kBAAkB,EAAE;gBAClB,mBAAmB,EAAE,WAAW;gBAChC,YAAY,EAAE;oBACZ,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC;iBAC/C;aACF;YACD,0BAA0B,EAAE,IAAI;YAChC,wBAAwB,EAAE,IAAI;SAC/B;KACF,CACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CACrD,GAAG,IAAI,kBAAkB,EACzB;QACE,IAAI,EAAE,YAAY,CAAA,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,cAAc;QAC1D,OAAO,EAAE,mDAAmD;QAC5D,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,wCAAwC,EAAE;YACxC,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;YACzC,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;YACzC,kBAAkB,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE;YACnD,0BAA0B,EAAE,IAAI;YAChC,wBAAwB,EAAE,IAAI;SAC/B;KACF,CACF,CAAC;IAEF,4EAA4E;IAC5E,+BAA+B;IAC/B,4EAA4E;IAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,IAAI,UAAU,EAAE;QACzE,IAAI,EAAE,YAAY,CAAA,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,YAAY;QACxD,WAAW,EAAE,yBAAyB;QACtC,6BAA6B,EAAE,IAAI;QACnC,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,IAAI,UAAU,EAAE;QACzE,IAAI,EAAE,YAAY,CAAA,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,YAAY;QACxD,WAAW,EAAE,uCAAuC;QACpD,6BAA6B,EAAE,QAAQ;QACvC,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,OAAO;KACzB,CAAC,CAAC;IAEH,4EAA4E;IAC5E,0BAA0B;IAC1B,4EAA4E;IAE5E,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAW,EAAE,EAAE;QACpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,YAAY,CAAA,GAAG,aAAa,CAAC,IAAI,OAAO,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,gBAAgB,CAAC;IAE5G,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC;IAEvD,yDAAyD;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM;QACnC,CAAC,CAAC;YACE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC7C,gBAAgB,EAAE,UAAmB;YACrC,sBAAsB,EAAE,cAAuB;SAChD;QACH,CAAC,CAAC;YACE,4BAA4B,EAAE,IAAI;SACnC,CAAC;IAEN,4DAA4D;IAC5D,uEAAuE;IACvE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAClD,GAAG,IAAI,mBAAmB,EAC1B;QACE,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,CAAA,wBAAwB,IAAI,CAAC,KAAK,EAAE;QACzD,WAAW,EAAE,WAAW;QACxB,UAAU;QACV,OAAO;QAEP,OAAO,EAAE;YACP;gBACE,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,gBAAgB;gBAC5B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;gBAClC,cAAc,EAAE;oBACd,oBAAoB,EAAE,EAAE;iBACzB;aACF;YACD;gBACE,QAAQ,EAAE,cAAc;gBACxB,UAAU,EAAE,iBAAiB;gBAC7B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;gBAClC,kBAAkB,EAAE;oBAClB,QAAQ,EAAE,EAAE;oBACZ,SAAS,EAAE,GAAG;oBACd,oBAAoB,EAAE,YAAY;oBAClC,kBAAkB,EAAE,CAAC,SAAS,CAAC;iBAChC;aACF;SACF;QAED,iEAAiE;QACjE,qEAAqE;QACrE,qEAAqE;QACrE,+DAA+D;QAC/D,oBAAoB,EAAE;YACpB,cAAc,EAAE,UAAU;YAC1B,oBAAoB,EAAE,mBAAmB;YACzC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;YAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;YACzC,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,gBAAgB,CAAC,EAAE;SACnC;QAED,qBAAqB,EAAE;YACrB,kEAAkE;YAClE,sEAAsE;YACtE;gBACE,WAAW,EAAE,UAAU;gBACvB,cAAc,EAAE,UAAU;gBAC1B,oBAAoB,EAAE,mBAAmB;gBACzC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;gBAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;gBACzC,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,gBAAgB,CAAC,EAAE;gBAClC,oBAAoB,EAAE;oBACpB;wBACE,SAAS,EAAE,gBAAgB;wBAC3B,WAAW,EAAE,oBAAoB,CAAC,GAAG;qBACtC;iBACF;aACF;YACD,4CAA4C;YAC5C;gBACE,WAAW,EAAE,QAAQ;gBACrB,cAAc,EAAE,cAAc;gBAC9B,oBAAoB,EAAE,mBAAmB;gBACzC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;gBAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;gBACzC,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,gBAAgB,CAAC,EAAE;aACnC;SACF;QAED,YAAY,EAAE;YACZ,cAAc,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE;SAC5C;QAED,iBAAiB;KAClB,CACF,CAAC;IAEF,uDAAuD;IACvD,4EAA4E;IAC5E,uEAAuE;IACvE,0EAA0E;IAC1E,uBAAuB;IACvB,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,yBAAyB,EAAE;QAC1D,MAAM,EAAE,0BAA0B;QAClC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI;QAChC,SAAS,EAAE,0BAA0B;QACrC,SAAS,EAAE,YAAY,CAAC,GAAG;KAC5B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;QACrB,CAAC,CAAC,YAAY,CAAA,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAC3C,CAAC,CAAC,YAAY,CAAA,WAAW,YAAY,CAAC,UAAU,EAAE,CAAC;IAErD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,8 @@ export type { AuthResources } from "./auth.js";
|
|
|
9
9
|
export type { WebhookResources } from "./webhooks.js";
|
|
10
10
|
export type { ImageResources } from "./image.js";
|
|
11
11
|
export type { ApiResources } from "./api.js";
|
|
12
|
-
export type {
|
|
12
|
+
export type { ApiCdnResources } from "./cdn-api.js";
|
|
13
|
+
export type { MediaCdnResources } from "./cdn-media.js";
|
|
13
14
|
export type { SchedulerResources } from "./scheduler.js";
|
|
14
15
|
export type { CollaborationResources } from "./collaboration.js";
|
|
15
16
|
export type { AdminSiteResources } from "./admin-site.js";
|
|
@@ -21,7 +22,7 @@ export interface HeadroomCMSArgs {
|
|
|
21
22
|
*/
|
|
22
23
|
senderEmail: string;
|
|
23
24
|
/**
|
|
24
|
-
* Custom domain for the CDN (
|
|
25
|
+
* Custom domain for the API CDN (`/v1/*` and `/health`).
|
|
25
26
|
* If not provided, uses the default CloudFront domain.
|
|
26
27
|
*/
|
|
27
28
|
domain?: {
|
|
@@ -29,6 +30,16 @@ export interface HeadroomCMSArgs {
|
|
|
29
30
|
/** ACM certificate ARN (must be in us-east-1 for CloudFront) */
|
|
30
31
|
certificateArn: string;
|
|
31
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Custom domain for the media CDN (S3 + image-Lambda origin, serves
|
|
35
|
+
* `/media/*` and `/img/*`). If not provided, uses the default CloudFront
|
|
36
|
+
* domain. The certificate must be in us-east-1, same as `domain`.
|
|
37
|
+
*/
|
|
38
|
+
mediaDomain?: {
|
|
39
|
+
name: string;
|
|
40
|
+
/** ACM certificate ARN (must be in us-east-1 for CloudFront) */
|
|
41
|
+
certificateArn: string;
|
|
42
|
+
};
|
|
32
43
|
/**
|
|
33
44
|
* Custom domain for the admin UI.
|
|
34
45
|
* If not provided, uses the default CloudFront domain.
|
|
@@ -89,7 +100,8 @@ export interface HeadroomCMSArgs {
|
|
|
89
100
|
}
|
|
90
101
|
export declare class HeadroomCMS {
|
|
91
102
|
readonly apiUrl: $util.Output<string>;
|
|
92
|
-
readonly
|
|
103
|
+
readonly apiCdnUrl: $util.Output<string>;
|
|
104
|
+
readonly mediaCdnUrl: $util.Output<string>;
|
|
93
105
|
readonly adminUrl: $util.Output<string>;
|
|
94
106
|
readonly userPoolId: $util.Output<string>;
|
|
95
107
|
readonly userPoolClientId: $util.Output<string>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,8 @@ import { createAuth } from "./auth.js";
|
|
|
11
11
|
import { createWebhooks } from "./webhooks.js";
|
|
12
12
|
import { createImage } from "./image.js";
|
|
13
13
|
import { createApi } from "./api.js";
|
|
14
|
-
import {
|
|
14
|
+
import { createApiCdn } from "./cdn-api.js";
|
|
15
|
+
import { createMediaCdn } from "./cdn-media.js";
|
|
15
16
|
import { createScheduler } from "./scheduler.js";
|
|
16
17
|
import { createCollabTable, createCollabHandler } from "./collaboration.js";
|
|
17
18
|
import { createAdminSite } from "./admin-site.js";
|
|
@@ -41,7 +42,8 @@ function resolvePkgRoot() {
|
|
|
41
42
|
}
|
|
42
43
|
export class HeadroomCMS {
|
|
43
44
|
apiUrl;
|
|
44
|
-
|
|
45
|
+
apiCdnUrl;
|
|
46
|
+
mediaCdnUrl;
|
|
45
47
|
adminUrl;
|
|
46
48
|
userPoolId;
|
|
47
49
|
userPoolClientId;
|
|
@@ -117,20 +119,26 @@ export class HeadroomCMS {
|
|
|
117
119
|
? { handler: args.dev.schedulerHandler }
|
|
118
120
|
: undefined,
|
|
119
121
|
});
|
|
120
|
-
//
|
|
121
|
-
const
|
|
122
|
+
// 8a. API CDN (CloudFront distribution + edge auth, /v1/* and /health)
|
|
123
|
+
const apiCdn = createApiCdn(name, {
|
|
122
124
|
api,
|
|
123
|
-
image,
|
|
124
|
-
contentBucket: storage.contentBucket,
|
|
125
125
|
kvs: storage.kvs,
|
|
126
126
|
priceClass: args.priceClass,
|
|
127
127
|
apiCacheTtl: args.apiCacheTtl,
|
|
128
128
|
domain: args.domain,
|
|
129
129
|
});
|
|
130
|
+
// 8b. Media CDN (CloudFront distribution, /media/* and /img/* only)
|
|
131
|
+
const mediaCdn = createMediaCdn(name, {
|
|
132
|
+
image,
|
|
133
|
+
contentBucket: storage.contentBucket,
|
|
134
|
+
priceClass: args.priceClass,
|
|
135
|
+
domain: args.mediaDomain,
|
|
136
|
+
});
|
|
130
137
|
// 9. Admin UI (static site)
|
|
131
138
|
const admin = createAdminSite(name, {
|
|
132
139
|
api,
|
|
133
|
-
|
|
140
|
+
apiCdn,
|
|
141
|
+
mediaCdn,
|
|
134
142
|
auth,
|
|
135
143
|
collab,
|
|
136
144
|
pkgRoot,
|
|
@@ -142,14 +150,16 @@ export class HeadroomCMS {
|
|
|
142
150
|
});
|
|
143
151
|
// Expose outputs
|
|
144
152
|
this.apiUrl = api.api.url;
|
|
145
|
-
this.
|
|
153
|
+
this.apiCdnUrl = apiCdn.url;
|
|
154
|
+
this.mediaCdnUrl = mediaCdn.url;
|
|
146
155
|
this.adminUrl = admin.url;
|
|
147
156
|
this.userPoolId = auth.userPool.id;
|
|
148
157
|
this.userPoolClientId = auth.userPoolClient.id;
|
|
149
158
|
this.collabWsUrl = collab.wsUrl;
|
|
150
159
|
this.outputs = {
|
|
151
160
|
api: api.api.url,
|
|
152
|
-
|
|
161
|
+
apiCdn: apiCdn.url,
|
|
162
|
+
mediaCdn: mediaCdn.url,
|
|
153
163
|
admin: admin.url,
|
|
154
164
|
userPoolId: auth.userPool.id,
|
|
155
165
|
userPoolClientId: auth.userPoolClient.id,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lambda/api/bootstrap
CHANGED
|
Binary file
|
|
@@ -97,9 +97,9 @@
|
|
|
97
97
|
"license": "MIT"
|
|
98
98
|
},
|
|
99
99
|
"node_modules/semver": {
|
|
100
|
-
"version": "7.
|
|
101
|
-
"resolved": "https://registry.npmjs.org/semver/-/semver-7.
|
|
102
|
-
"integrity": "sha512-
|
|
100
|
+
"version": "7.8.0",
|
|
101
|
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
|
|
102
|
+
"integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
|
|
103
103
|
"license": "ISC",
|
|
104
104
|
"bin": {
|
|
105
105
|
"semver": "bin/semver.js"
|
|
@@ -56,6 +56,7 @@ const semverCompareLoose = require('semver/functions/compare-loose')
|
|
|
56
56
|
const semverCompareBuild = require('semver/functions/compare-build')
|
|
57
57
|
const semverSort = require('semver/functions/sort')
|
|
58
58
|
const semverRsort = require('semver/functions/rsort')
|
|
59
|
+
const semverTruncate = require('semver/functions/truncate')
|
|
59
60
|
|
|
60
61
|
// low-level comparators between versions
|
|
61
62
|
const semverGt = require('semver/functions/gt')
|
|
@@ -399,12 +400,19 @@ nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
|
|
399
400
|
tilde ::= '~' partial
|
|
400
401
|
caret ::= '^' partial
|
|
401
402
|
qualifier ::= ( '-' pre )? ( '+' build )?
|
|
402
|
-
pre ::=
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
403
|
+
pre ::= prepart ( '.' prepart ) *
|
|
404
|
+
prepart ::= nr | alphanumid
|
|
405
|
+
build ::= buildid ( '.' buildid ) *
|
|
406
|
+
alphanumid ::= ( ['0'-'9'] ) * [-A-Za-z] [-0-9A-Za-z] *
|
|
407
|
+
buildid ::= [-0-9A-Za-z]+
|
|
406
408
|
```
|
|
407
409
|
|
|
410
|
+
Note: Prerelease identifiers (`pre`) use `nr` for numeric parts, which
|
|
411
|
+
disallows leading zeros (e.g., `1.2.3-00` is invalid). Build metadata
|
|
412
|
+
identifiers (`build`) allow any alphanumeric string including leading
|
|
413
|
+
zeros (e.g., `1.2.3+00` is valid). This matches the
|
|
414
|
+
[SemVer 2.0.0 specification](https://semver.org/#spec-item-9).
|
|
415
|
+
|
|
408
416
|
## Functions
|
|
409
417
|
|
|
410
418
|
All methods and classes take a final `options` object argument. All
|
|
@@ -449,6 +457,12 @@ strings that they parse.
|
|
|
449
457
|
or comparators intersect.
|
|
450
458
|
* `parse(v)`: Attempt to parse a string as a semantic version, returning either
|
|
451
459
|
a `SemVer` object or `null`.
|
|
460
|
+
* `truncate(v, releaseType)`: Return the version with components _lower_
|
|
461
|
+
than `releaseType` dropped off, e.g.:
|
|
462
|
+
* `major` removes build & prerelease info and sets minor & patch to 0.
|
|
463
|
+
* `minor` removes build & prerelease info, and sets patch to 0
|
|
464
|
+
* `patch` removes build & prerelease info
|
|
465
|
+
* All prerelease types remove build info only
|
|
452
466
|
|
|
453
467
|
### Comparison
|
|
454
468
|
|
|
@@ -650,6 +664,7 @@ The following modules are available:
|
|
|
650
664
|
* `require('semver/functions/rsort')`
|
|
651
665
|
* `require('semver/functions/satisfies')`
|
|
652
666
|
* `require('semver/functions/sort')`
|
|
667
|
+
* `require('semver/functions/truncate')`
|
|
653
668
|
* `require('semver/functions/valid')`
|
|
654
669
|
* `require('semver/ranges/gtr')`
|
|
655
670
|
* `require('semver/ranges/intersects')`
|
|
@@ -46,6 +46,7 @@ const main = () => {
|
|
|
46
46
|
a = a.slice(0, indexOfEqualSign)
|
|
47
47
|
argv.unshift(value)
|
|
48
48
|
}
|
|
49
|
+
|
|
49
50
|
switch (a) {
|
|
50
51
|
case '-rv': case '-rev': case '--rev': case '--reverse':
|
|
51
52
|
reverse = true
|
|
@@ -60,15 +61,10 @@ const main = () => {
|
|
|
60
61
|
versions.push(argv.shift())
|
|
61
62
|
break
|
|
62
63
|
case '-i': case '--inc': case '--increment':
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
inc = argv.shift()
|
|
68
|
-
break
|
|
69
|
-
default:
|
|
70
|
-
inc = 'patch'
|
|
71
|
-
break
|
|
64
|
+
if (semver.RELEASE_TYPES.includes(argv[0]) || (argv[0] === 'release')) {
|
|
65
|
+
inc = { value: argv.shift(), maybeErrantValue: null, option: a }
|
|
66
|
+
} else {
|
|
67
|
+
inc = { value: 'patch', maybeErrantValue: argv[0], option: a }
|
|
72
68
|
}
|
|
73
69
|
break
|
|
74
70
|
case '--preid':
|
|
@@ -102,6 +98,14 @@ const main = () => {
|
|
|
102
98
|
|
|
103
99
|
options = parseOptions({ loose, includePrerelease, rtl })
|
|
104
100
|
|
|
101
|
+
if (
|
|
102
|
+
inc &&
|
|
103
|
+
versions.includes(inc.maybeErrantValue) &&
|
|
104
|
+
!semver.valid(inc.maybeErrantValue, options)
|
|
105
|
+
) {
|
|
106
|
+
console.warn(`Invalid value for ${inc.option}; defaulting to 'patch'. This may become a failure in future major versions.`)
|
|
107
|
+
}
|
|
108
|
+
|
|
105
109
|
versions = versions.map((v) => {
|
|
106
110
|
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
|
107
111
|
}).filter((v) => {
|
|
@@ -125,7 +129,7 @@ const main = () => {
|
|
|
125
129
|
versions
|
|
126
130
|
.sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options))
|
|
127
131
|
.map(v => semver.clean(v, options))
|
|
128
|
-
.map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v)
|
|
132
|
+
.map(v => inc ? semver.inc(v, inc.value, options, identifier, identifierBase) : v)
|
|
129
133
|
.forEach(v => console.log(v))
|
|
130
134
|
}
|
|
131
135
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const parse = require('./parse')
|
|
4
|
+
const constants = require('../internal/constants')
|
|
5
|
+
const SemVer = require('../classes/semver')
|
|
6
|
+
|
|
7
|
+
const truncate = (version, truncation, options) => {
|
|
8
|
+
if (!constants.RELEASE_TYPES.includes(truncation)) {
|
|
9
|
+
return null
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const clonedVersion = cloneInputVersion(version, options)
|
|
13
|
+
return clonedVersion && doTruncation(clonedVersion, truncation)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const cloneInputVersion = (version, options) => {
|
|
17
|
+
const versionStringToParse = (
|
|
18
|
+
version instanceof SemVer ? version.version : version
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
return parse(versionStringToParse, options)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const doTruncation = (version, truncation) => {
|
|
25
|
+
if (isPrerelease(truncation)) {
|
|
26
|
+
return version.version
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
version.prerelease = []
|
|
30
|
+
|
|
31
|
+
switch (truncation) {
|
|
32
|
+
case 'major':
|
|
33
|
+
version.minor = 0
|
|
34
|
+
version.patch = 0
|
|
35
|
+
break
|
|
36
|
+
case 'minor':
|
|
37
|
+
version.patch = 0
|
|
38
|
+
break
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return version.format()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const isPrerelease = (type) => {
|
|
45
|
+
return type.startsWith('pre')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = truncate
|
|
@@ -28,6 +28,7 @@ const gte = require('./functions/gte')
|
|
|
28
28
|
const lte = require('./functions/lte')
|
|
29
29
|
const cmp = require('./functions/cmp')
|
|
30
30
|
const coerce = require('./functions/coerce')
|
|
31
|
+
const truncate = require('./functions/truncate')
|
|
31
32
|
const Comparator = require('./classes/comparator')
|
|
32
33
|
const Range = require('./classes/range')
|
|
33
34
|
const satisfies = require('./functions/satisfies')
|
|
@@ -66,6 +67,7 @@ module.exports = {
|
|
|
66
67
|
lte,
|
|
67
68
|
cmp,
|
|
68
69
|
coerce,
|
|
70
|
+
truncate,
|
|
69
71
|
Comparator,
|
|
70
72
|
Range,
|
|
71
73
|
satisfies,
|
|
@@ -136,7 +136,7 @@ createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
|
|
|
136
136
|
createToken('GTLT', '((?:<|>)?=?)')
|
|
137
137
|
|
|
138
138
|
// Something like "2.*" or "1.2.x".
|
|
139
|
-
// Note that "x.x" is a valid xRange
|
|
139
|
+
// Note that "x.x" is a valid xRange identifier, meaning "any version"
|
|
140
140
|
// Only the first item is strictly required.
|
|
141
141
|
createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
|
|
142
142
|
createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semver",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.8.0",
|
|
4
4
|
"description": "The semantic version parser used by npm.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@npmcli/eslint-config": "^6.0.0",
|
|
18
|
-
"@npmcli/template-oss": "
|
|
18
|
+
"@npmcli/template-oss": "5.0.0",
|
|
19
19
|
"benchmark": "^2.1.4",
|
|
20
20
|
"tap": "^16.0.0"
|
|
21
21
|
},
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"author": "GitHub Inc.",
|
|
53
53
|
"templateOSS": {
|
|
54
54
|
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
|
|
55
|
-
"version": "
|
|
55
|
+
"version": "5.0.0",
|
|
56
56
|
"engines": ">=10",
|
|
57
57
|
"distPaths": [
|
|
58
58
|
"classes/",
|
|
@@ -10,7 +10,8 @@ nr ::= '0' | [1-9] ( [0-9] ) *
|
|
|
10
10
|
tilde ::= '~' partial
|
|
11
11
|
caret ::= '^' partial
|
|
12
12
|
qualifier ::= ( '-' pre )? ( '+' build )?
|
|
13
|
-
pre ::=
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
pre ::= prepart ( '.' prepart ) *
|
|
14
|
+
prepart ::= nr | alphanumid
|
|
15
|
+
build ::= buildid ( '.' buildid ) *
|
|
16
|
+
alphanumid ::= ( [0-9] ) * [A-Za-z-] [-0-9A-Za-z] *
|
|
17
|
+
buildid ::= [-0-9A-Za-z]+
|
|
Binary file
|