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