@ez4/aws-bucket 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bucket/client.d.ts +2 -1
- package/dist/bucket/provider.d.ts +1 -0
- package/dist/bucket/service.d.ts +0 -1
- package/dist/bucket/types.d.ts +3 -3
- package/dist/bucket/utils.d.ts +7 -0
- package/dist/client.cjs +15 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.mjs +12 -0
- package/dist/main.cjs +81 -38
- package/dist/main.d.ts +6 -0
- package/dist/main.mjs +73 -33
- package/dist/object/client.d.ts +0 -2
- package/dist/object/provider.d.ts +1 -0
- package/dist/object/service.d.ts +0 -1
- package/dist/object/types.d.ts +2 -2
- package/dist/object/utils.d.ts +7 -5
- package/dist/policy/client.d.ts +10 -0
- package/dist/policy/handler.d.ts +3 -0
- package/dist/policy/provider.d.ts +1 -0
- package/dist/policy/service.d.ts +4 -0
- package/dist/policy/types.d.ts +15 -0
- package/dist/policy/utils.d.ts +3 -0
- package/dist/triggers/bucket.d.ts +2 -0
- package/dist/triggers/client.d.ts +2 -0
- package/dist/triggers/content.d.ts +3 -0
- package/dist/triggers/policy.d.ts +2 -0
- package/dist/triggers/register.d.ts +1 -0
- package/dist/triggers/utils.d.ts +3 -0
- package/dist/utils/bucket.d.ts +1 -0
- package/dist/utils/policy.d.ts +2 -0
- package/package.json +17 -4
package/dist/bucket/client.d.ts
CHANGED
|
@@ -4,8 +4,9 @@ export type CreateRequest = {
|
|
|
4
4
|
};
|
|
5
5
|
export type CreateResponse = {
|
|
6
6
|
bucketName: string;
|
|
7
|
-
location: string;
|
|
8
7
|
};
|
|
9
8
|
export declare const createBucket: (request: CreateRequest) => Promise<CreateResponse>;
|
|
10
9
|
export declare const tagBucket: (bucketName: string, tags: ResourceTags) => Promise<void>;
|
|
10
|
+
export declare const createLifecycle: (bucketName: string, autoExpireDays: number) => Promise<void>;
|
|
11
|
+
export declare const deleteLifecycle: (bucketName: string) => Promise<void>;
|
|
11
12
|
export declare const deleteBucket: (bucketName: string) => Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const registerBucketProvider: () => void;
|
package/dist/bucket/service.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { EntryState, EntryStates } from '@ez4/stateful';
|
|
2
2
|
import type { BucketParameters, BucketState } from './types.js';
|
|
3
|
-
export declare const isBucket: (resource: EntryState) => resource is BucketState;
|
|
4
3
|
export declare const createBucket: <E extends EntryState>(state: EntryStates<E>, parameters: BucketParameters) => BucketState;
|
package/dist/bucket/types.d.ts
CHANGED
|
@@ -4,11 +4,11 @@ import type { CreateRequest, CreateResponse } from './client.js';
|
|
|
4
4
|
export declare const BucketServiceName = "AWS:S3/Bucket";
|
|
5
5
|
export declare const BucketServiceType = "aws:s3.bucket";
|
|
6
6
|
export type BucketParameters = CreateRequest & {
|
|
7
|
+
autoExpireDays?: number;
|
|
8
|
+
localPath?: string;
|
|
7
9
|
tags?: ResourceTags;
|
|
8
10
|
};
|
|
9
|
-
export type BucketResult = CreateResponse
|
|
10
|
-
bucketName: string;
|
|
11
|
-
};
|
|
11
|
+
export type BucketResult = CreateResponse;
|
|
12
12
|
export type BucketState = EntryState & {
|
|
13
13
|
type: typeof BucketServiceType;
|
|
14
14
|
parameters: BucketParameters;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EntryState, EntryStates, StepContext } from '@ez4/stateful';
|
|
2
|
+
import type { BucketState } from './types.js';
|
|
3
|
+
export declare const isBucketState: (resource: EntryState) => resource is BucketState;
|
|
4
|
+
export declare const getBucketStateId: (bucketName: string) => string;
|
|
5
|
+
export declare const getBucketState: (state: EntryStates, bucketName: string) => BucketState;
|
|
6
|
+
export declare const getBucketDomain: (bucketName: string) => Promise<string>;
|
|
7
|
+
export declare const getBucketName: <E extends EntryState>(serviceName: string, resourceId: string, context: StepContext<E | BucketState>) => any;
|
package/dist/client.cjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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});
|
package/dist/client.d.ts
ADDED
package/dist/client.mjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
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};
|
package/dist/main.cjs
CHANGED
|
@@ -1,38 +1,81 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof t=="object"||typeof t=="function")for(let c of $(t))!
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
m
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
o.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
e
|
|
38
|
-
|
|
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})},D=(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)):{},D(t||!e||!e.__esModule?B(r,"default",{value:e,
|
|
4
|
+
enumerable:!0}):r,e)),We=e=>D(B({},"__esModule",{value:!0}),e);var dt={};Ue(dt,{BucketServiceName:()=>n,BucketServiceType:()=>i,ObjectServiceName:()=>y,
|
|
5
|
+
ObjectServiceType:()=>p,PolicyServiceName:()=>f,PolicyServiceType:()=>u,createBucket:()=>N,
|
|
6
|
+
createBucketObject:()=>St,createBucketPolicy:()=>ft,getBucketDomain:()=>_e,getBucketName:()=>b,
|
|
7
|
+
getBucketObjectFiles:()=>at,getBucketObjectPath:()=>P,getBucketState:()=>Ye,getBucketStateId:()=>E,
|
|
8
|
+
isBucketObjectState:()=>st,isBucketPolicyState:()=>gt,isBucketState:()=>J,registerTriggers:()=>lt});
|
|
9
|
+
module.exports=We(dt);var Te=require("@ez4/aws-common"),he=require("@ez4/aws-identity"),Ne=require("@ez4/storage/library"),
|
|
10
|
+
De=require("@ez4/project/library");var U=require("@ez4/aws-common");var H=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({}),z=async e=>{let{bucketName:t}=e;return m.Logger.logCreate(
|
|
11
|
+
n,t),await k.send(new a.CreateBucketCommand({Bucket:t})),{bucketName:t}},I=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"})}}))},L=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}}]}}))},q=async e=>{m.Logger.logDelete(n,`${e} li\
|
|
17
|
+
fecycle`),await k.send(new a.DeleteBucketLifecycleCommand({Bucket:e}))},K=async e=>{
|
|
18
|
+
m.Logger.logDelete(n,e),await k.send(new a.DeleteBucketCommand({Bucket:e}))};var M=()=>({equals:Ze,create:$,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 H.ReplaceResourceError(
|
|
22
|
+
n,e.entryId,t.entryId);return $(e)},$=async e=>{let t=e.parameters,{bucketName:r}=await z(
|
|
23
|
+
t);return await Promise.all([F(r,t,void 0),A(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([F(c,o,t.parameters),A(c,o.tags,t.parameters.tags)])},Xe=async e=>{let t=e.result;
|
|
26
|
+
t&&await K(t.bucketName)},F=async(e,t,r)=>{if(t.autoExpireDays!==r?.autoExpireDays){
|
|
27
|
+
if(t.autoExpireDays)return L(e,t.autoExpireDays);if(r?.autoExpireDays)return q(e)}},
|
|
28
|
+
A=async(e,t,r)=>{let o=t??{};!(0,j.deepEqual)(o,r??{})&&await I(e,o)};var G=()=>{(0,U.registerProvider)(i,M())};var te=require("@ez4/aws-common");var Y=require("@ez4/aws-common");var R=require("@ez4/stateful"),W=require("@ez4/aws-common"),w=require("@ez4/utils"),
|
|
29
|
+
Z=require("@ez4/aws-identity");var J=e=>e.type===i,E=e=>(0,w.hashData)(i,(0,w.toKebabCase)(e)),Ye=(e,t)=>{let r=(0,R.getEntry)(
|
|
30
|
+
e,E(t));if(!J(r))throw new R.EntryNotFoundError(r.entryId);return r},_e=async e=>{
|
|
31
|
+
let t=await(0,Z.getRegion)();return`${e}.s3.${t}.amazonaws.com`},b=(e,t,r)=>{let o=r.
|
|
32
|
+
getDependencies(i).at(0)?.result;if(!o?.bucketName)throw new W.IncompleteResourceError(
|
|
33
|
+
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.
|
|
34
|
+
logCreate(f,t),await Q.send(new S.PutBucketPolicyCommand({Bucket:t,Policy:JSON.stringify(
|
|
35
|
+
r)})),{bucketName:t}},X=async e=>{O.Logger.logDelete(f,e),await Q.send(new S.DeleteBucketPolicyCommand(
|
|
36
|
+
{Bucket:e}))};var _=()=>({equals:et,create:ee,replace:rt,preview:tt,update:ot,delete:ct}),et=(e,t)=>!!e.
|
|
37
|
+
result&&e.result.bucketName===t.result?.bucketName,tt=async()=>{},rt=async(e,t,r)=>{
|
|
38
|
+
if(t.result)throw new Y.ReplaceResourceError(f,e.entryId,t.entryId);return ee(e,
|
|
39
|
+
r)},ee=async(e,t)=>{let r=e.parameters,o=b(f,"policy",t),c=await r.getRole(t);return await V(
|
|
40
|
+
{bucketName:o,role:c}),{bucketName:o}},ot=async()=>{},ct=async e=>{let t=e.result;
|
|
41
|
+
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),
|
|
42
|
+
l=require("@aws-sdk/client-s3");var y="AWS:S3/Object",p="aws:s3.object";var st=e=>e.type===p,P=(e,t)=>`${e}/${t}`,at=e=>e.getDependencies(p).map(({result:r})=>({
|
|
43
|
+
lastModified:r?.lastModified,objectKey:r?.objectKey}));var v=new l.S3Client({}),T=async(e,t)=>{let{objectKey:r,filePath:o}=t;d.Logger.logCreate(
|
|
44
|
+
y,P(e,r));let c=ce.default.getType(o);return await v.send(new l.PutObjectCommand(
|
|
45
|
+
{Bucket:e,Key:r,Body:(0,oe.createReadStream)(o),...c&&{ContentType:c}})),{objectKey:r}},
|
|
46
|
+
se=async(e,t,r)=>{d.Logger.logTag(y,P(e,t)),await v.send(new l.PutObjectTaggingCommand(
|
|
47
|
+
{Bucket:e,Key:t,Tagging:{TagSet:(0,d.getTagList)({...r,ManagedBy:"EZ4"})}}))},ae=async(e,t)=>{
|
|
48
|
+
d.Logger.logDelete(y,P(e,t)),await v.send(new l.DeleteObjectCommand({Bucket:e,Key:t}))};var pe=()=>({equals:nt,create:me,replace:pt,preview:it,update:mt,delete:ut}),nt=(e,t)=>!!e.
|
|
49
|
+
result&&e.result.objectKey===t.result?.objectKey,it=async(e,t)=>{let r=e.parameters,
|
|
50
|
+
o=t.parameters,c=(0,C.deepCompare)({...r,dependencies:e.dependencies,lastModified:await h(
|
|
51
|
+
r.filePath)},{...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});
|
|
52
|
+
if(c.counts)return{...c,name:r.objectKey}},pt=async(e,t,r)=>{if(t.result)throw new ie.ReplaceResourceError(
|
|
53
|
+
y,e.entryId,t.entryId);return me(e,r)},me=async(e,t)=>{let r=e.parameters,o=b(y,
|
|
54
|
+
"bucket",t),c=await h(r.filePath),{objectKey:s}=await T(o,r);return await ue(o,s,
|
|
55
|
+
r.tags,e.parameters.tags),{lastModified:c,bucketName:o,objectKey:s}},mt=async(e,t)=>{
|
|
56
|
+
let{result:r,parameters:o}=e;if(!r)return;let{bucketName:c,objectKey:s}=r,g=yt(r,
|
|
57
|
+
o,t.parameters);return await ue(c,s,o.tags,t.parameters.tags),g},ut=async e=>{let t=e.
|
|
58
|
+
result;t&&await ae(t.bucketName,t.objectKey)},h=async e=>{let{mtime:t}=await(0,ne.stat)(
|
|
59
|
+
e);return t.getTime()},yt=async(e,t,r)=>{let o=await h(t.filePath);if(o<=e.lastModified&&
|
|
60
|
+
t.filePath===r.filePath)return e;let{bucketName:c,objectKey:s}=e;return await T(
|
|
61
|
+
c,{...t,objectKey:s}),{lastModified:o,bucketName:c,objectKey:s}},ue=async(e,t,r,o)=>{
|
|
62
|
+
let c=r??{};!(0,C.deepEqual)(c,o??{})&&await se(e,t,c)};var le=()=>{(0,ye.registerProvider)(p,pe())};var Se=require("@ez4/aws-identity");var fe=require("@ez4/aws-identity"),ge=e=>(0,fe.createPolicyDocument)([{resourceIds:[
|
|
63
|
+
`arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:["s3:ListBucket","s3:\
|
|
64
|
+
PutObject","s3:GetObject","s3:DeleteObject"]}]);var de=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:c}=r,s=`${o}\
|
|
65
|
+
-${c}`;return(0,Se.createPolicy)(t,{policyName:`${s}-bucket-policy`,policyDocument:ge(
|
|
66
|
+
s)})};var je=require("@ez4/project/library"),Re=require("@ez4/storage/library");var ke=require("@ez4/utils"),be=require("@ez4/stateful");var N=(e,t)=>{let r=(0,ke.toKebabCase)(t.bucketName),o=E(t.bucketName);return(0,be.attachEntry)(
|
|
67
|
+
e,{type:i,entryId:o,dependencies:[],parameters:{...t,bucketName:r}})};var Pe=require("node:fs/promises"),x=require("node:path"),xe=require("@ez4/aws-bucket"),
|
|
68
|
+
Be=async(e,t,r)=>{let o=(0,x.join)(process.cwd(),r),c=await(0,Pe.readdir)(o,{withFileTypes:!0,
|
|
69
|
+
recursive:!0});for(let s of c){if(!s.isFile())continue;let g=(0,x.join)(s.parentPath,
|
|
70
|
+
s.name),Ke=(0,x.relative)(o,g);(0,xe.createBucketObject)(e,t,{objectKey:Ke,filePath:g})}};var we=async e=>{let{state:t,service:r,options:o}=e;if(!(0,Re.isBucketService)(r))
|
|
71
|
+
return;let{autoExpireDays:c,localPath:s}=r,g=N(t,{bucketName:(0,je.getServiceName)(
|
|
72
|
+
r,o),autoExpireDays:c,localPath:s});s&&await Be(t,g,s)};var Ee=require("@ez4/storage/library"),Ce=require("@ez4/project/library"),Oe=async e=>{
|
|
73
|
+
let{service:t,options:r}=e;return(0,Ee.isBucketService)(t)?{constructor:`make('${(0,Ce.getServiceName)(
|
|
74
|
+
t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var ve=!1,lt=()=>{ve||((0,Te.registerTriggers)(),(0,he.registerTriggers)(),(0,Ne.registerTriggers)(),
|
|
75
|
+
(0,De.createTrigger)("@ez4/aws-bucket",{"deploy:prepareExecutionPolicy":de,"depl\
|
|
76
|
+
oy:prepareLinkedService":Oe,"deploy:prepareResources":we}),G(),re(),le(),ve=!0)};var ze=require("@ez4/stateful"),Ie=require("@ez4/utils");var ft=(e,t,r,o)=>{let c=(0,Ie.hashData)(u,t.entryId,r.entryId);return(0,ze.attachEntry)(
|
|
77
|
+
e,{type:u,entryId:c,dependencies:[t.entryId,r.entryId],parameters:o})};var gt=e=>e.type===u;var Le=require("@ez4/stateful"),qe=require("@ez4/utils");var St=(e,t,r)=>{let o=r.objectKey,c=(0,qe.hashData)(p,t.entryId,o);return(0,Le.attachEntry)(
|
|
78
|
+
e,{type:p,entryId:c,dependencies:[t.entryId],parameters:r})};0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
|
|
79
|
+
PolicyServiceName,PolicyServiceType,createBucket,createBucketObject,createBucketPolicy,
|
|
80
|
+
getBucketDomain,getBucketName,getBucketObjectFiles,getBucketObjectPath,getBucketState,
|
|
81
|
+
getBucketStateId,isBucketObjectState,isBucketPolicyState,isBucketState,registerTriggers});
|
package/dist/main.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
export * from './triggers/register.js';
|
|
1
2
|
export * from './bucket/service.js';
|
|
2
3
|
export * from './bucket/types.js';
|
|
4
|
+
export * from './bucket/utils.js';
|
|
5
|
+
export * from './policy/service.js';
|
|
6
|
+
export * from './policy/types.js';
|
|
7
|
+
export * from './policy/utils.js';
|
|
3
8
|
export * from './object/service.js';
|
|
4
9
|
export * from './object/types.js';
|
|
10
|
+
export * from './object/utils.js';
|
package/dist/main.mjs
CHANGED
|
@@ -1,33 +1,73 @@
|
|
|
1
|
-
import{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
a
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
1
|
+
import{registerTriggers as pt}from"@ez4/aws-common";import{registerTriggers as mt}from"@ez4/aws-identity";
|
|
2
|
+
import{registerTriggers as ut}from"@ez4/storage/library";import{createTrigger as yt}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 De}from"@ez4/aws-common";import{ReplaceResourceError as Ce}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";import{getRegion as Be}from"@ez4/aws-identity";var je=e=>e.type===n,d=e=>Pe(n,xe(e)),Lt=(e,t)=>{let r=ke(e,d(t));if(!je(r))throw new de(
|
|
23
|
+
r.entryId);return r},qt=async e=>{let t=await Be();return`${e}.s3.${t}.amazonaws\
|
|
24
|
+
.com`},g=(e,t,r)=>{let o=r.getDependencies(n).at(0)?.result;if(!o?.bucketName)throw new be(
|
|
25
|
+
e,t,"bucketName");return o.bucketName};import{Logger as N}from"@ez4/aws-common";import{S3Client as Re,PutBucketPolicyCommand as we,
|
|
26
|
+
DeleteBucketPolicyCommand as Ee}from"@aws-sdk/client-s3";var y="AWS:S3/Policy",p="aws:s3.policy";var D=new Re({}),z=async e=>{let{bucketName:t,role:r}=e;return N.logCreate(y,t),
|
|
27
|
+
await D.send(new we({Bucket:t,Policy:JSON.stringify(r)})),{bucketName:t}},I=async e=>{
|
|
28
|
+
N.logDelete(y,e),await D.send(new Ee({Bucket:e}))};var L=()=>({equals:Oe,create:q,replace:Te,preview:ve,update:he,delete:Ne}),Oe=(e,t)=>!!e.
|
|
29
|
+
result&&e.result.bucketName===t.result?.bucketName,ve=async()=>{},Te=async(e,t,r)=>{
|
|
30
|
+
if(t.result)throw new Ce(y,e.entryId,t.entryId);return q(e,r)},q=async(e,t)=>{let r=e.
|
|
31
|
+
parameters,o=g(y,"policy",t),c=await r.getRole(t);return await z({bucketName:o,role:c}),
|
|
32
|
+
{bucketName:o}},he=async()=>{},Ne=async e=>{let t=e.result;t&&await I(t.bucketName)};var K=()=>{De(p,L())};import{registerProvider as Xe}from"@ez4/aws-common";import{stat as $e}from"node:fs/promises";import{ReplaceResourceError as Fe}from"@ez4/aws-common";
|
|
33
|
+
import{deepCompare as Ae,deepEqual as Ue}from"@ez4/utils";import{getTagList as ze,Logger as k}from"@ez4/aws-common";import{createReadStream as Ie}from"node:fs";
|
|
34
|
+
import Le from"mime";import{PutObjectCommand as qe,PutObjectTaggingCommand as Ke,
|
|
35
|
+
DeleteObjectCommand as He,S3Client as Me}from"@aws-sdk/client-s3";var m="AWS:S3/Object",i="aws:s3.object";var rr=e=>e.type===i,S=(e,t)=>`${e}/${t}`,or=e=>e.getDependencies(i).map(({result:r})=>({
|
|
36
|
+
lastModified:r?.lastModified,objectKey:r?.objectKey}));var b=new Me({}),P=async(e,t)=>{let{objectKey:r,filePath:o}=t;k.logCreate(m,S(e,
|
|
37
|
+
r));let c=Le.getType(o);return await b.send(new qe({Bucket:e,Key:r,Body:Ie(o),...c&&
|
|
38
|
+
{ContentType:c}})),{objectKey:r}},H=async(e,t,r)=>{k.logTag(m,S(e,t)),await b.send(
|
|
39
|
+
new Ke({Bucket:e,Key:t,Tagging:{TagSet:ze({...r,ManagedBy:"EZ4"})}}))},M=async(e,t)=>{
|
|
40
|
+
k.logDelete(m,S(e,t)),await b.send(new He({Bucket:e,Key:t}))};var $=()=>({equals:Ge,create:F,replace:Ze,preview:We,update:Je,delete:Qe}),Ge=(e,t)=>!!e.
|
|
41
|
+
result&&e.result.objectKey===t.result?.objectKey,We=async(e,t)=>{let r=e.parameters,
|
|
42
|
+
o=t.parameters,c=Ae({...r,dependencies:e.dependencies,lastModified:await x(r.filePath)},
|
|
43
|
+
{...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});if(c.counts)
|
|
44
|
+
return{...c,name:r.objectKey}},Ze=async(e,t,r)=>{if(t.result)throw new Fe(m,e.entryId,
|
|
45
|
+
t.entryId);return F(e,r)},F=async(e,t)=>{let r=e.parameters,o=g(m,"bucket",t),c=await x(
|
|
46
|
+
r.filePath),{objectKey:s}=await P(o,r);return await A(o,s,r.tags,e.parameters.tags),
|
|
47
|
+
{lastModified:c,bucketName:o,objectKey:s}},Je=async(e,t)=>{let{result:r,parameters:o}=e;
|
|
48
|
+
if(!r)return;let{bucketName:c,objectKey:s}=r,u=Ve(r,o,t.parameters);return await A(
|
|
49
|
+
c,s,o.tags,t.parameters.tags),u},Qe=async e=>{let t=e.result;t&&await M(t.bucketName,
|
|
50
|
+
t.objectKey)},x=async e=>{let{mtime:t}=await $e(e);return t.getTime()},Ve=async(e,t,r)=>{
|
|
51
|
+
let o=await x(t.filePath);if(o<=e.lastModified&&t.filePath===r.filePath)return e;
|
|
52
|
+
let{bucketName:c,objectKey:s}=e;return await P(c,{...t,objectKey:s}),{lastModified:o,
|
|
53
|
+
bucketName:c,objectKey:s}},A=async(e,t,r,o)=>{let c=r??{};!Ue(c,o??{})&&await H(
|
|
54
|
+
e,t,c)};var U=()=>{Xe(i,$())};import{createPolicy as _e}from"@ez4/aws-identity";import{createPolicyDocument as Ye}from"@ez4/aws-identity";var G=e=>Ye([{resourceIds:[
|
|
55
|
+
`arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:["s3:ListBucket","s3:\
|
|
56
|
+
PutObject","s3:GetObject","s3:DeleteObject"]}]);var W=async e=>{let{state:t,options:r}=e,{resourcePrefix:o,projectName:c}=r,s=`${o}\
|
|
57
|
+
-${c}`;return _e(t,{policyName:`${s}-bucket-policy`,policyDocument:G(s)})};import{getServiceName as st}from"@ez4/project/library";import{isBucketService as at}from"@ez4/storage/library";import{toKebabCase as et}from"@ez4/utils";import{attachEntry as tt}from"@ez4/stateful";var Z=(e,t)=>{let r=et(t.bucketName),o=d(t.bucketName);return tt(e,{type:n,entryId:o,
|
|
58
|
+
dependencies:[],parameters:{...t,bucketName:r}})};import{readdir as rt}from"node:fs/promises";import{join as J,relative as ot}from"node:path";
|
|
59
|
+
import{createBucketObject as ct}from"@ez4/aws-bucket";var Q=async(e,t,r)=>{let o=J(
|
|
60
|
+
process.cwd(),r),c=await rt(o,{withFileTypes:!0,recursive:!0});for(let s of c){if(!s.
|
|
61
|
+
isFile())continue;let u=J(s.parentPath,s.name),_=ot(o,u);ct(e,t,{objectKey:_,filePath:u})}};var V=async e=>{let{state:t,service:r,options:o}=e;if(!at(r))return;let{autoExpireDays:c,
|
|
62
|
+
localPath:s}=r,u=Z(t,{bucketName:st(r,o),autoExpireDays:c,localPath:s});s&&await Q(
|
|
63
|
+
t,u,s)};import{isBucketService as nt}from"@ez4/storage/library";import{getServiceName as it}from"@ez4/project/library";
|
|
64
|
+
var X=async e=>{let{service:t,options:r}=e;return nt(t)?{constructor:`make('${it(
|
|
65
|
+
t,r)}')`,module:"Client",from:"@ez4/aws-bucket/client"}:null};var Y=!1,to=()=>{Y||(pt(),mt(),ut(),yt("@ez4/aws-bucket",{"deploy:prepareExecuti\
|
|
66
|
+
onPolicy":W,"deploy:prepareLinkedService":X,"deploy:prepareResources":V}),h(),K(),
|
|
67
|
+
U(),Y=!0)};import{attachEntry as lt}from"@ez4/stateful";import{hashData as ft}from"@ez4/utils";var ao=(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 po=e=>e.type===p;import{attachEntry as gt}from"@ez4/stateful";import{hashData as St}from"@ez4/utils";var fo=(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,fo as createBucketObject,
|
|
71
|
+
ao as createBucketPolicy,qt as getBucketDomain,g as getBucketName,or as getBucketObjectFiles,
|
|
72
|
+
S as getBucketObjectPath,Lt as getBucketState,d as getBucketStateId,rr as isBucketObjectState,
|
|
73
|
+
po as isBucketPolicyState,je as isBucketState,to as registerTriggers};
|
package/dist/object/client.d.ts
CHANGED
|
@@ -2,11 +2,9 @@ import type { ResourceTags } from '@ez4/aws-common';
|
|
|
2
2
|
export type CreateRequest = {
|
|
3
3
|
filePath: string;
|
|
4
4
|
objectKey: string;
|
|
5
|
-
expires?: Date;
|
|
6
5
|
};
|
|
7
6
|
export type CreateResponse = {
|
|
8
7
|
objectKey: string;
|
|
9
|
-
etag: string;
|
|
10
8
|
};
|
|
11
9
|
export declare const putObject: (bucketName: string, request: CreateRequest) => Promise<CreateResponse>;
|
|
12
10
|
export declare const tagObject: (bucketName: string, objectKey: string, tags: ResourceTags) => Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const registerObjectProvider: () => void;
|
package/dist/object/service.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { EntryState, EntryStates } from '@ez4/stateful';
|
|
2
2
|
import type { BucketState } from '../bucket/types.js';
|
|
3
3
|
import type { ObjectParameters, ObjectState } from './types.js';
|
|
4
|
-
export declare const isBucketObject: (resource: EntryState) => resource is ObjectState;
|
|
5
4
|
export declare const createBucketObject: <E extends EntryState>(state: EntryStates<E>, bucketState: BucketState, parameters: ObjectParameters) => ObjectState;
|
package/dist/object/types.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ import type { ResourceTags } from '@ez4/aws-common';
|
|
|
3
3
|
import type { CreateRequest, CreateResponse } from './client.js';
|
|
4
4
|
export declare const ObjectServiceName = "AWS:S3/Object";
|
|
5
5
|
export declare const ObjectServiceType = "aws:s3.object";
|
|
6
|
-
export type ObjectParameters =
|
|
7
|
-
objectKey?: string;
|
|
6
|
+
export type ObjectParameters = CreateRequest & {
|
|
8
7
|
tags?: ResourceTags;
|
|
9
8
|
};
|
|
10
9
|
export type ObjectResult = CreateResponse & {
|
|
10
|
+
lastModified: number;
|
|
11
11
|
bucketName: string;
|
|
12
12
|
};
|
|
13
13
|
export type ObjectState = EntryState & {
|
package/dist/object/utils.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { EntryState, StepContext } from '@ez4/stateful';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
|
|
2
|
+
import { ObjectState } from './types.js';
|
|
3
|
+
export declare const isBucketObjectState: (resource: EntryState) => resource is ObjectState;
|
|
4
|
+
export declare const getBucketObjectPath: (bucketName: string, objectKey: string) => string;
|
|
5
|
+
export declare const getBucketObjectFiles: <E extends EntryState>(context: StepContext<E | ObjectState>) => {
|
|
6
|
+
lastModified: any;
|
|
7
|
+
objectKey: any;
|
|
8
|
+
}[];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RoleDocument } from '@ez4/aws-identity';
|
|
2
|
+
export type CreateRequest = {
|
|
3
|
+
bucketName: string;
|
|
4
|
+
role: RoleDocument;
|
|
5
|
+
};
|
|
6
|
+
export type CreateResponse = {
|
|
7
|
+
bucketName: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const createPolicy: (request: CreateRequest) => Promise<CreateResponse>;
|
|
10
|
+
export declare const deletePolicy: (bucketName: string) => Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const registerPolicyProvider: () => void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EntryState, EntryStates } from '@ez4/stateful';
|
|
2
|
+
import type { PolicyParameters, PolicyState } from './types.js';
|
|
3
|
+
import { BucketState } from '../main.js';
|
|
4
|
+
export declare const createBucketPolicy: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, bucketState: BucketState, parameters: PolicyParameters) => PolicyState;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RoleDocument } from '@ez4/aws-identity';
|
|
2
|
+
import type { EntryState, StepContext } from '@ez4/stateful';
|
|
3
|
+
import type { CreateResponse } from './client.js';
|
|
4
|
+
export declare const PolicyServiceName = "AWS:S3/Policy";
|
|
5
|
+
export declare const PolicyServiceType = "aws:s3.policy";
|
|
6
|
+
export type GetRole = (context: StepContext) => Promise<RoleDocument> | RoleDocument;
|
|
7
|
+
export type PolicyParameters = {
|
|
8
|
+
getRole: GetRole;
|
|
9
|
+
};
|
|
10
|
+
export type PolicyResult = CreateResponse;
|
|
11
|
+
export type PolicyState = EntryState & {
|
|
12
|
+
type: typeof PolicyServiceType;
|
|
13
|
+
parameters: PolicyParameters;
|
|
14
|
+
result?: PolicyResult;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const registerTriggers: () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getBucketId: (bucketName: string) => string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ez4/aws-bucket",
|
|
3
3
|
"description": "EZ4: Self-managed AWS S3 buckets",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"author": "Silas B.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
"types": "./dist/main.d.ts",
|
|
14
14
|
"require": "./dist/main.cjs",
|
|
15
15
|
"import": "./dist/main.mjs"
|
|
16
|
+
},
|
|
17
|
+
"./client": {
|
|
18
|
+
"types": "./dist/client.d.ts",
|
|
19
|
+
"require": "./dist/client.cjs",
|
|
20
|
+
"import": "./dist/client.mjs"
|
|
16
21
|
}
|
|
17
22
|
},
|
|
18
23
|
"workspaces": [
|
|
@@ -28,10 +33,18 @@
|
|
|
28
33
|
"clean:registry": "rm -rf ../../.registry/@ez4/aws-bucket",
|
|
29
34
|
"live:publish": "npm run test && npm publish --access public"
|
|
30
35
|
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/mime": "^3.0.0"
|
|
38
|
+
},
|
|
31
39
|
"dependencies": {
|
|
32
40
|
"@aws-sdk/client-s3": "^3.614.0",
|
|
33
|
-
"@
|
|
34
|
-
"@ez4/
|
|
35
|
-
"@ez4/
|
|
41
|
+
"@aws-sdk/s3-request-presigner": "^3.651.0",
|
|
42
|
+
"@ez4/aws-common": "^0.5.0",
|
|
43
|
+
"@ez4/aws-identity": "^0.5.0",
|
|
44
|
+
"@ez4/project": "^0.5.0",
|
|
45
|
+
"@ez4/stateful": "^0.5.0",
|
|
46
|
+
"@ez4/storage": "^0.5.0",
|
|
47
|
+
"@ez4/utils": "^0.5.0",
|
|
48
|
+
"mime": "^3.0.0"
|
|
36
49
|
}
|
|
37
50
|
}
|