@ez4/aws-bucket 0.9.0 → 0.10.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/README.md CHANGED
@@ -28,6 +28,7 @@ Ensure the user performing deployments has the permissions below:
28
28
  "s3:GetObject",
29
29
  "s3:ListBucket",
30
30
  "s3:DeleteObject",
31
+ "s3:PutBucketCORS",
31
32
  "s3:PutLifecycleConfiguration",
32
33
  "s3:PutBucketPolicy",
33
34
  "s3:DeleteBucketPolicy",
@@ -1,4 +1,5 @@
1
1
  import type { ResourceTags } from '@ez4/aws-common';
2
+ import type { Bucket } from '@ez4/storage';
2
3
  export type CreateRequest = {
3
4
  bucketName: string;
4
5
  };
@@ -7,6 +8,8 @@ export type CreateResponse = {
7
8
  };
8
9
  export declare const createBucket: (request: CreateRequest) => Promise<CreateResponse>;
9
10
  export declare const tagBucket: (bucketName: string, tags: ResourceTags) => Promise<void>;
11
+ export declare const updateCorsConfiguration: (bucketName: string, cors: Bucket.Cors) => Promise<void>;
12
+ export declare const deleteCorsConfiguration: (bucketName: string) => Promise<void>;
10
13
  export declare const createLifecycle: (bucketName: string, autoExpireDays: number) => Promise<void>;
11
14
  export declare const deleteLifecycle: (bucketName: string) => Promise<void>;
12
15
  export declare const deleteBucket: (bucketName: string) => Promise<void>;
@@ -1,5 +1,6 @@
1
1
  import type { EntryState } from '@ez4/stateful';
2
2
  import type { ResourceTags } from '@ez4/aws-common';
3
+ import type { Bucket } from '@ez4/storage';
3
4
  import type { CreateRequest, CreateResponse } from './client.js';
4
5
  export declare const BucketServiceName = "AWS:S3/Bucket";
5
6
  export declare const BucketServiceType = "aws:s3.bucket";
@@ -7,6 +8,7 @@ export type BucketParameters = CreateRequest & {
7
8
  autoExpireDays?: number;
8
9
  localPath?: string;
9
10
  tags?: ResourceTags;
11
+ cors?: Bucket.Cors;
10
12
  };
11
13
  export type BucketResult = CreateResponse;
12
14
  export type BucketState = EntryState & {
package/dist/client.cjs CHANGED
@@ -1,15 +1,17 @@
1
- "use strict";var u=Object.create;var c=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var O=(n,s)=>{for(var r in s)c(n,r,{get:s[r],enumerable:!0})},y=(n,s,r,o)=>{if(s&&
2
- typeof s=="object"||typeof s=="function")for(let e of B(s))!C.call(n,e)&&e!==r&&
3
- c(n,e,{get:()=>s[e],enumerable:!(o=f(s,e))||o.enumerable});return n};var S=(n,s,r)=>(r=n!=null?u(l(n)):{},y(s||!n||!n.__esModule?c(r,"default",{value:n,
4
- enumerable:!0}):r,n)),K=n=>y(c({},"__esModule",{value:!0}),n);var T={};O(T,{Client:()=>g});module.exports=K(T);var m=require("@aws-sdk/s3-request-presigner"),
5
- t=require("@aws-sdk/client-s3"),p=S(require("mime/lite"),1),a=new t.S3Client({}),
6
- g;(s=>s.make=r=>new class{async exists(o){try{return await a.send(new t.HeadObjectCommand(
7
- {Bucket:r,Key:o})),!0}catch(e){if(e instanceof t.NotFound||e instanceof t.NoSuchKey)
8
- return!1;throw e}}async write(o,e){let i=p.default.getType(o);await a.send(new t.PutObjectCommand(
9
- {Bucket:r,Key:o,Body:e,...i&&{ContentType:i}}))}async read(o){let i=await(await a.
10
- send(new t.GetObjectCommand({Bucket:r,Key:o}))).Body.transformToByteArray();return Buffer.
11
- from(i)}async delete(o){await a.send(new t.DeleteObjectCommand({Bucket:r,Key:o}))}async getWriteUrl(o,e){
12
- let{expiresIn:i,contentType:d}=e,w=new t.PutObjectCommand({Bucket:r,Key:o,ContentType:d});
13
- return(0,m.getSignedUrl)(a,w,{signableHeaders:new Set(["content-type"]),expiresIn:i})}async getReadUrl(o,e){
14
- let{expiresIn:i}=e,d=new t.GetObjectCommand({Bucket:r,Key:o});return(0,m.getSignedUrl)(
15
- a,d,{expiresIn:i})}})(g||={});0&&(module.exports={Client});
1
+ "use strict";var u=Object.create;var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var O=(r,s)=>{for(var o in s)p(r,o,{get:s[o],enumerable:!0})},m=(r,s,o,t)=>{if(s&&
2
+ typeof s=="object"||typeof s=="function")for(let e of B(s))!l.call(r,e)&&e!==o&&
3
+ p(r,e,{get:()=>s[e],enumerable:!(t=f(s,e))||t.enumerable});return r};var S=(r,s,o)=>(o=r!=null?u(C(r)):{},m(s||!r||!r.__esModule?p(o,"default",{value:r,
4
+ enumerable:!0}):o,r)),T=r=>m(p({},"__esModule",{value:!0}),r);var K={};O(K,{Client:()=>d});module.exports=T(K);var y=require("@aws-sdk/s3-request-presigner"),
5
+ n=require("@aws-sdk/client-s3"),g=S(require("mime/lite"),1),c=new n.S3Client({}),
6
+ d;(s=>s.make=o=>new class{async exists(t){return!!await this.getStats(t)}async write(t,e,i){
7
+ let a=i?.contentType??g.default.getType(t);await c.send(new n.PutObjectCommand({
8
+ Bucket:o,Key:t,Body:e,...a&&{ContentType:a}}))}async read(t){let i=await(await c.
9
+ send(new n.GetObjectCommand({Bucket:o,Key:t}))).Body.transformToByteArray();return Buffer.
10
+ from(i)}async delete(t){await c.send(new n.DeleteObjectCommand({Bucket:o,Key:t}))}async getWriteUrl(t,e){
11
+ let{expiresIn:i,contentType:a}=e,w=new n.PutObjectCommand({Bucket:o,ContentType:a,
12
+ Key:t});return(0,y.getSignedUrl)(c,w,{signableHeaders:new Set(["content-type"]),
13
+ expiresIn:i})}async getReadUrl(t,e){let{expiresIn:i}=e,a=new n.GetObjectCommand(
14
+ {Bucket:o,Key:t});return(0,y.getSignedUrl)(c,a,{expiresIn:i})}async getStats(t){
15
+ try{let e=await c.send(new n.HeadObjectCommand({Bucket:o,Key:t}));return{type:e?.
16
+ ContentType,size:e?.ContentLength??0}}catch(e){if(e instanceof n.NotFound||e instanceof
17
+ n.NoSuchKey)return;throw e}}})(d||={});0&&(module.exports={Client});
package/dist/client.mjs CHANGED
@@ -1,12 +1,13 @@
1
- import{getSignedUrl as i}from"@aws-sdk/s3-request-presigner";import{HeadObjectCommand as y,
2
- PutObjectCommand as a,GetObjectCommand as c,DeleteObjectCommand as p,NotFound as g,
3
- S3Client as w,NoSuchKey as u}from"@aws-sdk/client-s3";import f from"mime/lite";var o=new w(
4
- {}),B;(d=>d.make=r=>new class{async exists(e){try{return await o.send(new y({Bucket:r,
5
- Key:e})),!0}catch(t){if(t instanceof g||t instanceof u)return!1;throw t}}async write(e,t){
6
- let n=f.getType(e);await o.send(new a({Bucket:r,Key:e,Body:t,...n&&{ContentType:n}}))}async read(e){
7
- let n=await(await o.send(new c({Bucket:r,Key:e}))).Body.transformToByteArray();return Buffer.
8
- from(n)}async delete(e){await o.send(new p({Bucket:r,Key:e}))}async getWriteUrl(e,t){
9
- let{expiresIn:n,contentType:s}=t,m=new a({Bucket:r,Key:e,ContentType:s});return i(
10
- o,m,{signableHeaders:new Set(["content-type"]),expiresIn:n})}async getReadUrl(e,t){
11
- let{expiresIn:n}=t,s=new c({Bucket:r,Key:e});return i(o,s,{expiresIn:n})}})(B||=
12
- {});export{B as Client};
1
+ import{getSignedUrl as i}from"@aws-sdk/s3-request-presigner";import{HeadObjectCommand as m,
2
+ PutObjectCommand as a,GetObjectCommand as c,DeleteObjectCommand as g,NotFound as d,
3
+ S3Client as w,NoSuchKey as u}from"@aws-sdk/client-s3";import f from"mime/lite";var s=new w(
4
+ {}),B;(p=>p.make=r=>new class{async exists(e){return!!await this.getStats(e)}async write(e,t,n){
5
+ let o=n?.contentType??f.getType(e);await s.send(new a({Bucket:r,Key:e,Body:t,...o&&
6
+ {ContentType:o}}))}async read(e){let n=await(await s.send(new c({Bucket:r,Key:e}))).
7
+ Body.transformToByteArray();return Buffer.from(n)}async delete(e){await s.send(new g(
8
+ {Bucket:r,Key:e}))}async getWriteUrl(e,t){let{expiresIn:n,contentType:o}=t,y=new a(
9
+ {Bucket:r,ContentType:o,Key:e});return i(s,y,{signableHeaders:new Set(["content-\
10
+ type"]),expiresIn:n})}async getReadUrl(e,t){let{expiresIn:n}=t,o=new c({Bucket:r,
11
+ Key:e});return i(s,o,{expiresIn:n})}async getStats(e){try{let t=await s.send(new m(
12
+ {Bucket:r,Key:e}));return{type:t?.ContentType,size:t?.ContentLength??0}}catch(t){
13
+ if(t instanceof d||t instanceof u)return;throw t}}})(B||={});export{B as Client};
package/dist/main.cjs CHANGED
@@ -1,80 +1,87 @@
1
- "use strict";var He=Object.create;var B=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Fe=Object.getPrototypeOf,Ae=Object.prototype.hasOwnProperty;var Ue=(e,t)=>{for(var r in t)B(e,r,{get:t[r],enumerable:!0})},z=(e,t,r,o)=>{if(t&&
2
- typeof t=="object"||typeof t=="function")for(let c of $e(t))!Ae.call(e,c)&&c!==r&&
3
- B(e,c,{get:()=>t[c],enumerable:!(o=Me(t,c))||o.enumerable});return e};var Ge=(e,t,r)=>(r=e!=null?He(Fe(e)):{},z(t||!e||!e.__esModule?B(r,"default",{value:e,
4
- enumerable:!0}):r,e)),We=e=>z(B({},"__esModule",{value:!0}),e);var kt={};Ue(kt,{BucketServiceName:()=>n,BucketServiceType:()=>i,ObjectServiceName:()=>y,
5
- ObjectServiceType:()=>p,PolicyServiceName:()=>f,PolicyServiceType:()=>u,createBucket:()=>D,
6
- createBucketObject:()=>dt,createBucketPolicy:()=>gt,getBucketDomain:()=>ft,getBucketName:()=>b,
7
- getBucketObjectFiles:()=>st,getBucketObjectPath:()=>P,getBucketState:()=>Ye,getBucketStateId:()=>E,
8
- getPolicyDocument:()=>N,isBucketDomain:()=>lt,isBucketObjectState:()=>ct,isBucketPolicyState:()=>St,
9
- isBucketState:()=>J,registerTriggers:()=>yt});module.exports=We(kt);var ve=require("@ez4/aws-common"),Te=require("@ez4/aws-identity"),he=require("@ez4/storage/library"),
10
- Ne=require("@ez4/project/library");var G=require("@ez4/aws-common");var M=require("@ez4/aws-common"),j=require("@ez4/utils");var m=require("@ez4/aws-common"),a=require("@aws-sdk/client-s3");var n="AWS:S3/Bucket",i="aws:s3.bucket";var k=new a.S3Client({}),I=async e=>{let{bucketName:t}=e;return m.Logger.logCreate(
11
- n,t),await k.send(new a.CreateBucketCommand({Bucket:t})),{bucketName:t}},L=async(e,t)=>{
12
- m.Logger.logTag(n,e),await k.send(new a.PutBucketTaggingCommand({Bucket:e,Tagging:{
13
- TagSet:(0,m.getTagList)({...t,ManagedBy:"EZ4"})}}))},q=async(e,t)=>{m.Logger.logCreate(
14
- n,`${e} lifecycle`),await k.send(new a.PutBucketLifecycleConfigurationCommand({Bucket:e,
15
- LifecycleConfiguration:{Rules:[{ID:"ID0",Status:a.ExpirationStatus.Enabled,Filter:{
16
- Prefix:"*"},Expiration:{Days:t}}]}}))},K=async e=>{m.Logger.logDelete(n,`${e} li\
17
- fecycle`),await k.send(new a.DeleteBucketLifecycleCommand({Bucket:e}))},H=async e=>{
18
- m.Logger.logDelete(n,e),await k.send(new a.DeleteBucketCommand({Bucket:e}))};var $=()=>({equals:Ze,create:F,replace:Qe,preview:Je,update:Ve,delete:Xe}),Ze=(e,t)=>!!e.
19
- result&&e.result.bucketName===t.result?.bucketName,Je=async(e,t)=>{let r={...e.parameters,
20
- dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},c=(0,j.deepCompare)(
21
- r,o);if(c.counts)return{...c,name:r.bucketName}},Qe=async(e,t)=>{if(t.result)throw new M.ReplaceResourceError(
22
- n,e.entryId,t.entryId);return F(e)},F=async e=>{let t=e.parameters,{bucketName:r}=await I(
23
- t);return await Promise.all([A(r,t,void 0),U(r,t.tags,void 0)]),{bucketName:r}},
24
- Ve=async(e,t)=>{let{result:r,parameters:o}=e;if(!r)return;let c=r.bucketName;await Promise.
25
- all([A(c,o,t.parameters),U(c,o.tags,t.parameters.tags)])},Xe=async e=>{let t=e.result;
26
- t&&await H(t.bucketName)},A=async(e,t,r)=>{if(t.autoExpireDays!==r?.autoExpireDays){
27
- if(t.autoExpireDays)return q(e,t.autoExpireDays);if(r?.autoExpireDays)return K(e)}},
28
- U=async(e,t,r)=>{let o=t??{};!(0,j.deepEqual)(o,r??{})&&await L(e,o)};var W=()=>{(0,G.registerProvider)(i,$())};var te=require("@ez4/aws-common");var Y=require("@ez4/aws-common");var R=require("@ez4/stateful"),Z=require("@ez4/aws-common"),w=require("@ez4/utils");var J=e=>e.type===i,E=e=>(0,w.hashData)(i,(0,w.toKebabCase)(e)),Ye=(e,t)=>{let r=(0,R.getEntry)(
29
- e,E(t));if(!J(r))throw new R.EntryNotFoundError(r.entryId);return r},b=(e,t,r)=>{
30
- let o=r.getDependencies(i).at(0)?.result;if(!o?.bucketName)throw new Z.IncompleteResourceError(
31
- e,t,"bucketName");return o.bucketName};var O=require("@ez4/aws-common"),S=require("@aws-sdk/client-s3");var f="AWS:S3/Policy",u="aws:s3.policy";var Q=new S.S3Client({}),V=async e=>{let{bucketName:t,role:r}=e;return O.Logger.
32
- logCreate(f,t),await Q.send(new S.PutBucketPolicyCommand({Bucket:t,Policy:JSON.stringify(
33
- r)})),{bucketName:t}},X=async e=>{O.Logger.logDelete(f,e),await Q.send(new S.DeleteBucketPolicyCommand(
34
- {Bucket:e}))};var _=()=>({equals:_e,create:ee,replace:tt,preview:et,update:rt,delete:ot}),_e=(e,t)=>!!e.
35
- result&&e.result.bucketName===t.result?.bucketName,et=async()=>{},tt=async(e,t,r)=>{
36
- if(t.result)throw new Y.ReplaceResourceError(f,e.entryId,t.entryId);return ee(e,
37
- r)},ee=async(e,t)=>{let r=e.parameters,o=b(f,"policy",t),c=await r.getRole(t);return await V(
38
- {bucketName:o,role:c}),{bucketName:o}},rt=async()=>{},ot=async e=>{let t=e.result;
39
- t&&await X(t.bucketName)};var re=()=>{(0,te.registerProvider)(u,_())};var ye=require("@ez4/aws-common");var ne=require("node:fs/promises"),ie=require("@ez4/aws-common"),C=require("@ez4/utils");var d=require("@ez4/aws-common"),oe=require("node:fs"),ce=Ge(require("mime"),1),
40
- l=require("@aws-sdk/client-s3");var y="AWS:S3/Object",p="aws:s3.object";var ct=e=>e.type===p,P=(e,t)=>`${e}/${t}`,st=e=>e.getDependencies(p).map(({result:r})=>({
41
- lastModified:r?.lastModified,objectKey:r?.objectKey}));var v=new l.S3Client({}),T=async(e,t)=>{let{objectKey:r,filePath:o}=t;d.Logger.logCreate(
42
- y,P(e,r));let c=ce.default.getType(o);return await v.send(new l.PutObjectCommand(
43
- {Bucket:e,Key:r,Body:(0,oe.createReadStream)(o),...c&&{ContentType:c}})),{objectKey:r}},
44
- se=async(e,t,r)=>{d.Logger.logTag(y,P(e,t)),await v.send(new l.PutObjectTaggingCommand(
45
- {Bucket:e,Key:t,Tagging:{TagSet:(0,d.getTagList)({...r,ManagedBy:"EZ4"})}}))},ae=async(e,t)=>{
46
- d.Logger.logDelete(y,P(e,t)),await v.send(new l.DeleteObjectCommand({Bucket:e,Key:t}))};var pe=()=>({equals:at,create:me,replace:it,preview:nt,update:pt,delete:mt}),at=(e,t)=>!!e.
47
- result&&e.result.objectKey===t.result?.objectKey,nt=async(e,t)=>{let r=e.parameters,
48
- o=t.parameters,c=(0,C.deepCompare)({...r,dependencies:e.dependencies,lastModified:await h(
1
+ "use strict";var Ae=Object.create;var R=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ue=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Ze=(e,t)=>{for(var r in t)R(e,r,{get:t[r],enumerable:!0})},I=(e,t,r,o)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let s of Ue(t))!We.call(e,s)&&s!==r&&
3
+ R(e,s,{get:()=>t[s],enumerable:!(o=Fe(t,s))||o.enumerable});return e};var Je=(e,t,r)=>(r=e!=null?Ae(Ge(e)):{},I(t||!e||!e.__esModule?R(r,"default",{value:e,
4
+ enumerable:!0}):r,e)),Qe=e=>I(R({},"__esModule",{value:!0}),e);var Bt={};Ze(Bt,{BucketServiceName:()=>n,BucketServiceType:()=>p,ObjectServiceName:()=>y,
5
+ ObjectServiceType:()=>m,PolicyServiceName:()=>g,PolicyServiceType:()=>u,createBucket:()=>z,
6
+ createBucketObject:()=>bt,createBucketPolicy:()=>kt,getBucketDomain:()=>St,getBucketName:()=>b,
7
+ getBucketObjectFiles:()=>it,getBucketObjectPath:()=>B,getBucketState:()=>tt,getBucketStateId:()=>C,
8
+ getPolicyDocument:()=>N,isBucketDomain:()=>dt,isBucketObjectState:()=>nt,isBucketPolicyState:()=>Pt,
9
+ isBucketState:()=>Y,registerTriggers:()=>gt});module.exports=Qe(Bt);var Ne=require("@ez4/aws-common"),ze=require("@ez4/aws-identity"),Ie=require("@ez4/storage/library"),
10
+ Le=require("@ez4/project/library");var Q=require("@ez4/aws-common");var F=require("@ez4/aws-common"),P=require("@ez4/utils");var i=require("@ez4/aws-common"),a=require("@aws-sdk/client-s3");var n="AWS:S3/Bucket",p="aws:s3.bucket";var f=new a.S3Client({}),L=async e=>{let{bucketName:t}=e;return i.Logger.logCreate(
11
+ n,t),await f.send(new a.CreateBucketCommand({Bucket:t})),{bucketName:t}},q=async(e,t)=>{
12
+ i.Logger.logTag(n,e),await f.send(new a.PutBucketTaggingCommand({Bucket:e,Tagging:{
13
+ TagSet:(0,i.getTagList)({...t,ManagedBy:"EZ4"})}}))},K=async(e,t)=>{i.Logger.logUpdate(
14
+ n,`${e} CORS`),await f.send(new a.PutBucketCorsCommand({Bucket:e,CORSConfiguration:{
15
+ CORSRules:[{ID:"ID0",AllowedOrigins:t.allowOrigins,AllowedMethods:t.allowMethods,
16
+ AllowedHeaders:t.allowHeaders,ExposeHeaders:t.exposeHeaders,MaxAgeSeconds:t.maxAge}]}}))},
17
+ H=async e=>{i.Logger.logDelete(n,`${e} CORS`),await f.send(new a.DeleteBucketCorsCommand(
18
+ {Bucket:e}))},M=async(e,t)=>{i.Logger.logCreate(n,`${e} lifecycle`),await f.send(
19
+ new a.PutBucketLifecycleConfigurationCommand({Bucket:e,LifecycleConfiguration:{Rules:[
20
+ {ID:"ID0",Status:a.ExpirationStatus.Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},
21
+ $=async e=>{i.Logger.logDelete(n,`${e} lifecycle`),await f.send(new a.DeleteBucketLifecycleCommand(
22
+ {Bucket:e}))},A=async e=>{i.Logger.logDelete(n,e),await f.send(new a.DeleteBucketCommand(
23
+ {Bucket:e}))};var U=()=>({equals:Ve,create:G,replace:Ye,preview:Xe,update:_e,delete:et}),Ve=(e,t)=>!!e.
24
+ result&&e.result.bucketName===t.result?.bucketName,Xe=async(e,t)=>{let r={...e.parameters,
25
+ dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},s=(0,P.deepCompare)(
26
+ r,o);if(s.counts)return{...s,name:r.bucketName}},Ye=async(e,t)=>{if(t.result)throw new F.ReplaceResourceError(
27
+ n,e.entryId,t.entryId);return G(e)},G=async e=>{let t=e.parameters,{bucketName:r}=await L(
28
+ t);return await Promise.all([W(r,t,void 0),Z(r,t,void 0),J(r,t.tags,void 0)]),{bucketName:r}},
29
+ _e=async(e,t)=>{let{result:r,parameters:o}=e;if(!r)return;let s=r.bucketName;await Promise.
30
+ all([W(s,o,t.parameters),Z(s,o,t.parameters),J(s,o.tags,t.parameters.tags)])},et=async e=>{
31
+ let t=e.result;t&&await A(t.bucketName)},W=async(e,t,r)=>{if(!(t.cors&&r?.cors&&
32
+ (0,P.deepEqual)(t.cors,r.cors))){if(t.cors)return K(e,t.cors);if(r?.cors)return H(
33
+ e)}},Z=async(e,t,r)=>{if(t.autoExpireDays!==r?.autoExpireDays){if(t.autoExpireDays)
34
+ return M(e,t.autoExpireDays);if(r?.autoExpireDays)return $(e)}},J=async(e,t,r)=>{
35
+ let o=t??{};!(0,P.deepEqual)(o,r??{})&&await q(e,o)};var V=()=>{(0,Q.registerProvider)(p,U())};var ce=require("@ez4/aws-common");var re=require("@ez4/aws-common");var j=require("@ez4/stateful"),X=require("@ez4/aws-common"),w=require("@ez4/utils");var Y=e=>e.type===p,C=e=>(0,w.hashData)(p,(0,w.toKebabCase)(e)),tt=(e,t)=>{let r=(0,j.getEntry)(
36
+ e,C(t));if(!Y(r))throw new j.EntryNotFoundError(r.entryId);return r},b=(e,t,r)=>{
37
+ let o=r.getDependencies(p).at(0)?.result;if(!o?.bucketName)throw new X.IncompleteResourceError(
38
+ e,t,"bucketName");return o.bucketName};var v=require("@ez4/aws-common"),S=require("@aws-sdk/client-s3");var g="AWS:S3/Policy",u="aws:s3.policy";var _=new S.S3Client({}),ee=async e=>{let{bucketName:t,role:r}=e;return v.Logger.
39
+ logCreate(g,t),await _.send(new S.PutBucketPolicyCommand({Bucket:t,Policy:JSON.stringify(
40
+ r)})),{bucketName:t}},te=async e=>{v.Logger.logDelete(g,e),await _.send(new S.DeleteBucketPolicyCommand(
41
+ {Bucket:e}))};var oe=()=>({equals:rt,create:se,replace:st,preview:ot,update:ct,delete:at}),rt=(e,t)=>!!e.
42
+ result&&e.result.bucketName===t.result?.bucketName,ot=async()=>{},st=async(e,t,r)=>{
43
+ if(t.result)throw new re.ReplaceResourceError(g,e.entryId,t.entryId);return se(e,
44
+ r)},se=async(e,t)=>{let r=e.parameters,o=b(g,"policy",t),s=await r.getRole(t);return await ee(
45
+ {bucketName:o,role:s}),{bucketName:o}},ct=async()=>{},at=async e=>{let t=e.result;
46
+ t&&await te(t.bucketName)};var ae=()=>{(0,ce.registerProvider)(u,oe())};var de=require("@ez4/aws-common");var ue=require("node:fs/promises"),ye=require("@ez4/aws-common"),E=require("@ez4/utils");var k=require("@ez4/aws-common"),ne=require("node:fs"),ie=Je(require("mime"),1),
47
+ l=require("@aws-sdk/client-s3");var y="AWS:S3/Object",m="aws:s3.object";var nt=e=>e.type===m,B=(e,t)=>`${e}/${t}`,it=e=>e.getDependencies(m).map(({result:r})=>({
48
+ lastModified:r?.lastModified,objectKey:r?.objectKey}));var T=new l.S3Client({}),h=async(e,t)=>{let{objectKey:r,filePath:o}=t;k.Logger.logCreate(
49
+ y,B(e,r));let s=ie.default.getType(o);return await T.send(new l.PutObjectCommand(
50
+ {Bucket:e,Key:r,Body:(0,ne.createReadStream)(o),...s&&{ContentType:s}})),{objectKey:r}},
51
+ pe=async(e,t,r)=>{k.Logger.logTag(y,B(e,t)),await T.send(new l.PutObjectTaggingCommand(
52
+ {Bucket:e,Key:t,Tagging:{TagSet:(0,k.getTagList)({...r,ManagedBy:"EZ4"})}}))},me=async(e,t)=>{
53
+ k.Logger.logDelete(y,B(e,t)),await T.send(new l.DeleteObjectCommand({Bucket:e,Key:t}))};var le=()=>({equals:pt,create:fe,replace:ut,preview:mt,update:yt,delete:lt}),pt=(e,t)=>!!e.
54
+ result&&e.result.objectKey===t.result?.objectKey,mt=async(e,t)=>{let r=e.parameters,
55
+ o=t.parameters,s=(0,E.deepCompare)({...r,dependencies:e.dependencies,lastModified:await D(
49
56
  r.filePath)},{...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});
50
- if(c.counts)return{...c,name:r.objectKey}},it=async(e,t,r)=>{if(t.result)throw new ie.ReplaceResourceError(
51
- y,e.entryId,t.entryId);return me(e,r)},me=async(e,t)=>{let r=e.parameters,o=b(y,
52
- "bucket",t),c=await h(r.filePath),{objectKey:s}=await T(o,r);return await ue(o,s,
53
- r.tags,e.parameters.tags),{lastModified:c,bucketName:o,objectKey:s}},pt=async(e,t)=>{
54
- let{result:r,parameters:o}=e;if(!r)return;let{bucketName:c,objectKey:s}=r,g=ut(r,
55
- o,t.parameters);return await ue(c,s,o.tags,t.parameters.tags),g},mt=async e=>{let t=e.
56
- result;t&&await ae(t.bucketName,t.objectKey)},h=async e=>{let{mtime:t}=await(0,ne.stat)(
57
- e);return t.getTime()},ut=async(e,t,r)=>{let o=await h(t.filePath);if(o<=e.lastModified&&
58
- t.filePath===r.filePath)return e;let{bucketName:c,objectKey:s}=e;return await T(
59
- c,{...t,objectKey:s}),{lastModified:o,bucketName:c,objectKey:s}},ue=async(e,t,r,o)=>{
60
- let c=r??{};!(0,C.deepEqual)(c,o??{})&&await se(e,t,c)};var le=()=>{(0,ye.registerProvider)(p,pe())};var ge=require("@ez4/aws-identity");var fe=require("@ez4/aws-identity"),N=e=>(0,fe.createPolicyDocument)([{resourceIds:[
57
+ if(s.counts)return{...s,name:r.objectKey}},ut=async(e,t,r)=>{if(t.result)throw new ye.ReplaceResourceError(
58
+ y,e.entryId,t.entryId);return fe(e,r)},fe=async(e,t)=>{let r=e.parameters,o=b(y,
59
+ "bucket",t),s=await D(r.filePath),{objectKey:c}=await h(o,r);return await ge(o,c,
60
+ r.tags,e.parameters.tags),{lastModified:s,bucketName:o,objectKey:c}},yt=async(e,t)=>{
61
+ let{result:r,parameters:o}=e;if(!r)return;let{bucketName:s,objectKey:c}=r,d=ft(r,
62
+ o,t.parameters);return await ge(s,c,o.tags,t.parameters.tags),d},lt=async e=>{let t=e.
63
+ result;t&&await me(t.bucketName,t.objectKey)},D=async e=>{let{mtime:t}=await(0,ue.stat)(
64
+ e);return t.getTime()},ft=async(e,t,r)=>{let o=await D(t.filePath);if(o<=e.lastModified&&
65
+ t.filePath===r.filePath)return e;let{bucketName:s,objectKey:c}=e;return await h(
66
+ s,{...t,objectKey:c}),{lastModified:o,bucketName:s,objectKey:c}},ge=async(e,t,r,o)=>{
67
+ let s=r??{};!(0,E.deepEqual)(s,o??{})&&await pe(e,t,s)};var Se=()=>{(0,de.registerProvider)(m,le())};var Pe=require("@ez4/aws-identity");var ke=require("@ez4/aws-identity"),N=e=>(0,ke.createPolicyDocument)([{resourceIds:[
61
68
  `arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:["s3:ListBucket","s3:\
62
- PutObject","s3:GetObject","s3:DeleteObject"]}]);var Se=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:c}=r,s=`${o}\
63
- -${c}`;return(0,ge.createPolicy)(t,{policyName:`${s}-bucket-policy`,policyDocument:N(
64
- s)})};var Be=require("@ez4/project/library"),je=require("@ez4/storage/library");var de=require("@ez4/utils"),ke=require("@ez4/stateful");var D=(e,t)=>{let r=(0,de.toKebabCase)(t.bucketName),o=E(t.bucketName);return(0,ke.attachEntry)(
65
- e,{type:i,entryId:o,dependencies:[],parameters:{...t,bucketName:r}})};var be=require("node:fs/promises"),x=require("node:path"),Pe=require("@ez4/aws-bucket"),
66
- xe=async(e,t,r)=>{let o=(0,x.join)(process.cwd(),r),c=await(0,be.readdir)(o,{withFileTypes:!0,
67
- recursive:!0});for(let s of c){if(!s.isFile())continue;let g=(0,x.join)(s.parentPath,
68
- s.name),Ke=(0,x.relative)(o,g);(0,Pe.createBucketObject)(e,t,{objectKey:Ke,filePath:g})}};var Re=async e=>{let{state:t,service:r,options:o}=e;if(!(0,je.isBucketService)(r))
69
- return;let{autoExpireDays:c,localPath:s}=r,g=D(t,{bucketName:(0,Be.getServiceName)(
70
- r,o),autoExpireDays:c,localPath:s});s&&await xe(t,g,s)};var we=require("@ez4/storage/library"),Ee=require("@ez4/project/library"),Ce=async e=>{
71
- let{service:t,options:r}=e;return(0,we.isBucketService)(t)?{constructor:`make('${(0,Ee.getServiceName)(
72
- t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var Oe=!1,yt=()=>{Oe||((0,ve.registerTriggers)(),(0,Te.registerTriggers)(),(0,he.registerTriggers)(),
73
- (0,Ne.createTrigger)("@ez4/aws-bucket",{"deploy:prepareExecutionPolicy":Se,"depl\
74
- oy:prepareLinkedService":Ce,"deploy:prepareResources":Re}),W(),re(),le(),Oe=!0)};var De=require("@ez4/aws-identity"),lt=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(
75
- e),ft=async e=>{let t=await(0,De.getRegion)();return`${e}.s3.${t}.amazonaws.com`};var ze=require("@ez4/stateful"),Ie=require("@ez4/utils");var gt=(e,t,r,o)=>{let c=(0,Ie.hashData)(u,t.entryId,r.entryId);return(0,ze.attachEntry)(
76
- e,{type:u,entryId:c,dependencies:[t.entryId,r.entryId],parameters:o})};var St=e=>e.type===u;var Le=require("@ez4/stateful"),qe=require("@ez4/utils");var dt=(e,t,r)=>{let o=r.objectKey,c=(0,qe.hashData)(p,t.entryId,o);return(0,Le.attachEntry)(
77
- e,{type:p,entryId:c,dependencies:[t.entryId],parameters:r})};0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
69
+ PutObject","s3:GetObject","s3:DeleteObject"]}]);var be=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:s}=r,c=`${o}\
70
+ -${s}`;return(0,Pe.createPolicy)(t,{policyName:`${c}-bucket-policy`,policyDocument:N(
71
+ c)})};var Ce=require("@ez4/project/library"),Ee=require("@ez4/storage/library");var Be=require("@ez4/utils"),xe=require("@ez4/stateful");var z=(e,t)=>{let r=(0,Be.toKebabCase)(t.bucketName),o=C(t.bucketName);return(0,xe.attachEntry)(
72
+ e,{type:p,entryId:o,dependencies:[],parameters:{...t,bucketName:r}})};var Re=require("node:fs/promises"),x=require("node:path"),je=require("@ez4/aws-bucket"),
73
+ we=async(e,t,r)=>{let o=(0,x.join)(process.cwd(),r),s=await(0,Re.readdir)(o,{withFileTypes:!0,
74
+ recursive:!0});for(let c of s){if(!c.isFile())continue;let d=(0,x.join)(c.parentPath,
75
+ c.name),O=(0,x.relative)(o,d);(0,je.createBucketObject)(e,t,{objectKey:O,filePath:d})}};var Oe=async e=>{let{state:t,service:r,options:o}=e;if(!(0,Ee.isBucketService)(r))
76
+ return;let{autoExpireDays:s,localPath:c,cors:d}=r,O=z(t,{bucketName:(0,Ce.getServiceName)(
77
+ r,o),autoExpireDays:s,localPath:c,cors:d});c&&await we(t,O,c)};var ve=require("@ez4/storage/library"),Te=require("@ez4/project/library"),he=async e=>{
78
+ let{service:t,options:r}=e;return(0,ve.isBucketService)(t)?{constructor:`make('${(0,Te.getServiceName)(
79
+ t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var De=!1,gt=()=>{De||((0,Ne.registerTriggers)(),(0,ze.registerTriggers)(),(0,Ie.registerTriggers)(),
80
+ (0,Le.createTrigger)("@ez4/aws-bucket",{"deploy:prepareExecutionPolicy":be,"depl\
81
+ oy:prepareLinkedService":he,"deploy:prepareResources":Oe}),V(),ae(),Se(),De=!0)};var qe=require("@ez4/aws-identity"),dt=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(
82
+ e),St=async e=>{let t=await(0,qe.getRegion)();return`${e}.s3.${t}.amazonaws.com`};var Ke=require("@ez4/stateful"),He=require("@ez4/utils");var kt=(e,t,r,o)=>{let s=(0,He.hashData)(u,t.entryId,r.entryId);return(0,Ke.attachEntry)(
83
+ e,{type:u,entryId:s,dependencies:[t.entryId,r.entryId],parameters:o})};var Pt=e=>e.type===u;var Me=require("@ez4/stateful"),$e=require("@ez4/utils");var bt=(e,t,r)=>{let o=r.objectKey,s=(0,$e.hashData)(m,t.entryId,o);return(0,Me.attachEntry)(
84
+ e,{type:m,entryId:s,dependencies:[t.entryId],parameters:r})};0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
78
85
  PolicyServiceName,PolicyServiceType,createBucket,createBucketObject,createBucketPolicy,
79
86
  getBucketDomain,getBucketName,getBucketObjectFiles,getBucketObjectPath,getBucketState,
80
87
  getBucketStateId,getPolicyDocument,isBucketDomain,isBucketObjectState,isBucketPolicyState,
package/dist/main.mjs CHANGED
@@ -1,74 +1,81 @@
1
- import{registerTriggers as it}from"@ez4/aws-common";import{registerTriggers as pt}from"@ez4/aws-identity";
2
- import{registerTriggers as mt}from"@ez4/storage/library";import{createTrigger as ut}from"@ez4/project/library";import{registerProvider as Se}from"@ez4/aws-common";import{ReplaceResourceError as ie}from"@ez4/aws-common";import{deepCompare as pe,
3
- deepEqual as me}from"@ez4/utils";import{getTagList as ee,Logger as l}from"@ez4/aws-common";import{CreateBucketCommand as te,
4
- DeleteBucketCommand as re,PutBucketTaggingCommand as oe,PutBucketLifecycleConfigurationCommand as ce,
5
- DeleteBucketLifecycleCommand as se,ExpirationStatus as ae,S3Client as ne}from"@aws-sdk/client-s3";var a="AWS:S3/Bucket",n="aws:s3.bucket";var f=new ne({}),B=async e=>{let{bucketName:t}=e;return l.logCreate(a,t),await f.
6
- send(new te({Bucket:t})),{bucketName:t}},j=async(e,t)=>{l.logTag(a,e),await f.send(
7
- new oe({Bucket:e,Tagging:{TagSet:ee({...t,ManagedBy:"EZ4"})}}))},R=async(e,t)=>{
8
- l.logCreate(a,`${e} lifecycle`),await f.send(new ce({Bucket:e,LifecycleConfiguration:{
9
- Rules:[{ID:"ID0",Status:ae.Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},
10
- w=async e=>{l.logDelete(a,`${e} lifecycle`),await f.send(new se({Bucket:e}))},E=async e=>{
11
- l.logDelete(a,e),await f.send(new re({Bucket:e}))};var C=()=>({equals:ue,create:O,replace:le,preview:ye,update:fe,delete:ge}),ue=(e,t)=>!!e.
12
- result&&e.result.bucketName===t.result?.bucketName,ye=async(e,t)=>{let r={...e.parameters,
13
- dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},c=pe(
14
- r,o);if(c.counts)return{...c,name:r.bucketName}},le=async(e,t)=>{if(t.result)throw new ie(
15
- a,e.entryId,t.entryId);return O(e)},O=async e=>{let t=e.parameters,{bucketName:r}=await B(
16
- t);return await Promise.all([v(r,t,void 0),T(r,t.tags,void 0)]),{bucketName:r}},
17
- fe=async(e,t)=>{let{result:r,parameters:o}=e;if(!r)return;let c=r.bucketName;await Promise.
18
- all([v(c,o,t.parameters),T(c,o.tags,t.parameters.tags)])},ge=async e=>{let t=e.result;
19
- t&&await E(t.bucketName)},v=async(e,t,r)=>{if(t.autoExpireDays!==r?.autoExpireDays){
20
- if(t.autoExpireDays)return R(e,t.autoExpireDays);if(r?.autoExpireDays)return w(e)}},
21
- T=async(e,t,r)=>{let o=t??{};!me(o,r??{})&&await j(e,o)};var h=()=>{Se(n,C())};import{registerProvider as Ne}from"@ez4/aws-common";import{ReplaceResourceError as Ee}from"@ez4/aws-common";import{EntryNotFoundError as de,getEntry as ke}from"@ez4/stateful";import{IncompleteResourceError as be}from"@ez4/aws-common";
22
- import{hashData as Pe,toKebabCase as xe}from"@ez4/utils";var Be=e=>e.type===n,d=e=>Pe(n,xe(e)),It=(e,t)=>{let r=ke(e,d(t));if(!Be(r))throw new de(
1
+ import{registerTriggers as lt}from"@ez4/aws-common";import{registerTriggers as ft}from"@ez4/aws-identity";
2
+ import{registerTriggers as gt}from"@ez4/storage/library";import{createTrigger as dt}from"@ez4/project/library";import{registerProvider as Be}from"@ez4/aws-common";import{ReplaceResourceError as fe}from"@ez4/aws-common";import{deepCompare as ge,
3
+ deepEqual as T}from"@ez4/utils";import{getTagList as se,Logger as p}from"@ez4/aws-common";import{CreateBucketCommand as ce,
4
+ DeleteBucketCommand as ae,PutBucketTaggingCommand as ne,PutBucketCorsCommand as ie,
5
+ DeleteBucketCorsCommand as pe,PutBucketLifecycleConfigurationCommand as me,DeleteBucketLifecycleCommand as ue,
6
+ ExpirationStatus as ye,S3Client as le}from"@aws-sdk/client-s3";var a="AWS:S3/Bucket",n="aws:s3.bucket";var m=new le({}),R=async e=>{let{bucketName:t}=e;return p.logCreate(a,t),await m.
7
+ send(new ce({Bucket:t})),{bucketName:t}},j=async(e,t)=>{p.logTag(a,e),await m.send(
8
+ new ne({Bucket:e,Tagging:{TagSet:se({...t,ManagedBy:"EZ4"})}}))},w=async(e,t)=>{
9
+ p.logUpdate(a,`${e} CORS`),await m.send(new ie({Bucket:e,CORSConfiguration:{CORSRules:[
10
+ {ID:"ID0",AllowedOrigins:t.allowOrigins,AllowedMethods:t.allowMethods,AllowedHeaders:t.
11
+ allowHeaders,ExposeHeaders:t.exposeHeaders,MaxAgeSeconds:t.maxAge}]}}))},C=async e=>{
12
+ p.logDelete(a,`${e} CORS`),await m.send(new pe({Bucket:e}))},E=async(e,t)=>{p.logCreate(
13
+ a,`${e} lifecycle`),await m.send(new me({Bucket:e,LifecycleConfiguration:{Rules:[
14
+ {ID:"ID0",Status:ye.Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},O=async e=>{
15
+ p.logDelete(a,`${e} lifecycle`),await m.send(new ue({Bucket:e}))},v=async e=>{p.
16
+ logDelete(a,e),await m.send(new ae({Bucket:e}))};var h=()=>({equals:de,create:D,replace:ke,preview:Se,update:Pe,delete:be}),de=(e,t)=>!!e.
17
+ result&&e.result.bucketName===t.result?.bucketName,Se=async(e,t)=>{let r={...e.parameters,
18
+ dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},s=ge(
19
+ r,o);if(s.counts)return{...s,name:r.bucketName}},ke=async(e,t)=>{if(t.result)throw new fe(
20
+ a,e.entryId,t.entryId);return D(e)},D=async e=>{let t=e.parameters,{bucketName:r}=await R(
21
+ t);return await Promise.all([N(r,t,void 0),z(r,t,void 0),I(r,t.tags,void 0)]),{bucketName:r}},
22
+ Pe=async(e,t)=>{let{result:r,parameters:o}=e;if(!r)return;let s=r.bucketName;await Promise.
23
+ all([N(s,o,t.parameters),z(s,o,t.parameters),I(s,o.tags,t.parameters.tags)])},be=async e=>{
24
+ let t=e.result;t&&await v(t.bucketName)},N=async(e,t,r)=>{if(!(t.cors&&r?.cors&&
25
+ T(t.cors,r.cors))){if(t.cors)return w(e,t.cors);if(r?.cors)return C(e)}},z=async(e,t,r)=>{
26
+ if(t.autoExpireDays!==r?.autoExpireDays){if(t.autoExpireDays)return E(e,t.autoExpireDays);
27
+ if(r?.autoExpireDays)return O(e)}},I=async(e,t,r)=>{let o=t??{};!T(o,r??{})&&await j(
28
+ e,o)};var L=()=>{Be(n,h())};import{registerProvider as qe}from"@ez4/aws-common";import{ReplaceResourceError as he}from"@ez4/aws-common";import{EntryNotFoundError as xe,getEntry as Re}from"@ez4/stateful";import{IncompleteResourceError as je}from"@ez4/aws-common";
29
+ import{hashData as we,toKebabCase as Ce}from"@ez4/utils";var Ee=e=>e.type===n,k=e=>we(n,Ce(e)),Mt=(e,t)=>{let r=Re(e,k(t));if(!Ee(r))throw new xe(
23
30
  r.entryId);return r},g=(e,t,r)=>{let o=r.getDependencies(n).at(0)?.result;if(!o?.
24
- bucketName)throw new be(e,t,"bucketName");return o.bucketName};import{Logger as N}from"@ez4/aws-common";import{S3Client as je,PutBucketPolicyCommand as Re,
25
- DeleteBucketPolicyCommand as we}from"@aws-sdk/client-s3";var y="AWS:S3/Policy",p="aws:s3.policy";var D=new je({}),z=async e=>{let{bucketName:t,role:r}=e;return N.logCreate(y,t),
26
- await D.send(new Re({Bucket:t,Policy:JSON.stringify(r)})),{bucketName:t}},I=async e=>{
27
- N.logDelete(y,e),await D.send(new we({Bucket:e}))};var L=()=>({equals:Ce,create:q,replace:ve,preview:Oe,update:Te,delete:he}),Ce=(e,t)=>!!e.
28
- result&&e.result.bucketName===t.result?.bucketName,Oe=async()=>{},ve=async(e,t,r)=>{
29
- if(t.result)throw new Ee(y,e.entryId,t.entryId);return q(e,r)},q=async(e,t)=>{let r=e.
30
- parameters,o=g(y,"policy",t),c=await r.getRole(t);return await z({bucketName:o,role:c}),
31
- {bucketName:o}},Te=async()=>{},he=async e=>{let t=e.result;t&&await I(t.bucketName)};var K=()=>{Ne(p,L())};import{registerProvider as Ve}from"@ez4/aws-common";import{stat as Me}from"node:fs/promises";import{ReplaceResourceError as $e}from"@ez4/aws-common";
32
- import{deepCompare as Fe,deepEqual as Ae}from"@ez4/utils";import{getTagList as De,Logger as k}from"@ez4/aws-common";import{createReadStream as ze}from"node:fs";
33
- import Ie from"mime";import{PutObjectCommand as Le,PutObjectTaggingCommand as qe,
34
- DeleteObjectCommand as Ke,S3Client as He}from"@aws-sdk/client-s3";var m="AWS:S3/Object",i="aws:s3.object";var er=e=>e.type===i,S=(e,t)=>`${e}/${t}`,tr=e=>e.getDependencies(i).map(({result:r})=>({
35
- lastModified:r?.lastModified,objectKey:r?.objectKey}));var b=new He({}),P=async(e,t)=>{let{objectKey:r,filePath:o}=t;k.logCreate(m,S(e,
36
- r));let c=Ie.getType(o);return await b.send(new Le({Bucket:e,Key:r,Body:ze(o),...c&&
37
- {ContentType:c}})),{objectKey:r}},H=async(e,t,r)=>{k.logTag(m,S(e,t)),await b.send(
38
- new qe({Bucket:e,Key:t,Tagging:{TagSet:De({...r,ManagedBy:"EZ4"})}}))},M=async(e,t)=>{
39
- k.logDelete(m,S(e,t)),await b.send(new Ke({Bucket:e,Key:t}))};var $=()=>({equals:Ue,create:F,replace:We,preview:Ge,update:Ze,delete:Je}),Ue=(e,t)=>!!e.
40
- result&&e.result.objectKey===t.result?.objectKey,Ge=async(e,t)=>{let r=e.parameters,
41
- o=t.parameters,c=Fe({...r,dependencies:e.dependencies,lastModified:await x(r.filePath)},
42
- {...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});if(c.counts)
43
- return{...c,name:r.objectKey}},We=async(e,t,r)=>{if(t.result)throw new $e(m,e.entryId,
44
- t.entryId);return F(e,r)},F=async(e,t)=>{let r=e.parameters,o=g(m,"bucket",t),c=await x(
45
- r.filePath),{objectKey:s}=await P(o,r);return await A(o,s,r.tags,e.parameters.tags),
46
- {lastModified:c,bucketName:o,objectKey:s}},Ze=async(e,t)=>{let{result:r,parameters:o}=e;
47
- if(!r)return;let{bucketName:c,objectKey:s}=r,u=Qe(r,o,t.parameters);return await A(
48
- c,s,o.tags,t.parameters.tags),u},Je=async e=>{let t=e.result;t&&await M(t.bucketName,
49
- t.objectKey)},x=async e=>{let{mtime:t}=await Me(e);return t.getTime()},Qe=async(e,t,r)=>{
31
+ bucketName)throw new je(e,t,"bucketName");return o.bucketName};import{Logger as q}from"@ez4/aws-common";import{S3Client as Oe,PutBucketPolicyCommand as ve,
32
+ DeleteBucketPolicyCommand as Te}from"@aws-sdk/client-s3";var f="AWS:S3/Policy",u="aws:s3.policy";var K=new Oe({}),H=async e=>{let{bucketName:t,role:r}=e;return q.logCreate(f,t),
33
+ await K.send(new ve({Bucket:t,Policy:JSON.stringify(r)})),{bucketName:t}},M=async e=>{
34
+ q.logDelete(f,e),await K.send(new Te({Bucket:e}))};var $=()=>({equals:De,create:A,replace:ze,preview:Ne,update:Ie,delete:Le}),De=(e,t)=>!!e.
35
+ result&&e.result.bucketName===t.result?.bucketName,Ne=async()=>{},ze=async(e,t,r)=>{
36
+ if(t.result)throw new he(f,e.entryId,t.entryId);return A(e,r)},A=async(e,t)=>{let r=e.
37
+ parameters,o=g(f,"policy",t),s=await r.getRole(t);return await H({bucketName:o,role:s}),
38
+ {bucketName:o}},Ie=async()=>{},Le=async e=>{let t=e.result;t&&await M(t.bucketName)};var F=()=>{qe(u,$())};import{registerProvider as tt}from"@ez4/aws-common";import{stat as Ge}from"node:fs/promises";import{ReplaceResourceError as We}from"@ez4/aws-common";
39
+ import{deepCompare as Ze,deepEqual as Je}from"@ez4/utils";import{getTagList as Ke,Logger as P}from"@ez4/aws-common";import{createReadStream as He}from"node:fs";
40
+ import Me from"mime";import{PutObjectCommand as $e,PutObjectTaggingCommand as Ae,
41
+ DeleteObjectCommand as Fe,S3Client as Ue}from"@aws-sdk/client-s3";var y="AWS:S3/Object",i="aws:s3.object";var cr=e=>e.type===i,d=(e,t)=>`${e}/${t}`,ar=e=>e.getDependencies(i).map(({result:r})=>({
42
+ lastModified:r?.lastModified,objectKey:r?.objectKey}));var b=new Ue({}),B=async(e,t)=>{let{objectKey:r,filePath:o}=t;P.logCreate(y,d(e,
43
+ r));let s=Me.getType(o);return await b.send(new $e({Bucket:e,Key:r,Body:He(o),...s&&
44
+ {ContentType:s}})),{objectKey:r}},U=async(e,t,r)=>{P.logTag(y,d(e,t)),await b.send(
45
+ new Ae({Bucket:e,Key:t,Tagging:{TagSet:Ke({...r,ManagedBy:"EZ4"})}}))},G=async(e,t)=>{
46
+ P.logDelete(y,d(e,t)),await b.send(new Fe({Bucket:e,Key:t}))};var W=()=>({equals:Qe,create:Z,replace:Xe,preview:Ve,update:Ye,delete:_e}),Qe=(e,t)=>!!e.
47
+ result&&e.result.objectKey===t.result?.objectKey,Ve=async(e,t)=>{let r=e.parameters,
48
+ o=t.parameters,s=Ze({...r,dependencies:e.dependencies,lastModified:await x(r.filePath)},
49
+ {...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});if(s.counts)
50
+ return{...s,name:r.objectKey}},Xe=async(e,t,r)=>{if(t.result)throw new We(y,e.entryId,
51
+ t.entryId);return Z(e,r)},Z=async(e,t)=>{let r=e.parameters,o=g(y,"bucket",t),s=await x(
52
+ r.filePath),{objectKey:c}=await B(o,r);return await J(o,c,r.tags,e.parameters.tags),
53
+ {lastModified:s,bucketName:o,objectKey:c}},Ye=async(e,t)=>{let{result:r,parameters:o}=e;
54
+ if(!r)return;let{bucketName:s,objectKey:c}=r,l=et(r,o,t.parameters);return await J(
55
+ s,c,o.tags,t.parameters.tags),l},_e=async e=>{let t=e.result;t&&await G(t.bucketName,
56
+ t.objectKey)},x=async e=>{let{mtime:t}=await Ge(e);return t.getTime()},et=async(e,t,r)=>{
50
57
  let o=await x(t.filePath);if(o<=e.lastModified&&t.filePath===r.filePath)return e;
51
- let{bucketName:c,objectKey:s}=e;return await P(c,{...t,objectKey:s}),{lastModified:o,
52
- bucketName:c,objectKey:s}},A=async(e,t,r,o)=>{let c=r??{};!Ae(c,o??{})&&await H(
53
- e,t,c)};var U=()=>{Ve(i,$())};import{createPolicy as Ye}from"@ez4/aws-identity";import{createPolicyDocument as Xe}from"@ez4/aws-identity";var G=e=>Xe([{resourceIds:[
58
+ let{bucketName:s,objectKey:c}=e;return await B(s,{...t,objectKey:c}),{lastModified:o,
59
+ bucketName:s,objectKey:c}},J=async(e,t,r,o)=>{let s=r??{};!Je(s,o??{})&&await U(
60
+ e,t,s)};var Q=()=>{tt(i,W())};import{createPolicy as ot}from"@ez4/aws-identity";import{createPolicyDocument as rt}from"@ez4/aws-identity";var V=e=>rt([{resourceIds:[
54
61
  `arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:["s3:ListBucket","s3:\
55
- PutObject","s3:GetObject","s3:DeleteObject"]}]);var W=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:c}=r,s=`${o}\
56
- -${c}`;return Ye(t,{policyName:`${s}-bucket-policy`,policyDocument:G(s)})};import{getServiceName as ct}from"@ez4/project/library";import{isBucketService as st}from"@ez4/storage/library";import{toKebabCase as _e}from"@ez4/utils";import{attachEntry as et}from"@ez4/stateful";var Z=(e,t)=>{let r=_e(t.bucketName),o=d(t.bucketName);return et(e,{type:n,entryId:o,
57
- dependencies:[],parameters:{...t,bucketName:r}})};import{readdir as tt}from"node:fs/promises";import{join as J,relative as rt}from"node:path";
58
- import{createBucketObject as ot}from"@ez4/aws-bucket";var Q=async(e,t,r)=>{let o=J(
59
- process.cwd(),r),c=await tt(o,{withFileTypes:!0,recursive:!0});for(let s of c){if(!s.
60
- isFile())continue;let u=J(s.parentPath,s.name),_=rt(o,u);ot(e,t,{objectKey:_,filePath:u})}};var V=async e=>{let{state:t,service:r,options:o}=e;if(!st(r))return;let{autoExpireDays:c,
61
- localPath:s}=r,u=Z(t,{bucketName:ct(r,o),autoExpireDays:c,localPath:s});s&&await Q(
62
- t,u,s)};import{isBucketService as at}from"@ez4/storage/library";import{getServiceName as nt}from"@ez4/project/library";
63
- var X=async e=>{let{service:t,options:r}=e;return at(t)?{constructor:`make('${nt(
64
- t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var Y=!1,_r=()=>{Y||(it(),pt(),mt(),ut("@ez4/aws-bucket",{"deploy:prepareExecuti\
65
- onPolicy":W,"deploy:prepareLinkedService":X,"deploy:prepareResources":V}),h(),K(),
66
- U(),Y=!0)};import{getRegion as yt}from"@ez4/aws-identity";var ro=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.
67
- test(e),oo=async e=>{let t=await yt();return`${e}.s3.${t}.amazonaws.com`};import{attachEntry as lt}from"@ez4/stateful";import{hashData as ft}from"@ez4/utils";var io=(e,t,r,o)=>{let c=ft(p,t.entryId,r.entryId);return lt(e,{type:p,entryId:c,
68
- dependencies:[t.entryId,r.entryId],parameters:o})};var uo=e=>e.type===p;import{attachEntry as gt}from"@ez4/stateful";import{hashData as St}from"@ez4/utils";var So=(e,t,r)=>{let o=r.objectKey,c=St(i,t.entryId,o);return gt(e,{type:i,entryId:c,
69
- dependencies:[t.entryId],parameters:r})};export{a as BucketServiceName,n as BucketServiceType,m as ObjectServiceName,i as ObjectServiceType,
70
- y as PolicyServiceName,p as PolicyServiceType,Z as createBucket,So as createBucketObject,
71
- io as createBucketPolicy,oo as getBucketDomain,g as getBucketName,tr as getBucketObjectFiles,
72
- S as getBucketObjectPath,It as getBucketState,d as getBucketStateId,G as getPolicyDocument,
73
- ro as isBucketDomain,er as isBucketObjectState,uo as isBucketPolicyState,Be as isBucketState,
74
- _r as registerTriggers};
62
+ PutObject","s3:GetObject","s3:DeleteObject"]}]);var X=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:s}=r,c=`${o}\
63
+ -${s}`;return ot(t,{policyName:`${c}-bucket-policy`,policyDocument:V(c)})};import{getServiceName as pt}from"@ez4/project/library";import{isBucketService as mt}from"@ez4/storage/library";import{toKebabCase as st}from"@ez4/utils";import{attachEntry as ct}from"@ez4/stateful";var Y=(e,t)=>{let r=st(t.bucketName),o=k(t.bucketName);return ct(e,{type:n,entryId:o,
64
+ dependencies:[],parameters:{...t,bucketName:r}})};import{readdir as at}from"node:fs/promises";import{join as _,relative as nt}from"node:path";
65
+ import{createBucketObject as it}from"@ez4/aws-bucket";var ee=async(e,t,r)=>{let o=_(
66
+ process.cwd(),r),s=await at(o,{withFileTypes:!0,recursive:!0});for(let c of s){if(!c.
67
+ isFile())continue;let l=_(c.parentPath,c.name),S=nt(o,l);it(e,t,{objectKey:S,filePath:l})}};var te=async e=>{let{state:t,service:r,options:o}=e;if(!mt(r))return;let{autoExpireDays:s,
68
+ localPath:c,cors:l}=r,S=Y(t,{bucketName:pt(r,o),autoExpireDays:s,localPath:c,cors:l});
69
+ c&&await ee(t,S,c)};import{isBucketService as ut}from"@ez4/storage/library";import{getServiceName as yt}from"@ez4/project/library";
70
+ var re=async e=>{let{service:t,options:r}=e;return ut(t)?{constructor:`make('${yt(
71
+ t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var oe=!1,so=()=>{oe||(lt(),ft(),gt(),dt("@ez4/aws-bucket",{"deploy:prepareExecu\
72
+ tionPolicy":X,"deploy:prepareLinkedService":re,"deploy:prepareResources":te}),L(),
73
+ F(),Q(),oe=!0)};import{getRegion as St}from"@ez4/aws-identity";var no=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.
74
+ test(e),io=async e=>{let t=await St();return`${e}.s3.${t}.amazonaws.com`};import{attachEntry as kt}from"@ez4/stateful";import{hashData as Pt}from"@ez4/utils";var lo=(e,t,r,o)=>{let s=Pt(u,t.entryId,r.entryId);return kt(e,{type:u,entryId:s,
75
+ dependencies:[t.entryId,r.entryId],parameters:o})};var So=e=>e.type===u;import{attachEntry as bt}from"@ez4/stateful";import{hashData as Bt}from"@ez4/utils";var xo=(e,t,r)=>{let o=r.objectKey,s=Bt(i,t.entryId,o);return bt(e,{type:i,entryId:s,
76
+ dependencies:[t.entryId],parameters:r})};export{a as BucketServiceName,n as BucketServiceType,y as ObjectServiceName,i as ObjectServiceType,
77
+ f as PolicyServiceName,u as PolicyServiceType,Y as createBucket,xo as createBucketObject,
78
+ lo as createBucketPolicy,io as getBucketDomain,g as getBucketName,ar as getBucketObjectFiles,
79
+ d as getBucketObjectPath,Mt as getBucketState,k as getBucketStateId,V as getPolicyDocument,
80
+ no as isBucketDomain,cr as isBucketObjectState,So as isBucketPolicyState,Ee as isBucketState,
81
+ so as registerTriggers};
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.9.0",
4
+ "version": "0.10.0",
5
5
  "author": "Silas B.",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -45,16 +45,16 @@
45
45
  "@types/mime": "^3.0.0"
46
46
  },
47
47
  "peerDependencies": {
48
- "@ez4/project": "^0.9.0",
49
- "@ez4/storage": "^0.9.0"
48
+ "@ez4/project": "^0.10.0",
49
+ "@ez4/storage": "^0.10.0"
50
50
  },
51
51
  "dependencies": {
52
52
  "@aws-sdk/client-s3": "^3.614.0",
53
53
  "@aws-sdk/s3-request-presigner": "^3.651.0",
54
- "@ez4/aws-common": "^0.9.0",
55
- "@ez4/aws-identity": "^0.9.0",
56
- "@ez4/stateful": "^0.9.0",
57
- "@ez4/utils": "^0.9.0",
54
+ "@ez4/aws-common": "^0.10.0",
55
+ "@ez4/aws-identity": "^0.10.0",
56
+ "@ez4/stateful": "^0.10.0",
57
+ "@ez4/utils": "^0.10.0",
58
58
  "mime": "^3.0.0"
59
59
  }
60
60
  }