@ez4/aws-bucket 0.37.0 → 0.39.0
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/dist/bucket/function/types.d.ts +3 -3
- package/dist/main.cjs +151 -146
- package/dist/main.mjs +148 -143
- package/dist/triggers/defaults.d.ts +11 -3
- package/lib/event.ts +13 -4
- package/package.json +12 -11
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { ContextSource, LinkedVariables } from '@ez4/project/library';
|
|
2
|
+
import type { FunctionParameters } from '@ez4/aws-function';
|
|
3
3
|
export type BucketEventFunction = {
|
|
4
4
|
functionName: string;
|
|
5
5
|
sourceFile: string;
|
|
@@ -12,6 +12,6 @@ export type BucketEventFunctionParameters = Omit<FunctionParameters, 'getFunctio
|
|
|
12
12
|
handler: BucketEventEntryPoint;
|
|
13
13
|
listener?: BucketEventFunction;
|
|
14
14
|
context?: Record<string, ContextSource>;
|
|
15
|
-
variables: (
|
|
15
|
+
variables: (LinkedVariables | undefined)[];
|
|
16
16
|
debug?: boolean;
|
|
17
17
|
};
|
package/dist/main.cjs
CHANGED
|
@@ -1,162 +1,167 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof e=="object"||typeof e=="function")for(let
|
|
3
|
-
|
|
4
|
-
enumerable:!0}):r,t)),
|
|
5
|
-
ObjectServiceType:()=>g,PolicyServiceName:()=>
|
|
6
|
-
createBucket:()=>
|
|
7
|
-
createBucketStateId:()=>
|
|
8
|
-
getBucketObjectPath:()=>
|
|
9
|
-
isBucketObjectState:()=>
|
|
10
|
-
module.exports=
|
|
11
|
-
|
|
1
|
+
"use strict";var Tt=Object.create;var h=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var Dt=Object.getOwnPropertyNames;var zt=Object.getPrototypeOf,Ft=Object.prototype.hasOwnProperty;var o=(t,e)=>h(t,"name",{value:e,configurable:!0});var At=(t,e)=>{for(var r in e)h(t,r,{get:e[r],enumerable:!0})},ne=(t,e,r,n)=>{if(e&&
|
|
2
|
+
typeof e=="object"||typeof e=="function")for(let c of Dt(e))!Ft.call(t,c)&&c!==r&&
|
|
3
|
+
h(t,c,{get:()=>e[c],enumerable:!(n=Nt(e,c))||n.enumerable});return t};var It=(t,e,r)=>(r=t!=null?Tt(zt(t)):{},ne(e||!t||!t.__esModule?h(r,"default",{value:t,
|
|
4
|
+
enumerable:!0}):r,t)),Lt=t=>ne(h({},"__esModule",{value:!0}),t);var pr={};At(pr,{BucketServiceName:()=>m,BucketServiceType:()=>y,ObjectServiceName:()=>k,
|
|
5
|
+
ObjectServiceType:()=>g,PolicyServiceName:()=>x,PolicyServiceType:()=>d,buildBucketArn:()=>J,
|
|
6
|
+
createBucket:()=>X,createBucketEventFunction:()=>Y,createBucketObject:()=>ir,createBucketPolicy:()=>sr,
|
|
7
|
+
createBucketStateId:()=>U,getBucketDomain:()=>cr,getBucketName:()=>j,getBucketObjectFiles:()=>Jt,
|
|
8
|
+
getBucketObjectPath:()=>O,getBucketState:()=>G,getPolicyDocument:()=>Q,isBucketDomain:()=>nr,
|
|
9
|
+
isBucketObjectState:()=>Zt,isBucketPolicyState:()=>ar,isBucketState:()=>ve,registerTriggers:()=>or});
|
|
10
|
+
module.exports=Lt(pr);var St=require("@ez4/aws-common"),kt=require("@ez4/aws-identity"),bt=require("@ez4/aws-function"),
|
|
11
|
+
xt=require("@ez4/storage/library"),Pt=require("@ez4/project/library");var Pe=require("@ez4/aws-common");var fe=require("@ez4/aws-common"),K=require("@ez4/aws-function"),B=require("@ez4/utils");var u=require("@ez4/aws-common"),a=require("@aws-sdk/client-s3");var m="AWS:S3/Bucket",y="aws:s3.bucket";var f=new a.S3Client({}),ce=o(async t=>{u.Logger.logFetch(m,t);try{return!(await f.
|
|
12
12
|
send(new a.ListObjectsV2Command({Bucket:t,MaxKeys:1}))).Contents?.length}catch(e){
|
|
13
|
-
if(!(e instanceof a.NoSuchBucket))throw e;return 0}},"isBucketEmpty"),
|
|
14
|
-
let{bucketName:e}=t;return
|
|
15
|
-
{Bucket:e})),{bucketName:e}},"createBucket"),
|
|
13
|
+
if(!(e instanceof a.NoSuchBucket))throw e;return 0}},"isBucketEmpty"),se=o(async t=>{
|
|
14
|
+
let{bucketName:e}=t;return u.Logger.logCreate(m,e),await f.send(new a.CreateBucketCommand(
|
|
15
|
+
{Bucket:e})),{bucketName:e}},"createBucket"),ae=o(async t=>{u.Logger.logDelete(m,
|
|
16
16
|
t);try{return await f.send(new a.DeleteBucketCommand({Bucket:t})),!0}catch(e){if(!(e instanceof
|
|
17
|
-
a.NoSuchBucket))throw e;return!1}},"deleteBucket"),
|
|
18
|
-
|
|
19
|
-
{...e,ManagedBy:"EZ4"})}}))},"tagBucket"),
|
|
17
|
+
a.NoSuchBucket))throw e;return!1}},"deleteBucket"),ie=o(async(t,e)=>{u.Logger.logTag(
|
|
18
|
+
m,t),await f.send(new a.PutBucketTaggingCommand({Bucket:t,Tagging:{TagSet:(0,u.getTagList)(
|
|
19
|
+
{...e,ManagedBy:"EZ4"})}}))},"tagBucket"),pe=o(async(t,e)=>{u.Logger.logUpdate(m,
|
|
20
20
|
`${t} CORS`),await f.send(new a.PutBucketCorsCommand({Bucket:t,CORSConfiguration:{
|
|
21
21
|
CORSRules:[{ID:"ID0",AllowedOrigins:e.allowOrigins,AllowedMethods:e.allowMethods,
|
|
22
22
|
AllowedHeaders:e.allowHeaders,ExposeHeaders:e.exposeHeaders,MaxAgeSeconds:e.maxAge}]}}))},
|
|
23
|
-
"updateCorsConfiguration"),
|
|
23
|
+
"updateCorsConfiguration"),me=o(async t=>{u.Logger.logDelete(m,`${t} CORS`);try{
|
|
24
24
|
return await f.send(new a.DeleteBucketCorsCommand({Bucket:t})),!0}catch(e){if(!(e instanceof
|
|
25
|
-
a.NoSuchBucket))throw e;return!1}},"deleteCorsConfiguration"),
|
|
26
|
-
|
|
25
|
+
a.NoSuchBucket))throw e;return!1}},"deleteCorsConfiguration"),ue=o(async(t,e)=>{
|
|
26
|
+
u.Logger.logCreate(m,`${t} lifecycle`),await f.send(new a.PutBucketLifecycleConfigurationCommand(
|
|
27
27
|
{Bucket:t,LifecycleConfiguration:{Rules:[{ID:"ID0",Status:a.ExpirationStatus.Enabled,
|
|
28
|
-
Filter:{Prefix:"*"},Expiration:{Days:e}}]}}))},"createLifecycle"),
|
|
29
|
-
|
|
28
|
+
Filter:{Prefix:"*"},Expiration:{Days:e}}]}}))},"createLifecycle"),le=o(async t=>{
|
|
29
|
+
u.Logger.logDelete(m,`${t} lifecycle`);try{return await f.send(new a.DeleteBucketLifecycleCommand(
|
|
30
30
|
{Bucket:t})),!0}catch(e){if(!(e instanceof a.NoSuchBucket))throw e;return!1}},"d\
|
|
31
|
-
eleteLifecycle"),
|
|
32
|
-
eventsPath:n,eventsType:
|
|
31
|
+
eleteLifecycle"),ye=o(async(t,e)=>{u.Logger.logUpdate(m,`${t} events`);let{functionArn:r,
|
|
32
|
+
eventsPath:n,eventsType:c}=e;await f.send(new a.PutBucketNotificationConfigurationCommand(
|
|
33
33
|
{Bucket:t,SkipDestinationValidation:!0,NotificationConfiguration:{...r&&{LambdaFunctionConfigurations:[
|
|
34
|
-
{Id:"ID0",LambdaFunctionArn:r,Events:
|
|
35
|
-
refix",Value:n}]}}}}]}}}))},"updateEventNotifications");var
|
|
36
|
-
getBucketHandler"),
|
|
37
|
-
"equalsResource"),
|
|
38
|
-
n={...e.parameters,dependencies:e.dependencies},
|
|
39
|
-
return{...
|
|
40
|
-
throw new
|
|
41
|
-
eResource"),
|
|
42
|
-
r);await
|
|
43
|
-
eventsPath,functionArn:n};return await
|
|
44
|
-
"createResource"),
|
|
45
|
-
let
|
|
46
|
-
c,
|
|
47
|
-
let
|
|
48
|
-
functionArn:
|
|
49
|
-
async t=>{let e=t.result;e&&await
|
|
50
|
-
eteResource"),
|
|
51
|
-
cors))){if(e.cors)return
|
|
52
|
-
s"),
|
|
53
|
-
return
|
|
54
|
-
eUpdates"),
|
|
55
|
-
n)},"checkTagUpdates"),
|
|
56
|
-
"s3:ObjectCreated:*","s3:ObjectRemoved:*"],...e})},"checkEventUpdates");var
|
|
57
|
-
`Bucket service ${e} wasn't found.`)}};var
|
|
58
|
-
type===y,"isBucketState"),
|
|
59
|
-
e);return n},"getBucketState"),
|
|
60
|
-
if(!n?.bucketName)throw new
|
|
61
|
-
bucketName},"getBucketName");var
|
|
62
|
-
logCreate(
|
|
63
|
-
stringify(r)})),{bucketName:e}},"createPolicy"),
|
|
64
|
-
|
|
65
|
-
if(!(e instanceof
|
|
66
|
-
getPolicyHandler"),
|
|
67
|
-
"equalsResource"),
|
|
68
|
-
n={...e.parameters,dependencies:e.dependencies},
|
|
69
|
-
getRole:!0}});if(
|
|
70
|
-
async(t,e,r)=>{if(e.result)throw new
|
|
71
|
-
return
|
|
72
|
-
olicy",e),
|
|
73
|
-
"createResource")
|
|
74
|
-
e&&await
|
|
75
|
-
|
|
76
|
-
bjectPath"),
|
|
77
|
-
lastModified,objectKey:n.objectKey})),"getBucketObjectFiles");var
|
|
78
|
-
logCreate(
|
|
79
|
-
{Bucket:t,Key:r,Body:(0,
|
|
80
|
-
"putObject"),
|
|
81
|
-
{Bucket:t,Key:e,Tagging:{TagSet:(0,
|
|
82
|
-
agObject"),
|
|
34
|
+
{Id:"ID0",LambdaFunctionArn:r,Events:c,...n&&{Filter:{Key:{FilterRules:[{Name:"p\
|
|
35
|
+
refix",Value:n}]}}}}]}}}))},"updateEventNotifications");var ge=o(()=>({equals:Mt,create:de,replace:$t,preview:qt,update:Ht,delete:Kt}),"\
|
|
36
|
+
getBucketHandler"),Mt=o((t,e)=>!!t.result&&t.result.bucketName===e.result?.bucketName,
|
|
37
|
+
"equalsResource"),qt=o((t,e)=>{let r={...t.parameters,dependencies:t.dependencies},
|
|
38
|
+
n={...e.parameters,dependencies:e.dependencies},c=(0,B.deepCompare)(r,n);if(c.counts)
|
|
39
|
+
return{...c,name:r.bucketName}},"previewResource"),$t=o(async(t,e,r)=>{if(e.result)
|
|
40
|
+
throw new fe.ReplaceResourceError(m,t.entryId,e.entryId);return de(t,r)},"replac\
|
|
41
|
+
eResource"),de=o(async(t,e)=>{let r=t.parameters,n=(0,K.tryGetFunctionArn)(e),{bucketName:c}=await se(
|
|
42
|
+
r);await Se(c,r,void 0),await ke(c,r,void 0),await be(c,r.tags,void 0);let s={eventsPath:r.
|
|
43
|
+
eventsPath,functionArn:n};return await xe(c,s,{}),{bucketName:c,functionArn:n}},
|
|
44
|
+
"createResource"),Ht=o(async(t,e,r)=>{let{result:n,parameters:c}=t;if(!n)return;
|
|
45
|
+
let s=n.bucketName,i=(0,K.tryGetFunctionArn)(r),p=e.result?.functionArn;await Se(
|
|
46
|
+
s,c,e.parameters),await ke(s,c,e.parameters),await be(s,c.tags,e.parameters.tags);
|
|
47
|
+
let b={eventsPath:c.eventsPath,functionArn:i},E={eventsPath:e.parameters.eventsPath,
|
|
48
|
+
functionArn:p};return await xe(s,b,E),{...n,functionArn:i}},"updateResource"),Kt=o(
|
|
49
|
+
async t=>{let e=t.result;e&&await ce(e.bucketName)&&await ae(e.bucketName)},"del\
|
|
50
|
+
eteResource"),Se=o(async(t,e,r)=>{if(!(e.cors&&r?.cors&&(0,B.deepEqual)(e.cors,r.
|
|
51
|
+
cors))){if(e.cors)return pe(t,e.cors);if(r?.cors)return me(t)}},"checkCorsUpdate\
|
|
52
|
+
s"),ke=o(async(t,e,r)=>{if(e.autoExpireDays!==r?.autoExpireDays){if(e.autoExpireDays)
|
|
53
|
+
return ue(t,e.autoExpireDays);if(r?.autoExpireDays)return le(t)}},"checkLifecycl\
|
|
54
|
+
eUpdates"),be=o(async(t,e,r)=>{let n=e??{};!(0,B.deepEqual)(n,r??{})&&await ie(t,
|
|
55
|
+
n)},"checkTagUpdates"),xe=o(async(t,e,r)=>{!(0,B.deepEqual)(e,r)&&await ye(t,{eventsType:[
|
|
56
|
+
"s3:ObjectCreated:*","s3:ObjectRemoved:*"],...e})},"checkEventUpdates");var Be=o(()=>{(0,Pe.tryRegisterProvider)(y,ge())},"registerBucketProvider");var Ne=require("@ez4/aws-common");var he=require("@ez4/aws-common"),je=require("@ez4/utils");var we=require("@ez4/aws-common"),z=require("@ez4/utils");var D=class extends Error{static{o(this,"BucketNotFoundError")}constructor(e){super(
|
|
57
|
+
`Bucket service ${e} wasn't found.`)}};var U=o(t=>(0,z.hashData)(y,(0,z.toKebabCase)(t)),"createBucketStateId"),ve=o(t=>t.
|
|
58
|
+
type===y,"isBucketState"),G=o((t,e,r)=>{let n=t.getServiceState(e,r);if(!ve(n))throw new D(
|
|
59
|
+
e);return n},"getBucketState"),j=o((t,e,r)=>{let n=r.getDependencies(y)[0]?.result;
|
|
60
|
+
if(!n?.bucketName)throw new we.IncompleteResourceError(t,e,"bucketName");return n.
|
|
61
|
+
bucketName},"getBucketName");var S=require("@aws-sdk/client-s3"),_=require("@ez4/aws-common");var x="AWS:S3/Policy",d="aws:s3.policy";var Re=new S.S3Client({}),Ee=o(async t=>{let{bucketName:e,role:r}=t;return _.Logger.
|
|
62
|
+
logCreate(x,e),await Re.send(new S.PutBucketPolicyCommand({Bucket:e,Policy:JSON.
|
|
63
|
+
stringify(r)})),{bucketName:e}},"createPolicy"),Ce=o(async t=>{_.Logger.logDelete(
|
|
64
|
+
x,t);try{return await Re.send(new S.DeleteBucketPolicyCommand({Bucket:t})),!0}catch(e){
|
|
65
|
+
if(!(e instanceof S.NoSuchBucket))throw e;return!1}},"deletePolicy");var Oe=o(()=>({equals:Ut,create:Te,replace:_t,preview:Gt,update:Vt,delete:Wt}),"\
|
|
66
|
+
getPolicyHandler"),Ut=o((t,e)=>!!t.result&&t.result.bucketName===e.result?.bucketName,
|
|
67
|
+
"equalsResource"),Gt=o((t,e)=>{let r={...t.parameters,dependencies:t.dependencies},
|
|
68
|
+
n={...e.parameters,dependencies:e.dependencies},c=(0,je.deepCompare)(r,n,{exclude:{
|
|
69
|
+
getRole:!0}});if(c.counts)return{...c,name:r.fromService}},"previewResource"),_t=o(
|
|
70
|
+
async(t,e,r)=>{if(e.result)throw new he.ReplaceResourceError(x,t.entryId,e.entryId);
|
|
71
|
+
return Te(t,r)},"replaceResource"),Te=o(async(t,e)=>{let r=t.parameters,n=j(x,"p\
|
|
72
|
+
olicy",e),c=await r.getRole(e);return await Ee({bucketName:n,role:c}),{bucketName:n}},
|
|
73
|
+
"createResource"),Vt=o(async()=>{},"updateResource"),Wt=o(async t=>{let e=t.result;
|
|
74
|
+
e&&await Ce(e.bucketName)},"deleteResource");var De=o(()=>{(0,Ne.tryRegisterProvider)(d,Oe())},"registerPolicyProvider");var Ke=require("@ez4/aws-common");var Le=require("node:fs/promises"),Me=require("@ez4/aws-common"),F=require("@ez4/utils");var ze=require("node:fs"),l=require("@aws-sdk/client-s3"),w=require("@ez4/aws-common"),
|
|
75
|
+
Fe=It(require("mime"),1);var k="AWS:S3/Object",g="aws:s3.object";var Zt=o(t=>t.type===g,"isBucketObjectState"),O=o((t,e)=>`${t}/${e}`,"getBucketO\
|
|
76
|
+
bjectPath"),Jt=o(t=>t.getDependencies(g).map(({result:r,parameters:n})=>({lastModified:r?.
|
|
77
|
+
lastModified,objectKey:n.objectKey})),"getBucketObjectFiles");var V=new l.S3Client({}),W=o(async(t,e)=>{let{objectKey:r,filePath:n}=e;w.Logger.
|
|
78
|
+
logCreate(k,O(t,r));let c=Fe.default.getType(n);return await V.send(new l.PutObjectCommand(
|
|
79
|
+
{Bucket:t,Key:r,Body:(0,ze.createReadStream)(n),...c&&{ContentType:c}})),{objectKey:r}},
|
|
80
|
+
"putObject"),Ae=o(async(t,e,r)=>{w.Logger.logTag(k,O(t,e)),await V.send(new l.PutObjectTaggingCommand(
|
|
81
|
+
{Bucket:t,Key:e,Tagging:{TagSet:(0,w.getTagList)({...r,ManagedBy:"EZ4"})}}))},"t\
|
|
82
|
+
agObject"),Ie=o(async(t,e)=>{w.Logger.logDelete(k,O(t,e));try{return await V.send(
|
|
83
83
|
new l.DeleteObjectCommand({Bucket:t,Key:e})),!0}catch(r){if(!(r instanceof l.NoSuchBucket))
|
|
84
|
-
throw r;return!1}},"deleteObject");var
|
|
85
|
-
getObjectHandler"),
|
|
86
|
-
"equalsResource"),
|
|
87
|
-
{...r,dependencies:t.dependencies,lastModified:await
|
|
88
|
-
dependencies,lastModified:t.result?.lastModified});if(
|
|
89
|
-
objectKey}},"previewResource"),
|
|
90
|
-
|
|
91
|
-
parameters,n=
|
|
92
|
-
n,
|
|
93
|
-
async(t,e)=>{let{result:r,parameters:n}=t;if(!r)return;let{objectKey:
|
|
94
|
-
i=
|
|
95
|
-
pdateResource"),
|
|
96
|
-
r.objectKey)},"deleteResource"),
|
|
97
|
-
getTime()},"getLastModifiedTime"),
|
|
98
|
-
if(n<=t.lastModified&&e.filePath===r.filePath)return t;let{bucketName:
|
|
99
|
-
return await
|
|
100
|
-
Updates"),
|
|
101
|
-
t,e,
|
|
84
|
+
throw r;return!1}},"deleteObject");var qe=o(()=>({equals:Qt,create:$e,replace:Yt,preview:Xt,update:er,delete:tr}),"\
|
|
85
|
+
getObjectHandler"),Qt=o((t,e)=>!!t.result&&t.result.lastModified===e.result?.lastModified,
|
|
86
|
+
"equalsResource"),Xt=o(async(t,e)=>{let r=t.parameters,n=e.parameters,c=(0,F.deepCompare)(
|
|
87
|
+
{...r,dependencies:t.dependencies,lastModified:await Z(r.filePath)},{...n,dependencies:e.
|
|
88
|
+
dependencies,lastModified:t.result?.lastModified});if(c.counts)return{...c,name:r.
|
|
89
|
+
objectKey}},"previewResource"),Yt=o(async(t,e,r)=>{if(e.result)throw new Me.ReplaceResourceError(
|
|
90
|
+
k,t.entryId,e.entryId);return $e(t,r)},"replaceResource"),$e=o(async(t,e)=>{let r=t.
|
|
91
|
+
parameters,n=j(k,"bucket",e),c=await Z(r.filePath),{objectKey:s}=await W(n,r);return await He(
|
|
92
|
+
n,s,r.tags,t.parameters.tags),{lastModified:c,bucketName:n}},"createResource"),er=o(
|
|
93
|
+
async(t,e)=>{let{result:r,parameters:n}=t;if(!r)return;let{objectKey:c,tags:s}=n,
|
|
94
|
+
i=rr(r,n,e.parameters);return await He(r.bucketName,c,s,e.parameters.tags),i},"u\
|
|
95
|
+
pdateResource"),tr=o(async t=>{let{result:e,parameters:r}=t;e&&await Ie(e.bucketName,
|
|
96
|
+
r.objectKey)},"deleteResource"),Z=o(async t=>{let{mtime:e}=await(0,Le.stat)(t);return e.
|
|
97
|
+
getTime()},"getLastModifiedTime"),rr=o(async(t,e,r)=>{let n=await Z(e.filePath);
|
|
98
|
+
if(n<=t.lastModified&&e.filePath===r.filePath)return t;let{bucketName:c}=t,{objectKey:s}=r;
|
|
99
|
+
return await W(c,{...e,objectKey:s}),{lastModified:n,bucketName:c}},"checkObject\
|
|
100
|
+
Updates"),He=o(async(t,e,r,n)=>{let c=r??{};!(0,F.deepEqual)(c,n??{})&&await Ae(
|
|
101
|
+
t,e,c)},"checkTagUpdates");var Ue=o(()=>{(0,Ke.tryRegisterProvider)(g,qe())},"registerObjectProvider");var q=require("@ez4/storage/library");var A=require("@ez4/stateful"),_e=require("@ez4/aws-function");var Ge=require("@ez4/aws-identity");var J=o(t=>`arn:aws:s3:::${t}`,"buildBucketArn"),Q=o(t=>(0,Ge.createPolicyDocument)(
|
|
102
102
|
[{resourceIds:[`arn:aws:s3:::${t}-*`,`arn:aws:s3:::${t}-*/*`],permissions:["s3:L\
|
|
103
103
|
istBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"]}]),"getPolicyDocumen\
|
|
104
|
-
t");var
|
|
105
|
-
dependencies:[],parameters:r});return e&&((0,
|
|
106
|
-
bucketName,getPermission:o(()=>({principal:"s3.amazonaws.com",sourceArn:
|
|
107
|
-
getPermission")}),(0,
|
|
108
|
-
cket");var
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
e);return(0,
|
|
112
|
-
__dirname,"../lib/event.ts"),define:i,filePrefix:"s3",handler:r,listener:n,context:
|
|
113
|
-
debug:
|
|
114
|
-
r,{handlerName:"s3EntryPoint",sourceFile:
|
|
115
|
-
description:n.description,
|
|
116
|
-
tags,getFunctionVariables:o(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
0,
|
|
123
|
-
|
|
124
|
-
e)}`,"
|
|
125
|
-
"
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
104
|
+
t");var X=o((t,e,r)=>{let n=r.bucketName,c=U(n),s=(0,A.attachEntry)(t,{type:y,entryId:c,
|
|
105
|
+
dependencies:[],parameters:r});return e&&((0,_e.createPermission)(t,s,e,{fromService:r.
|
|
106
|
+
bucketName,getPermission:o(()=>({principal:"s3.amazonaws.com",sourceArn:J(n)}),"\
|
|
107
|
+
getPermission")}),(0,A.linkEntryDependency)(t,s.entryId,e.entryId)),s},"createBu\
|
|
108
|
+
cket");var M=require("@ez4/aws-function"),ot=require("@ez4/project/library"),te=require("@ez4/aws-identity"),
|
|
109
|
+
nt=require("@ez4/aws-logs");var Xe=require("@ez4/aws-function"),Ye=require("@ez4/utils");var Ve=require("node:path"),We=require("@ez4/project/library"),Ze=require("@ez4/aws-function"),
|
|
110
|
+
Je=require("@ez4/aws-common");var Qe=o(async(t,e)=>{let{handler:r,listener:n,context:c,debug:s}=t,i=(0,We.getDefinitionsObject)(
|
|
111
|
+
e);return(0,Je.getFunctionBundle)(Ze.MappingServiceName,{templateFile:(0,Ve.join)(
|
|
112
|
+
__dirname,"../lib/event.ts"),define:i,filePrefix:"s3",handler:r,listener:n,context:c,
|
|
113
|
+
debug:s})},"bundleBucketEventFunction");var Y=o((t,e,r,n)=>{let{handler:c,variables:s,architecture:i}=n;return(0,Xe.createFunction)(
|
|
114
|
+
t,e,r,{handlerName:"s3EntryPoint",sourceFile:c.sourceFile,functionName:n.functionName,
|
|
115
|
+
description:n.description,architecture:n.architecture,runtime:n.runtime,release:n.
|
|
116
|
+
release,timeout:n.timeout,memory:n.memory,debug:n.debug,tags:n.tags,getFunctionVariables:o(
|
|
117
|
+
()=>s.reduce((p,b)=>({...p,...b}),{}),"getFunctionVariables"),getFunctionFiles:o(
|
|
118
|
+
()=>[c.sourceFile,c.dependencies],"getFunctionFiles"),getFunctionBundle:o(p=>Qe(
|
|
119
|
+
n,[...p.getDependencies(),...p.getConnections()]),"getFunctionBundle"),getFunctionHash:o(
|
|
120
|
+
()=>(0,Ye.hashObject)({architecture:i}),"getFunctionHash")})},"createBucketEvent\
|
|
121
|
+
Function");var I=require("@ez4/project/library"),et=require("@ez4/aws-common"),L=require("@ez4/utils");var tt=o(async(t,e)=>{if(t.globalName)return(0,I.getServiceName)(t.globalName,e);
|
|
122
|
+
let r=(0,I.getServiceName)(t,e),n=await(0,et.getRandomName)(16);return`${r.substring(
|
|
123
|
+
0,46)}-${n}`},"getBucketName"),ee=o((t,e)=>`${(0,L.toKebabCase)(t.name)}-${(0,L.toKebabCase)(
|
|
124
|
+
e)}`,"getInternalName"),rt=o((t,e,r)=>`${(0,I.getServiceName)(t,r)}-${(0,L.toKebabCase)(
|
|
125
|
+
e)}`,"getFunctionName");var T=class extends Error{static{o(this,"RoleMissingError")}constructor(){super(
|
|
126
|
+
"Execution role for S3 is missing.")}};var v=require("@ez4/aws-function"),P;(s=>(s.LogRetention=v.FunctionDefaults.LogRetention,
|
|
127
|
+
s.Architecture=v.FunctionDefaults.Architecture,s.Runtime=v.FunctionDefaults.Runtime,
|
|
128
|
+
s.Timeout=v.FunctionDefaults.Timeout,s.Memory=v.FunctionDefaults.Memory))(P||={});var ct=o((t,e,r,n)=>{if(!e.events)return;if(!n.role||!(0,te.isRoleState)(n.role))
|
|
129
|
+
throw new T;let{defaults:c,release:s}=r,{handler:i,listener:p,variables:b,runtime:E=c?.
|
|
130
|
+
runtime??P.Runtime,architecture:H=c?.architecture??P.Architecture,logRetention:N=c?.
|
|
131
|
+
logRetention??P.LogRetention,memory:Ct=c?.memory??P.Memory,timeout:ht=P.Timeout}=e.
|
|
132
|
+
events,re=ee(e,i.name),C=(0,M.tryGetFunctionState)(n,re,r);if(C)return C;let oe=rt(
|
|
133
|
+
e,i.name,r),jt=n.getDependencyFiles(i.file),Ot=(0,nt.createLogGroup)(t,{retention:N,
|
|
134
|
+
groupName:oe,tags:r.tags});return C=Y(t,n.role,Ot,{functionName:oe,description:i.
|
|
135
|
+
description,context:e.context,debug:r.debug,tags:r.tags,variables:[r.variables,e.
|
|
136
|
+
variables,b],architecture:H,runtime:E,release:s,timeout:ht,memory:Ct,handler:{sourceFile:i.
|
|
137
|
+
file,functionName:i.name,module:i.module,dependencies:jt},listener:p&&{functionName:p.
|
|
138
|
+
name,sourceFile:p.file,module:p.module}}),n.setServiceState(C,re,r),C},"prepareE\
|
|
139
|
+
vents"),st=o((t,e,r,n)=>{if(!e.events)return;if(!n.role||!(0,te.isRoleState)(n.role))
|
|
140
|
+
throw new T;let{handler:c}=e.events,s=ee(e,c.name),i=(0,M.getFunctionState)(n,s,
|
|
141
|
+
r);(0,ot.linkServiceContext)(t,i.entryId,e.context)},"connectEvents");var at=require("node:fs/promises"),R=require("node:path"),it=require("@ez4/aws-bucket");var pt=o(async(t,e,r)=>{let n=process.cwd(),c=(0,R.join)(n,r),s=await(0,at.readdir)(
|
|
142
|
+
c,{withFileTypes:!0,recursive:!0});for(let i of s){if(!i.isFile())continue;let p=(0,R.join)(
|
|
143
|
+
i.parentPath,i.name);(0,it.createBucketObject)(t,e,{objectKey:(0,R.relative)(c,p),
|
|
144
|
+
filePath:(0,R.relative)(n,p)})}},"prepareLocalContent");var mt=o((t,e,r)=>{let n=G(t,e.name,r),c=n.entryId;return{module:"Client",from:"\
|
|
140
145
|
@ez4/aws-bucket/client",constructor:`@{EZ4_MODULE_IMPORT}.make('${n.parameters.bucketName}\
|
|
141
|
-
')`,connectionIds:[
|
|
142
|
-
|
|
143
|
-
context:
|
|
144
|
-
events:
|
|
145
|
-
tags,bucketName:E,autoExpireDays:i,localPath:
|
|
146
|
-
|
|
147
|
-
options:n,context:
|
|
148
|
-
ices");var
|
|
149
|
-
let
|
|
150
|
-
e,
|
|
151
|
-
pareExecutionPolicy");var
|
|
152
|
-
(0,
|
|
153
|
-
pareExecutionPolicy":
|
|
154
|
-
s":
|
|
155
|
-
let e=await(0,
|
|
156
|
-
in");var
|
|
157
|
-
t,{type:
|
|
158
|
-
cketPolicy");var
|
|
159
|
-
t,{type:g,entryId:
|
|
146
|
+
')`,connectionIds:[c],dependencyIds:[c]}},"prepareLinkedClient");var ut=o(t=>{let{service:e,options:r,context:n}=t;return(0,q.isBucketService)(e)?
|
|
147
|
+
mt(n,e,r):null},"prepareLinkedServices"),lt=o(async t=>{let{state:e,service:r,options:n,
|
|
148
|
+
context:c}=t;if(!(0,q.isBucketService)(r))return!1;let{localPath:s,autoExpireDays:i,
|
|
149
|
+
events:p,cors:b}=r,E=await tt(r,n),H=ct(e,r,n,c),N=X(e,H,{eventsPath:p?.path,tags:n.
|
|
150
|
+
tags,bucketName:E,autoExpireDays:i,localPath:s,cors:b});return c.setServiceState(
|
|
151
|
+
N,r,n),s&&await pt(e,N,s),!0},"prepareBucketServices"),yt=o(t=>{let{state:e,service:r,
|
|
152
|
+
options:n,context:c}=t;(0,q.isBucketService)(r)&&st(e,r,n,c)},"connectBucketServ\
|
|
153
|
+
ices");var ft=require("@ez4/storage/library"),$=require("@ez4/aws-identity"),gt=require("@ez4/project/library");var dt=o(t=>{let{state:e,serviceType:r,options:n}=t;if(r!==ft.ServiceType)return null;
|
|
154
|
+
let c=(0,gt.getServiceName)("",n),s=`${c}-bucket-policy`;return(0,$.tryGetPolicy)(
|
|
155
|
+
e,s)??(0,$.createPolicy)(e,{tags:n.tags,policyDocument:Q(c),policyName:s})},"pre\
|
|
156
|
+
pareExecutionPolicy");var or=o(()=>{(0,St.registerTriggers)(),(0,kt.registerTriggers)(),(0,bt.registerTriggers)(),
|
|
157
|
+
(0,xt.registerTriggers)(),(0,Pt.tryCreateTrigger)("@ez4/aws-bucket",{"deploy:pre\
|
|
158
|
+
pareExecutionPolicy":dt,"deploy:prepareLinkedService":ut,"deploy:prepareResource\
|
|
159
|
+
s":lt,"deploy:connectResources":yt}),Be(),De(),Ue()},"registerTriggers");var Bt=require("@ez4/aws-identity");var nr=o(t=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(t),"isBucketDomain"),cr=o(async t=>{
|
|
160
|
+
let e=await(0,Bt.getRegion)();return`${t}.s3.${e}.amazonaws.com`},"getBucketDoma\
|
|
161
|
+
in");var wt=require("@ez4/stateful"),vt=require("@ez4/utils");var sr=o((t,e,r,n)=>{let c=(0,vt.hashData)(d,e.entryId,r.entryId);return(0,wt.attachEntry)(
|
|
162
|
+
t,{type:d,entryId:c,dependencies:[e.entryId,r.entryId],parameters:n})},"createBu\
|
|
163
|
+
cketPolicy");var ar=o(t=>t.type===d,"isBucketPolicyState");var Rt=require("@ez4/stateful"),Et=require("@ez4/utils");var ir=o((t,e,r)=>{let n=r.objectKey,c=(0,Et.hashData)(g,e.entryId,n);return(0,Rt.attachEntry)(
|
|
164
|
+
t,{type:g,entryId:c,dependencies:[e.entryId],parameters:r})},"createBucketObject");0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
|
|
160
165
|
PolicyServiceName,PolicyServiceType,buildBucketArn,createBucket,createBucketEventFunction,
|
|
161
166
|
createBucketObject,createBucketPolicy,createBucketStateId,getBucketDomain,getBucketName,
|
|
162
167
|
getBucketObjectFiles,getBucketObjectPath,getBucketState,getPolicyDocument,isBucketDomain,
|
package/dist/main.mjs
CHANGED
|
@@ -1,149 +1,154 @@
|
|
|
1
|
-
var
|
|
2
|
-
import{registerTriggers as
|
|
3
|
-
import{tryCreateTrigger as
|
|
4
|
-
import{deepCompare as
|
|
5
|
-
ListObjectsV2Command as
|
|
6
|
-
PutBucketCorsCommand as
|
|
7
|
-
DeleteBucketLifecycleCommand as
|
|
8
|
-
ExpirationStatus as
|
|
9
|
-
Bucket:t,MaxKeys:1}))).Contents?.length}catch(e){if(!(e instanceof
|
|
10
|
-
"isBucketEmpty")
|
|
11
|
-
send(new
|
|
12
|
-
|
|
13
|
-
throw e;return!1}},"deleteBucket"),
|
|
14
|
-
{Bucket:t,Tagging:{TagSet
|
|
15
|
-
m.logUpdate(
|
|
1
|
+
var qe=Object.defineProperty;var o=(t,e)=>qe(t,"name",{value:e,configurable:!0});import{registerTriggers as pr}from"@ez4/aws-common";import{registerTriggers as mr}from"@ez4/aws-identity";
|
|
2
|
+
import{registerTriggers as ur}from"@ez4/aws-function";import{registerTriggers as lr}from"@ez4/storage/library";
|
|
3
|
+
import{tryCreateTrigger as yr}from"@ez4/project/library";import{tryRegisterProvider as st}from"@ez4/aws-common";import{ReplaceResourceError as Ye}from"@ez4/aws-common";import{tryGetFunctionArn as Z}from"@ez4/aws-function";
|
|
4
|
+
import{deepCompare as et,deepEqual as j}from"@ez4/utils";import{getTagList as $e,Logger as m}from"@ez4/aws-common";import{S3Client as He,
|
|
5
|
+
ListObjectsV2Command as Ke,CreateBucketCommand as Ue,DeleteBucketCommand as Ge,PutBucketTaggingCommand as _e,
|
|
6
|
+
PutBucketCorsCommand as Ve,DeleteBucketCorsCommand as We,PutBucketLifecycleConfigurationCommand as Ze,
|
|
7
|
+
DeleteBucketLifecycleCommand as Je,PutBucketNotificationConfigurationCommand as Qe,
|
|
8
|
+
ExpirationStatus as Xe,NoSuchBucket as v}from"@aws-sdk/client-s3";var p="AWS:S3/Bucket",l="aws:s3.bucket";var u=new He({}),q=o(async t=>{m.logFetch(p,t);try{return!(await u.send(new Ke({
|
|
9
|
+
Bucket:t,MaxKeys:1}))).Contents?.length}catch(e){if(!(e instanceof v))throw e;return 0}},
|
|
10
|
+
"isBucketEmpty"),$=o(async t=>{let{bucketName:e}=t;return m.logCreate(p,e),await u.
|
|
11
|
+
send(new Ue({Bucket:e})),{bucketName:e}},"createBucket"),H=o(async t=>{m.logDelete(
|
|
12
|
+
p,t);try{return await u.send(new Ge({Bucket:t})),!0}catch(e){if(!(e instanceof v))
|
|
13
|
+
throw e;return!1}},"deleteBucket"),K=o(async(t,e)=>{m.logTag(p,t),await u.send(new _e(
|
|
14
|
+
{Bucket:t,Tagging:{TagSet:$e({...e,ManagedBy:"EZ4"})}}))},"tagBucket"),U=o(async(t,e)=>{
|
|
15
|
+
m.logUpdate(p,`${t} CORS`),await u.send(new Ve({Bucket:t,CORSConfiguration:{CORSRules:[
|
|
16
16
|
{ID:"ID0",AllowedOrigins:e.allowOrigins,AllowedMethods:e.allowMethods,AllowedHeaders:e.
|
|
17
17
|
allowHeaders,ExposeHeaders:e.exposeHeaders,MaxAgeSeconds:e.maxAge}]}}))},"update\
|
|
18
|
-
CorsConfiguration"),
|
|
19
|
-
send(new
|
|
20
|
-
leteCorsConfiguration"),
|
|
21
|
-
send(new
|
|
22
|
-
Filter:{Prefix:"*"},Expiration:{Days:e}}]}}))},"createLifecycle"),
|
|
23
|
-
m.logDelete(
|
|
24
|
-
if(!(e instanceof
|
|
25
|
-
|
|
18
|
+
CorsConfiguration"),G=o(async t=>{m.logDelete(p,`${t} CORS`);try{return await u.
|
|
19
|
+
send(new We({Bucket:t})),!0}catch(e){if(!(e instanceof v))throw e;return!1}},"de\
|
|
20
|
+
leteCorsConfiguration"),_=o(async(t,e)=>{m.logCreate(p,`${t} lifecycle`),await u.
|
|
21
|
+
send(new Ze({Bucket:t,LifecycleConfiguration:{Rules:[{ID:"ID0",Status:Xe.Enabled,
|
|
22
|
+
Filter:{Prefix:"*"},Expiration:{Days:e}}]}}))},"createLifecycle"),V=o(async t=>{
|
|
23
|
+
m.logDelete(p,`${t} lifecycle`);try{return await u.send(new Je({Bucket:t})),!0}catch(e){
|
|
24
|
+
if(!(e instanceof v))throw e;return!1}},"deleteLifecycle"),W=o(async(t,e)=>{m.logUpdate(
|
|
25
|
+
p,`${t} events`);let{functionArn:r,eventsPath:n,eventsType:c}=e;await u.send(new Qe(
|
|
26
26
|
{Bucket:t,SkipDestinationValidation:!0,NotificationConfiguration:{...r&&{LambdaFunctionConfigurations:[
|
|
27
|
-
{Id:"ID0",LambdaFunctionArn:r,Events:
|
|
28
|
-
refix",Value:n}]}}}}]}}}))},"updateEventNotifications");var
|
|
29
|
-
tBucketHandler"),
|
|
30
|
-
"equalsResource"),
|
|
31
|
-
n={...e.parameters,dependencies:e.dependencies},
|
|
32
|
-
name:r.bucketName}},"previewResource"),
|
|
33
|
-
|
|
34
|
-
parameters,n=
|
|
35
|
-
await
|
|
36
|
-
s,
|
|
37
|
-
result:n,parameters:
|
|
38
|
-
await
|
|
39
|
-
tags);let
|
|
40
|
-
functionArn:
|
|
41
|
-
async t=>{let e=t.result;e&&await
|
|
42
|
-
eResource"),
|
|
43
|
-
return
|
|
44
|
-
if(e.autoExpireDays!==r?.autoExpireDays){if(e.autoExpireDays)return
|
|
45
|
-
if(r?.autoExpireDays)return
|
|
46
|
-
{};!
|
|
47
|
-
t,{eventsType:["s3:ObjectCreated:*","s3:ObjectRemoved:*"],...e})},
|
|
48
|
-
|
|
49
|
-
toKebabCase as
|
|
50
|
-
`Bucket service ${e} wasn't found.`)}};var
|
|
51
|
-
|
|
52
|
-
getBucketState"),E=o((t,e,r)=>{let n=r.getDependencies(
|
|
53
|
-
throw new
|
|
54
|
-
NoSuchBucket as
|
|
55
|
-
|
|
56
|
-
"createPolicy"),
|
|
57
|
-
{Bucket:t})),!0}catch(e){if(!(e instanceof
|
|
58
|
-
getPolicyHandler"),
|
|
59
|
-
"equalsResource"),
|
|
60
|
-
n={...e.parameters,dependencies:e.dependencies},
|
|
61
|
-
if(
|
|
62
|
-
if(e.result)throw new
|
|
63
|
-
|
|
64
|
-
{bucketName:n,role:
|
|
65
|
-
eResource"),
|
|
66
|
-
urce");var
|
|
67
|
-
import{deepCompare as
|
|
68
|
-
PutObjectTaggingCommand as
|
|
69
|
-
import{getTagList as
|
|
70
|
-
bjectPath"),
|
|
71
|
-
lastModified,objectKey:n.objectKey})),"getBucketObjectFiles");var
|
|
72
|
-
t,r));let
|
|
73
|
-
...
|
|
74
|
-
d,
|
|
75
|
-
EZ4"})}}))},"tagObject"),
|
|
76
|
-
send(new
|
|
77
|
-
"deleteObject");var
|
|
78
|
-
getObjectHandler"),
|
|
79
|
-
"equalsResource"),
|
|
80
|
-
dependencies:t.dependencies,lastModified:await
|
|
81
|
-
dependencies,lastModified:t.result?.lastModified});if(
|
|
82
|
-
objectKey}},"previewResource"),
|
|
83
|
-
entryId,e.entryId);return
|
|
84
|
-
parameters,n=E(d,"bucket",e),
|
|
85
|
-
n,
|
|
86
|
-
async(t,e)=>{let{result:r,parameters:n}=t;if(!r)return;let{objectKey:
|
|
87
|
-
a=
|
|
88
|
-
pdateResource"),
|
|
89
|
-
r.objectKey)},"deleteResource"),
|
|
90
|
-
getTime()},"getLastModifiedTime"),
|
|
91
|
-
if(n<=t.lastModified&&e.filePath===r.filePath)return t;let{bucketName:
|
|
92
|
-
return await
|
|
93
|
-
Updates"),
|
|
94
|
-
kTagUpdates");var
|
|
27
|
+
{Id:"ID0",LambdaFunctionArn:r,Events:c,...n&&{Filter:{Key:{FilterRules:[{Name:"p\
|
|
28
|
+
refix",Value:n}]}}}}]}}}))},"updateEventNotifications");var J=o(()=>({equals:tt,create:Q,replace:ot,preview:rt,update:nt,delete:ct}),"ge\
|
|
29
|
+
tBucketHandler"),tt=o((t,e)=>!!t.result&&t.result.bucketName===e.result?.bucketName,
|
|
30
|
+
"equalsResource"),rt=o((t,e)=>{let r={...t.parameters,dependencies:t.dependencies},
|
|
31
|
+
n={...e.parameters,dependencies:e.dependencies},c=et(r,n);if(c.counts)return{...c,
|
|
32
|
+
name:r.bucketName}},"previewResource"),ot=o(async(t,e,r)=>{if(e.result)throw new Ye(
|
|
33
|
+
p,t.entryId,e.entryId);return Q(t,r)},"replaceResource"),Q=o(async(t,e)=>{let r=t.
|
|
34
|
+
parameters,n=Z(e),{bucketName:c}=await $(r);await X(c,r,void 0),await Y(c,r,void 0),
|
|
35
|
+
await ee(c,r.tags,void 0);let s={eventsPath:r.eventsPath,functionArn:n};return await te(
|
|
36
|
+
c,s,{}),{bucketName:c,functionArn:n}},"createResource"),nt=o(async(t,e,r)=>{let{
|
|
37
|
+
result:n,parameters:c}=t;if(!n)return;let s=n.bucketName,a=Z(r),i=e.result?.functionArn;
|
|
38
|
+
await X(s,c,e.parameters),await Y(s,c,e.parameters),await ee(s,c.tags,e.parameters.
|
|
39
|
+
tags);let f={eventsPath:c.eventsPath,functionArn:a},b={eventsPath:e.parameters.eventsPath,
|
|
40
|
+
functionArn:i};return await te(s,f,b),{...n,functionArn:a}},"updateResource"),ct=o(
|
|
41
|
+
async t=>{let e=t.result;e&&await q(e.bucketName)&&await H(e.bucketName)},"delet\
|
|
42
|
+
eResource"),X=o(async(t,e,r)=>{if(!(e.cors&&r?.cors&&j(e.cors,r.cors))){if(e.cors)
|
|
43
|
+
return U(t,e.cors);if(r?.cors)return G(t)}},"checkCorsUpdates"),Y=o(async(t,e,r)=>{
|
|
44
|
+
if(e.autoExpireDays!==r?.autoExpireDays){if(e.autoExpireDays)return _(t,e.autoExpireDays);
|
|
45
|
+
if(r?.autoExpireDays)return V(t)}},"checkLifecycleUpdates"),ee=o(async(t,e,r)=>{
|
|
46
|
+
let n=e??{};!j(n,r??{})&&await K(t,n)},"checkTagUpdates"),te=o(async(t,e,r)=>{!j(
|
|
47
|
+
e,r)&&await W(t,{eventsType:["s3:ObjectCreated:*","s3:ObjectRemoved:*"],...e})},
|
|
48
|
+
"checkEventUpdates");var re=o(()=>{st(l,J())},"registerBucketProvider");import{tryRegisterProvider as Bt}from"@ez4/aws-common";import{ReplaceResourceError as gt}from"@ez4/aws-common";import{deepCompare as dt}from"@ez4/utils";import{IncompleteResourceError as at}from"@ez4/aws-common";import{hashData as it,
|
|
49
|
+
toKebabCase as pt}from"@ez4/utils";var R=class extends Error{static{o(this,"BucketNotFoundError")}constructor(e){super(
|
|
50
|
+
`Bucket service ${e} wasn't found.`)}};var oe=o(t=>it(l,pt(t)),"createBucketStateId"),mt=o(t=>t.type===l,"isBucketState"),
|
|
51
|
+
ne=o((t,e,r)=>{let n=t.getServiceState(e,r);if(!mt(n))throw new R(e);return n},"\
|
|
52
|
+
getBucketState"),E=o((t,e,r)=>{let n=r.getDependencies(l)[0]?.result;if(!n?.bucketName)
|
|
53
|
+
throw new at(t,e,"bucketName");return n.bucketName},"getBucketName");import{S3Client as ut,PutBucketPolicyCommand as lt,DeleteBucketPolicyCommand as yt,
|
|
54
|
+
NoSuchBucket as ft}from"@aws-sdk/client-s3";import{Logger as ce}from"@ez4/aws-common";var k="AWS:S3/Policy",g="aws:s3.policy";var se=new ut({}),ae=o(async t=>{let{bucketName:e,role:r}=t;return ce.logCreate(
|
|
55
|
+
k,e),await se.send(new lt({Bucket:e,Policy:JSON.stringify(r)})),{bucketName:e}},
|
|
56
|
+
"createPolicy"),ie=o(async t=>{ce.logDelete(k,t);try{return await se.send(new yt(
|
|
57
|
+
{Bucket:t})),!0}catch(e){if(!(e instanceof ft))throw e;return!1}},"deletePolicy");var pe=o(()=>({equals:St,create:me,replace:bt,preview:kt,update:xt,delete:Pt}),"\
|
|
58
|
+
getPolicyHandler"),St=o((t,e)=>!!t.result&&t.result.bucketName===e.result?.bucketName,
|
|
59
|
+
"equalsResource"),kt=o((t,e)=>{let r={...t.parameters,dependencies:t.dependencies},
|
|
60
|
+
n={...e.parameters,dependencies:e.dependencies},c=dt(r,n,{exclude:{getRole:!0}});
|
|
61
|
+
if(c.counts)return{...c,name:r.fromService}},"previewResource"),bt=o(async(t,e,r)=>{
|
|
62
|
+
if(e.result)throw new gt(k,t.entryId,e.entryId);return me(t,r)},"replaceResource"),
|
|
63
|
+
me=o(async(t,e)=>{let r=t.parameters,n=E(k,"policy",e),c=await r.getRole(e);return await ae(
|
|
64
|
+
{bucketName:n,role:c}),{bucketName:n}},"createResource"),xt=o(async()=>{},"updat\
|
|
65
|
+
eResource"),Pt=o(async t=>{let e=t.result;e&&await ie(e.bucketName)},"deleteReso\
|
|
66
|
+
urce");var ue=o(()=>{Bt(g,pe())},"registerPolicyProvider");import{tryRegisterProvider as $t}from"@ez4/aws-common";import{stat as Tt}from"node:fs/promises";import{ReplaceResourceError as Nt}from"@ez4/aws-common";
|
|
67
|
+
import{deepCompare as Dt,deepEqual as zt}from"@ez4/utils";import{createReadStream as wt}from"node:fs";import{S3Client as vt,PutObjectCommand as Rt,
|
|
68
|
+
PutObjectTaggingCommand as Et,DeleteObjectCommand as Ct,NoSuchBucket as ht}from"@aws-sdk/client-s3";
|
|
69
|
+
import{getTagList as jt,Logger as O}from"@ez4/aws-common";import Ot from"mime";var d="AWS:S3/Object",y="aws:s3.object";var lo=o(t=>t.type===y,"isBucketObjectState"),C=o((t,e)=>`${t}/${e}`,"getBucketO\
|
|
70
|
+
bjectPath"),yo=o(t=>t.getDependencies(y).map(({result:r,parameters:n})=>({lastModified:r?.
|
|
71
|
+
lastModified,objectKey:n.objectKey})),"getBucketObjectFiles");var T=new vt({}),N=o(async(t,e)=>{let{objectKey:r,filePath:n}=e;O.logCreate(d,C(
|
|
72
|
+
t,r));let c=Ot.getType(n);return await T.send(new Rt({Bucket:t,Key:r,Body:wt(n),
|
|
73
|
+
...c&&{ContentType:c}})),{objectKey:r}},"putObject"),le=o(async(t,e,r)=>{O.logTag(
|
|
74
|
+
d,C(t,e)),await T.send(new Et({Bucket:t,Key:e,Tagging:{TagSet:jt({...r,ManagedBy:"\
|
|
75
|
+
EZ4"})}}))},"tagObject"),ye=o(async(t,e)=>{O.logDelete(d,C(t,e));try{return await T.
|
|
76
|
+
send(new Ct({Bucket:t,Key:e})),!0}catch(r){if(!(r instanceof ht))throw r;return!1}},
|
|
77
|
+
"deleteObject");var fe=o(()=>({equals:Ft,create:ge,replace:It,preview:At,update:Lt,delete:Mt}),"\
|
|
78
|
+
getObjectHandler"),Ft=o((t,e)=>!!t.result&&t.result.lastModified===e.result?.lastModified,
|
|
79
|
+
"equalsResource"),At=o(async(t,e)=>{let r=t.parameters,n=e.parameters,c=Dt({...r,
|
|
80
|
+
dependencies:t.dependencies,lastModified:await D(r.filePath)},{...n,dependencies:e.
|
|
81
|
+
dependencies,lastModified:t.result?.lastModified});if(c.counts)return{...c,name:r.
|
|
82
|
+
objectKey}},"previewResource"),It=o(async(t,e,r)=>{if(e.result)throw new Nt(d,t.
|
|
83
|
+
entryId,e.entryId);return ge(t,r)},"replaceResource"),ge=o(async(t,e)=>{let r=t.
|
|
84
|
+
parameters,n=E(d,"bucket",e),c=await D(r.filePath),{objectKey:s}=await N(n,r);return await de(
|
|
85
|
+
n,s,r.tags,t.parameters.tags),{lastModified:c,bucketName:n}},"createResource"),Lt=o(
|
|
86
|
+
async(t,e)=>{let{result:r,parameters:n}=t;if(!r)return;let{objectKey:c,tags:s}=n,
|
|
87
|
+
a=qt(r,n,e.parameters);return await de(r.bucketName,c,s,e.parameters.tags),a},"u\
|
|
88
|
+
pdateResource"),Mt=o(async t=>{let{result:e,parameters:r}=t;e&&await ye(e.bucketName,
|
|
89
|
+
r.objectKey)},"deleteResource"),D=o(async t=>{let{mtime:e}=await Tt(t);return e.
|
|
90
|
+
getTime()},"getLastModifiedTime"),qt=o(async(t,e,r)=>{let n=await D(e.filePath);
|
|
91
|
+
if(n<=t.lastModified&&e.filePath===r.filePath)return t;let{bucketName:c}=t,{objectKey:s}=r;
|
|
92
|
+
return await N(c,{...e,objectKey:s}),{lastModified:n,bucketName:c}},"checkObject\
|
|
93
|
+
Updates"),de=o(async(t,e,r,n)=>{let c=r??{};!zt(c,n??{})&&await le(t,e,c)},"chec\
|
|
94
|
+
kTagUpdates");var Se=o(()=>{$t(y,fe())},"registerObjectProvider");import{isBucketService as I}from"@ez4/storage/library";import{attachEntry as Kt,linkEntryDependency as Ut}from"@ez4/stateful";import{createPermission as Gt}from"@ez4/aws-function";import{createPolicyDocument as Ht}from"@ez4/aws-identity";var ke=o(t=>`arn:aws:s3:::${t}`,"buildBucketArn"),be=o(t=>Ht([{resourceIds:[`arn\
|
|
95
95
|
:aws:s3:::${t}-*`,`arn:aws:s3:::${t}-*/*`],permissions:["s3:ListBucket","s3:PutO\
|
|
96
|
-
bject","s3:GetObject","s3:DeleteObject"]}]),"getPolicyDocument");var
|
|
97
|
-
parameters:r});return e&&(
|
|
98
|
-
principal:"s3.amazonaws.com",sourceArn:
|
|
99
|
-
e.entryId)),
|
|
100
|
-
import{linkServiceContext as
|
|
101
|
-
import{createLogGroup as
|
|
102
|
-
import{MappingServiceName as
|
|
103
|
-
|
|
104
|
-
s3",handler:r,listener:n,context:
|
|
105
|
-
s3EntryPoint",sourceFile:
|
|
106
|
-
description
|
|
107
|
-
|
|
108
|
-
()=>
|
|
109
|
-
|
|
110
|
-
()
|
|
111
|
-
import{
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
s.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
e.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
96
|
+
bject","s3:GetObject","s3:DeleteObject"]}]),"getPolicyDocument");var xe=o((t,e,r)=>{let n=r.bucketName,c=oe(n),s=Kt(t,{type:l,entryId:c,dependencies:[],
|
|
97
|
+
parameters:r});return e&&(Gt(t,s,e,{fromService:r.bucketName,getPermission:o(()=>({
|
|
98
|
+
principal:"s3.amazonaws.com",sourceArn:ke(n)}),"getPermission")}),Ut(t,s.entryId,
|
|
99
|
+
e.entryId)),s},"createBucket");import{getFunctionState as Yt,tryGetFunctionState as er}from"@ez4/aws-function";
|
|
100
|
+
import{linkServiceContext as tr}from"@ez4/project/library";import{isRoleState as Re}from"@ez4/aws-identity";
|
|
101
|
+
import{createLogGroup as rr}from"@ez4/aws-logs";import{createFunction as Jt}from"@ez4/aws-function";import{hashObject as Qt}from"@ez4/utils";import{join as _t}from"node:path";import{getDefinitionsObject as Vt}from"@ez4/project/library";
|
|
102
|
+
import{MappingServiceName as Wt}from"@ez4/aws-function";import{getFunctionBundle as Zt}from"@ez4/aws-common";var Pe=o(async(t,e)=>{let{handler:r,listener:n,context:c,debug:s}=t,a=Vt(e);return Zt(
|
|
103
|
+
Wt,{templateFile:_t(import.meta.dirname,"../lib/event.ts"),define:a,filePrefix:"\
|
|
104
|
+
s3",handler:r,listener:n,context:c,debug:s})},"bundleBucketEventFunction");var Be=o((t,e,r,n)=>{let{handler:c,variables:s,architecture:a}=n;return Jt(t,e,r,
|
|
105
|
+
{handlerName:"s3EntryPoint",sourceFile:c.sourceFile,functionName:n.functionName,
|
|
106
|
+
description:n.description,architecture:n.architecture,runtime:n.runtime,release:n.
|
|
107
|
+
release,timeout:n.timeout,memory:n.memory,debug:n.debug,tags:n.tags,getFunctionVariables:o(
|
|
108
|
+
()=>s.reduce((i,f)=>({...i,...f}),{}),"getFunctionVariables"),getFunctionFiles:o(
|
|
109
|
+
()=>[c.sourceFile,c.dependencies],"getFunctionFiles"),getFunctionBundle:o(i=>Pe(
|
|
110
|
+
n,[...i.getDependencies(),...i.getConnections()]),"getFunctionBundle"),getFunctionHash:o(
|
|
111
|
+
()=>Qt({architecture:a}),"getFunctionHash")})},"createBucketEventFunction");import{getServiceName as z}from"@ez4/project/library";import{getRandomName as Xt}from"@ez4/aws-common";
|
|
112
|
+
import{toKebabCase as F}from"@ez4/utils";var we=o(async(t,e)=>{if(t.globalName)return z(t.globalName,e);let r=z(t,e),n=await Xt(
|
|
113
|
+
16);return`${r.substring(0,46)}-${n}`},"getBucketName"),A=o((t,e)=>`${F(t.name)}\
|
|
114
|
+
-${F(e)}`,"getInternalName"),ve=o((t,e,r)=>`${z(t,r)}-${F(e)}`,"getFunctionName");var P=class extends Error{static{o(this,"RoleMissingError")}constructor(){super(
|
|
115
|
+
"Execution role for S3 is missing.")}};import{FunctionDefaults as B}from"@ez4/aws-function";var S;(s=>(s.LogRetention=B.
|
|
116
|
+
LogRetention,s.Architecture=B.Architecture,s.Runtime=B.Runtime,s.Timeout=B.Timeout,
|
|
117
|
+
s.Memory=B.Memory))(S||={});var Ee=o((t,e,r,n)=>{if(!e.events)return;if(!n.role||!Re(n.role))throw new P;let{
|
|
118
|
+
defaults:c,release:s}=r,{handler:a,listener:i,variables:f,runtime:b=c?.runtime??
|
|
119
|
+
S.Runtime,architecture:h=c?.architecture??S.Architecture,logRetention:w=c?.logRetention??
|
|
120
|
+
S.LogRetention,memory:Ae=c?.memory??S.Memory,timeout:Ie=S.Timeout}=e.events,L=A(
|
|
121
|
+
e,a.name),x=er(n,L,r);if(x)return x;let M=ve(e,a.name,r),Le=n.getDependencyFiles(
|
|
122
|
+
a.file),Me=rr(t,{retention:w,groupName:M,tags:r.tags});return x=Be(t,n.role,Me,{
|
|
123
|
+
functionName:M,description:a.description,context:e.context,debug:r.debug,tags:r.
|
|
124
|
+
tags,variables:[r.variables,e.variables,f],architecture:h,runtime:b,release:s,timeout:Ie,
|
|
125
|
+
memory:Ae,handler:{sourceFile:a.file,functionName:a.name,module:a.module,dependencies:Le},
|
|
126
|
+
listener:i&&{functionName:i.name,sourceFile:i.file,module:i.module}}),n.setServiceState(
|
|
127
|
+
x,L,r),x},"prepareEvents"),Ce=o((t,e,r,n)=>{if(!e.events)return;if(!n.role||!Re(
|
|
128
|
+
n.role))throw new P;let{handler:c}=e.events,s=A(e,c.name),a=Yt(n,s,r);tr(t,a.entryId,
|
|
129
|
+
e.context)},"connectEvents");import{readdir as or}from"node:fs/promises";import{join as he,relative as je}from"node:path";
|
|
130
|
+
import{createBucketObject as nr}from"@ez4/aws-bucket";var Oe=o(async(t,e,r)=>{let n=process.cwd(),c=he(n,r),s=await or(c,{withFileTypes:!0,
|
|
131
|
+
recursive:!0});for(let a of s){if(!a.isFile())continue;let i=he(a.parentPath,a.name);
|
|
132
|
+
nr(t,e,{objectKey:je(c,i),filePath:je(n,i)})}},"prepareLocalContent");var Te=o((t,e,r)=>{let n=ne(t,e.name,r),c=n.entryId;return{module:"Client",from:"\
|
|
128
133
|
@ez4/aws-bucket/client",constructor:`@{EZ4_MODULE_IMPORT}.make('${n.parameters.bucketName}\
|
|
129
|
-
')`,connectionIds:[
|
|
130
|
-
repareLinkedServices"),
|
|
131
|
-
if(!
|
|
132
|
-
r,n),
|
|
133
|
-
localPath:
|
|
134
|
-
pareBucketServices"),
|
|
135
|
-
|
|
136
|
-
import{getServiceName as
|
|
137
|
-
"",n),
|
|
138
|
-
|
|
139
|
-
Policy":
|
|
140
|
-
:connectResources":
|
|
141
|
-
let e=await
|
|
142
|
-
dependencies:[e.entryId,r.entryId],parameters:n})},"createBucketPolicy");var
|
|
143
|
-
dependencies:[e.entryId],parameters:r})},"createBucketObject");export{
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
')`,connectionIds:[c],dependencyIds:[c]}},"prepareLinkedClient");var Ne=o(t=>{let{service:e,options:r,context:n}=t;return I(e)?Te(n,e,r):null},"p\
|
|
135
|
+
repareLinkedServices"),De=o(async t=>{let{state:e,service:r,options:n,context:c}=t;
|
|
136
|
+
if(!I(r))return!1;let{localPath:s,autoExpireDays:a,events:i,cors:f}=r,b=await we(
|
|
137
|
+
r,n),h=Ee(e,r,n,c),w=xe(e,h,{eventsPath:i?.path,tags:n.tags,bucketName:b,autoExpireDays:a,
|
|
138
|
+
localPath:s,cors:f});return c.setServiceState(w,r,n),s&&await Oe(e,w,s),!0},"pre\
|
|
139
|
+
pareBucketServices"),ze=o(t=>{let{state:e,service:r,options:n,context:c}=t;I(r)&&
|
|
140
|
+
Ce(e,r,n,c)},"connectBucketServices");import{ServiceType as cr}from"@ez4/storage/library";import{createPolicy as sr,tryGetPolicy as ar}from"@ez4/aws-identity";
|
|
141
|
+
import{getServiceName as ir}from"@ez4/project/library";var Fe=o(t=>{let{state:e,serviceType:r,options:n}=t;if(r!==cr)return null;let c=ir(
|
|
142
|
+
"",n),s=`${c}-bucket-policy`;return ar(e,s)??sr(e,{tags:n.tags,policyDocument:be(
|
|
143
|
+
c),policyName:s})},"prepareExecutionPolicy");var oc=o(()=>{pr(),mr(),ur(),lr(),yr("@ez4/aws-bucket",{"deploy:prepareExecution\
|
|
144
|
+
Policy":Fe,"deploy:prepareLinkedService":Ne,"deploy:prepareResources":De,"deploy\
|
|
145
|
+
:connectResources":ze}),re(),ue(),Se()},"registerTriggers");import{getRegion as fr}from"@ez4/aws-identity";var ac=o(t=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(t),"isBucketDomain"),ic=o(async t=>{
|
|
146
|
+
let e=await fr();return`${t}.s3.${e}.amazonaws.com`},"getBucketDomain");import{attachEntry as gr}from"@ez4/stateful";import{hashData as dr}from"@ez4/utils";var fc=o((t,e,r,n)=>{let c=dr(g,e.entryId,r.entryId);return gr(t,{type:g,entryId:c,
|
|
147
|
+
dependencies:[e.entryId,r.entryId],parameters:n})},"createBucketPolicy");var kc=o(t=>t.type===g,"isBucketPolicyState");import{attachEntry as Sr}from"@ez4/stateful";import{hashData as kr}from"@ez4/utils";var vc=o((t,e,r)=>{let n=r.objectKey,c=kr(y,e.entryId,n);return Sr(t,{type:y,entryId:c,
|
|
148
|
+
dependencies:[e.entryId],parameters:r})},"createBucketObject");export{p as BucketServiceName,l as BucketServiceType,d as ObjectServiceName,y as ObjectServiceType,
|
|
149
|
+
k as PolicyServiceName,g as PolicyServiceType,ke as buildBucketArn,xe as createBucket,
|
|
150
|
+
Be as createBucketEventFunction,vc as createBucketObject,fc as createBucketPolicy,
|
|
151
|
+
oe as createBucketStateId,ic as getBucketDomain,E as getBucketName,yo as getBucketObjectFiles,
|
|
152
|
+
C as getBucketObjectPath,ne as getBucketState,be as getPolicyDocument,ac as isBucketDomain,
|
|
153
|
+
lo as isBucketObjectState,kc as isBucketPolicyState,mt as isBucketState,oc as registerTriggers};
|
|
149
154
|
//# sourceMappingURL=main.mjs.map
|
|
@@ -2,13 +2,21 @@ export declare namespace Defaults {
|
|
|
2
2
|
/**
|
|
3
3
|
* Default log retention in days.
|
|
4
4
|
*/
|
|
5
|
-
const LogRetention =
|
|
5
|
+
const LogRetention = 15;
|
|
6
6
|
/**
|
|
7
|
-
* Default
|
|
7
|
+
* Default function architecture.
|
|
8
|
+
*/
|
|
9
|
+
const Architecture = ArchitectureType.x86;
|
|
10
|
+
/**
|
|
11
|
+
* Default function runtime.
|
|
12
|
+
*/
|
|
13
|
+
const Runtime = RuntimeType.Node24;
|
|
14
|
+
/**
|
|
15
|
+
* Default function timeout.
|
|
8
16
|
*/
|
|
9
17
|
const Timeout = 90;
|
|
10
18
|
/**
|
|
11
|
-
* Default
|
|
19
|
+
* Default function memory.
|
|
12
20
|
*/
|
|
13
21
|
const Memory = 192;
|
|
14
22
|
}
|
package/lib/event.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { S3Event, Context } from 'aws-lambda';
|
|
2
2
|
import type { Bucket } from '@ez4/storage';
|
|
3
3
|
|
|
4
|
-
import { ServiceEventType } from '@ez4/common';
|
|
5
4
|
import { BucketEventType } from '@ez4/storage';
|
|
5
|
+
import { ServiceEventType } from '@ez4/common';
|
|
6
|
+
import { Runtime } from '@ez4/common/runtime';
|
|
7
|
+
import { getRandomUUID } from '@ez4/utils';
|
|
6
8
|
|
|
7
9
|
declare const __EZ4_CONTEXT: object;
|
|
8
10
|
|
|
@@ -27,14 +29,21 @@ export async function s3EntryPoint(event: S3Event, context: Context): Promise<vo
|
|
|
27
29
|
|
|
28
30
|
const { bucket, object } = record.s3;
|
|
29
31
|
|
|
32
|
+
const traceId = getRandomUUID();
|
|
33
|
+
|
|
30
34
|
currentRequest = {
|
|
31
35
|
...request,
|
|
32
|
-
eventType,
|
|
33
36
|
bucketName: bucket.name,
|
|
34
37
|
objectSize: object.size,
|
|
35
|
-
objectKey: object.key
|
|
38
|
+
objectKey: object.key,
|
|
39
|
+
eventType,
|
|
40
|
+
traceId
|
|
36
41
|
};
|
|
37
42
|
|
|
43
|
+
Runtime.setScope({
|
|
44
|
+
traceId
|
|
45
|
+
});
|
|
46
|
+
|
|
38
47
|
await onReady(currentRequest);
|
|
39
48
|
await handle(currentRequest, __EZ4_CONTEXT);
|
|
40
49
|
await onDone(currentRequest);
|
|
@@ -89,7 +98,7 @@ const onDone = async (request: Bucket.Incoming) => {
|
|
|
89
98
|
};
|
|
90
99
|
|
|
91
100
|
const onError = async (error: unknown, request: Bucket.Request | Bucket.Incoming) => {
|
|
92
|
-
console.error(error);
|
|
101
|
+
console.error({ ...Runtime.getScope(), error });
|
|
93
102
|
|
|
94
103
|
return dispatch(
|
|
95
104
|
{
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ez4/aws-bucket",
|
|
3
3
|
"description": "EZ4: Self-managed AWS S3 bucket provider",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.39.0",
|
|
5
5
|
"author": "Silas B.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -51,16 +51,17 @@
|
|
|
51
51
|
"@types/mime": "^3.0.0"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@aws-sdk/client-s3": "^3.
|
|
55
|
-
"@aws-sdk/s3-request-presigner": "^3.
|
|
56
|
-
"@ez4/aws-common": "^0.
|
|
57
|
-
"@ez4/aws-function": "^0.
|
|
58
|
-
"@ez4/aws-identity": "^0.
|
|
59
|
-
"@ez4/aws-logs": "^0.
|
|
60
|
-
"@ez4/
|
|
61
|
-
"@ez4/
|
|
62
|
-
"@ez4/
|
|
63
|
-
"@ez4/
|
|
54
|
+
"@aws-sdk/client-s3": "^3.958.0",
|
|
55
|
+
"@aws-sdk/s3-request-presigner": "^3.958.0",
|
|
56
|
+
"@ez4/aws-common": "^0.39.0",
|
|
57
|
+
"@ez4/aws-function": "^0.39.0",
|
|
58
|
+
"@ez4/aws-identity": "^0.39.0",
|
|
59
|
+
"@ez4/aws-logs": "^0.39.0",
|
|
60
|
+
"@ez4/common": "^0.39.0",
|
|
61
|
+
"@ez4/project": "^0.39.0",
|
|
62
|
+
"@ez4/stateful": "^0.39.0",
|
|
63
|
+
"@ez4/storage": "^0.39.0",
|
|
64
|
+
"@ez4/utils": "^0.39.0",
|
|
64
65
|
"mime": "^3.0.0"
|
|
65
66
|
}
|
|
66
67
|
}
|