@ez4/aws-function 0.4.0 → 0.6.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
@@ -10,6 +10,34 @@ It provides all the components to manage lambda functions on AWS.
10
10
  npm install @ez4/aws-function -D
11
11
  ```
12
12
 
13
+ #### Permission
14
+
15
+ Ensure the user performing deployments has the permissions below:
16
+
17
+ ```json
18
+ {
19
+ "Version": "2012-10-17",
20
+ "Statement": [
21
+ {
22
+ "Sid": "LambdaManagement",
23
+ "Effect": "Allow",
24
+ "Action": [
25
+ "lambda:CreateFunction",
26
+ "lambda:DeleteFunction",
27
+ "lambda:UpdateFunctionCode",
28
+ "lambda:GetFunctionConfiguration",
29
+ "lambda:UpdateFunctionConfiguration",
30
+ "lambda:AddPermission",
31
+ "lambda:RemovePermission",
32
+ "lambda:TagResource",
33
+ "lambda:UntagResource"
34
+ ],
35
+ "Resource": ["arn:aws:lambda:*:{account-id}:function:{prefix}-*"]
36
+ }
37
+ ]
38
+ }
39
+ ```
40
+
13
41
  ## License
14
42
 
15
43
  MIT License
@@ -0,0 +1 @@
1
+ export declare const registerFunctionProvider: () => void;
@@ -2,7 +2,6 @@ import type { RoleState } from '@ez4/aws-identity';
2
2
  import type { EntryState, EntryStates } from '@ez4/stateful';
3
3
  import type { FunctionParameters, FunctionState } from './types.js';
4
4
  import { FunctionServiceType } from './types.js';
5
- export declare const isFunction: (resource: EntryState) => resource is FunctionState;
6
5
  export declare const createFunction: <E extends EntryState>(state: EntryStates<E>, roleState: RoleState, parameters: FunctionParameters) => FunctionState;
7
6
  export declare const getFunction: <E extends EntryState>(state: EntryStates<E>, roleState: RoleState, functionName: string) => (E & EntryState & {
8
7
  type: typeof FunctionServiceType;
@@ -1,4 +1,5 @@
1
1
  import type { EntryState, StepContext } from '@ez4/stateful';
2
2
  import type { FunctionState } from './types.js';
3
+ export declare const isFunctionState: (resource: EntryState) => resource is FunctionState;
3
4
  export declare const getFunctionName: <E extends EntryState>(serviceName: string, resourceId: string, context: StepContext<E | FunctionState>) => any;
4
5
  export declare const getFunctionArn: <E extends EntryState>(serviceName: string, resourceId: string, context: StepContext<E | FunctionState>) => any;
package/dist/main.cjs CHANGED
@@ -1,102 +1,100 @@
1
- "use strict";var Ne=Object.create;var b=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var he=Object.getOwnPropertyNames;var Me=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty;var ze=(e,t)=>{for(var n in t)b(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,r)=>{if(t&&
2
- typeof t=="object"||typeof t=="function")for(let o of he(t))!Te.call(e,o)&&o!==n&&
3
- b(e,o,{get:()=>t[o],enumerable:!(r=Ie(t,o))||r.enumerable});return e};var Ue=(e,t,n)=>(n=e!=null?Ne(Me(e)):{},L(t||!e||!e.__esModule?b(n,"default",{value:e,
4
- enumerable:!0}):n,e)),De=e=>L(b({},"__esModule",{value:!0}),e);var dt={};ze(dt,{FunctionServiceName:()=>i,FunctionServiceType:()=>u,MappingServiceName:()=>y,
5
- MappingServiceType:()=>F,PermissionServiceName:()=>w,PermissionServiceType:()=>d,
6
- createFunction:()=>at,createMapping:()=>mt,createPermission:()=>it,getFunction:()=>st,
7
- getFunctionArn:()=>Ge,getFunctionName:()=>R,getPermission:()=>pt,isFunction:()=>Fe,
8
- isMapping:()=>ct,isPermission:()=>Pe,registerTriggers:()=>ut});module.exports=De(
9
- dt);var T=require("@ez4/aws-common");var ee=require("@aws-sdk/client-lambda"),P=require("@ez4/aws-common"),l=require("@ez4/utils"),
10
- D=require("@ez4/aws-identity");var s=require("@aws-sdk/client-lambda"),f=require("@ez4/aws-common");var B=require("@ez4/aws-common"),$=require("@ez4/utils");var i="AWS:Lambda/Function",u="aws:lambda.function";var He=/[a-z][\w]+/i,je=e=>He.test(e),z=e=>{for(let t in e)if(!je(t))throw new B.InvalidParameterError(
11
- i,`${t} is an invalid variable name .`)},N=e=>{let t={};for(let n in e)t[n]=(0,$.hashData)(
12
- e[n]);return t};var W=Ue(require("adm-zip"),1),Z=require("node:fs/promises"),k=async(e,t)=>{let n=new W.default,
13
- r=await(0,Z.readFile)(e);return n.addFile(t,r),n.toBufferPromise()};var S=new s.LambdaClient({}),U={maxWaitTime:90,client:S},G=async e=>{let{functionName:t,
14
- variables:n}=e;f.Logger.logCreate(i,t),n&&z(n);let{description:r,memory:o,timeout:a,
15
- roleArn:c,handlerName:m,sourceFile:x,tags:g}=e,be=(await S.send(new s.CreateFunctionCommand(
16
- {Publish:!0,FunctionName:t,Description:r,MemorySize:o,Timeout:a,Role:c,PackageType:"\
17
- Zip",Handler:Y(m),Runtime:"nodejs20.x",Code:{ZipFile:await X(x)},Environment:{Variables:n},
18
- Tags:{...g,ManagedBy:"EZ4"}}))).FunctionArn;return await(0,s.waitUntilFunctionActive)(
19
- U,{FunctionName:t}),{functionArn:be}},O=async(e,t)=>{f.Logger.logTag(i,e),await S.
20
- send(new s.TagResourceCommand({Resource:e,Tags:{...t,ManagedBy:"EZ4"}}))},K=async(e,t)=>{
21
- f.Logger.logUntag(i,e),await S.send(new s.UntagResourceCommand({Resource:e,TagKeys:t}))},
22
- _=async(e,t)=>{f.Logger.logUpdate(i,`${e} source code`);let{sourceFile:n}=t;await S.
23
- send(new s.UpdateFunctionCodeCommand({FunctionName:e,ZipFile:await X(n),Publish:!0})),
24
- await(0,s.waitUntilFunctionUpdated)(U,{FunctionName:e})},J=async(e,t)=>{let{variables:n}=t;
25
- f.Logger.logUpdate(i,`${e} configuration`),n&&z(n);let{description:r,memory:o,timeout:a,
26
- roleArn:c,handlerName:m}=t;await S.send(new s.UpdateFunctionConfigurationCommand(
27
- {FunctionName:e,Description:r,MemorySize:o,Timeout:a,Role:c,...m&&{Handler:Y(m)},
28
- Environment:{Variables:n}})),await(0,s.waitUntilFunctionUpdated)(U,{FunctionName:e})},
29
- Q=async e=>{f.Logger.logDelete(i,e),await S.send(new s.DeleteFunctionCommand({FunctionName:e}))},
30
- X=e=>k(e,"main.mjs"),Y=e=>`main.${e}`;var te=()=>({equals:qe,create:re,replace:Le,preview:Ve,update:Be,delete:$e}),ne=e=>{
31
- let{parameters:t}=e;return t.variables&&(t.variables=N(t.variables)),e},qe=(e,t)=>!!e.
32
- result&&e.result.functionArn===t.result?.functionArn,Ve=async(e,t)=>{let n=e.parameters,
33
- r=t.parameters,o=(0,l.deepCompare)({...n,dependencies:e.dependencies,sourceHash:await(0,l.hashFile)(
34
- n.sourceFile),...n.variables&&{variables:N(n.variables)}},{...r,dependencies:t.dependencies,
35
- sourceHash:t.result?.sourceHash});if(o.counts)return{...o,name:n.functionName}},
36
- Le=async(e,t,n)=>{if(t.result)throw new P.ReplaceResourceError(i,e.entryId,t.entryId);
37
- return re(e,n)},re=async(e,t)=>{let n=e.parameters,r=n.functionName,o=(0,D.getRoleArn)(
38
- i,r,t),a=n.sourceFile,c=await(0,l.hashFile)(a),m,x=await(0,l.waitFor)(async()=>{
39
- try{return await G({...n,sourceFile:a,roleArn:o})}catch(g){if(!(g instanceof ee.InvalidParameterValueException))
40
- throw g;return m=g,null}});if(!x)throw m;return ne(e),{functionArn:x.functionArn,
41
- sourceHash:c,roleArn:o}},Be=async(e,t,n)=>{let{parameters:r,result:o}=e;if(!o)return;
42
- let a=r.functionName,c=(0,D.getRoleArn)(i,a,n),m={...r,roleArn:c},x={...t.parameters,
43
- roleArn:t.result?.roleArn??c};await Promise.all([We(a,m,x),Ze(o.functionArn,r,t.
44
- parameters)]);let g=await ke(a,r,t.result);return ne(e),{...o,sourceHash:g,roleArn:c}},
45
- $e=async e=>{let{result:t,parameters:n}=e;t&&await(0,P.waitDeletion)(()=>Q(n.functionName))},
46
- We=async(e,t,n)=>{let r={...t,...t.variables&&{variables:N(t.variables)}};!(0,l.deepEqual)(
47
- r,n,{sourceFile:!0,functionName:!0,tags:!0})&&await J(e,t)},Ze=async(e,t,n)=>{await(0,P.applyTagUpdates)(
48
- t.tags,n.tags,r=>O(e,r),r=>K(e,r))},ke=async(e,t,n)=>{let r=t.sourceFile,o=await(0,l.hashFile)(
49
- r),a=n?.sourceHash;return o!==a?(await _(e,t),o):a};var ie=require("@ez4/aws-common");var H=require("@ez4/aws-common");var R=(e,t,n)=>{let r=n.getDependencies(u).at(0);if(!r?.parameters.functionName)
50
- throw new H.IncompleteResourceError(e,t,"functionName");return r.parameters.functionName},
51
- Ge=(e,t,n)=>{let r=n.getDependencies(u).at(0)?.result;if(!r?.functionArn)throw new H.IncompleteResourceError(
52
- e,t,"functionArn");return r.functionArn};var C=require("@aws-sdk/client-lambda"),j=require("@ez4/aws-common");var w="AWS:Lambda/Permission",d="aws:lambda.permission";var oe=new C.LambdaClient({}),ae=async e=>{j.Logger.logCreate(w,e.functionName);
53
- let t=e.statementId??`SID${Date.now()}`;return await oe.send(new C.AddPermissionCommand(
1
+ "use strict";var je=Object.create;var b=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var $e=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var Ze=(e,t)=>{for(var r in t)b(e,r,{get:t[r],enumerable:!0})},V=(e,t,r,n)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let o of Le(t))!Be.call(e,o)&&o!==r&&
3
+ b(e,o,{get:()=>t[o],enumerable:!(n=Ve(t,o))||n.enumerable});return e};var ke=(e,t,r)=>(r=e!=null?je($e(e)):{},V(t||!e||!e.__esModule?b(r,"default",{value:e,
4
+ enumerable:!0}):r,e)),Ge=e=>V(b({},"__esModule",{value:!0}),e);var Rt={};Ze(Rt,{FunctionServiceName:()=>i,FunctionServiceType:()=>m,MappingServiceName:()=>g,
5
+ MappingServiceType:()=>d,PermissionServiceName:()=>w,PermissionServiceType:()=>y,
6
+ createFunction:()=>ft,createMapping:()=>xt,createPermission:()=>Pt,getFunction:()=>St,
7
+ getFunctionArn:()=>rt,getFunctionName:()=>R,getPermission:()=>wt,isFunctionState:()=>D,
8
+ isMappingState:()=>Ft,registerTriggers:()=>dt});module.exports=Ge(Rt);var Ne=require("@ez4/aws-common"),Ie=require("@ez4/aws-identity"),he=require("@ez4/project/library");var ne=require("@ez4/aws-common");var Y=require("@aws-sdk/client-lambda"),F=require("@ez4/aws-common"),u=require("@ez4/utils"),
9
+ U=require("@ez4/aws-identity");var a=require("@aws-sdk/client-lambda"),S=require("@ez4/aws-common");var L=require("@ez4/aws-common"),$=require("@ez4/utils");var i="AWS:Lambda/Function",m="aws:lambda.function";var We=/[a-z][\w]+/i,Oe=e=>We.test(e),h=e=>{for(let t in e)if(!Oe(t))throw new L.InvalidParameterError(
10
+ i,`${t} is an invalid variable name .`)},M=e=>{let t={};for(let r in e)t[r]=(0,$.hashData)(
11
+ e[r]);return t};var B=ke(require("adm-zip"),1),Z=require("node:fs/promises"),k=async(e,t)=>{let r=new B.default,
12
+ n=await(0,Z.readFile)(e);return r.addFile(t,n),r.toBufferPromise()};var P=new a.LambdaClient({}),T={minDelay:15,maxWaitTime:1800,maxDelay:60,client:P},
13
+ G=async e=>{let{functionName:t,variables:r}=e;S.Logger.logCreate(i,t),r&&h(r);let{
14
+ description:n,memory:o,timeout:s,roleArn:c,handlerName:l,sourceFile:x,tags:f}=e,
15
+ He=(await P.send(new a.CreateFunctionCommand({Publish:!0,FunctionName:t,Description:n,
16
+ MemorySize:o,Timeout:s,Role:c,PackageType:"Zip",Handler:X(l),Runtime:"nodejs20.x",
17
+ Code:{ZipFile:await Q(x)},Environment:{Variables:r},Tags:{...f,ManagedBy:"EZ4"}}))).
18
+ FunctionArn;return await(0,a.waitUntilFunctionActive)(T,{FunctionName:t}),{functionArn:He}},
19
+ W=async(e,t)=>{S.Logger.logTag(i,e),await P.send(new a.TagResourceCommand({Resource:e,
20
+ Tags:{...t,ManagedBy:"EZ4"}}))},O=async(e,t)=>{S.Logger.logUntag(i,e),await P.send(
21
+ new a.UntagResourceCommand({Resource:e,TagKeys:t}))},K=async(e,t)=>{S.Logger.logUpdate(
22
+ i,`${e} source code`);let{sourceFile:r}=t;await P.send(new a.UpdateFunctionCodeCommand(
23
+ {FunctionName:e,ZipFile:await Q(r),Publish:!0})),await(0,a.waitUntilFunctionUpdated)(
24
+ T,{FunctionName:e})},_=async(e,t)=>{let{variables:r}=t;S.Logger.logUpdate(i,`${e}\
25
+ configuration`),r&&h(r);let{description:n,memory:o,timeout:s,roleArn:c,handlerName:l}=t;
26
+ await P.send(new a.UpdateFunctionConfigurationCommand({FunctionName:e,Description:n,
27
+ MemorySize:o,Timeout:s,Role:c,...l&&{Handler:X(l)},Environment:{Variables:r}})),
28
+ await(0,a.waitUntilFunctionUpdated)(T,{FunctionName:e})},J=async e=>{S.Logger.logDelete(
29
+ i,e),await P.send(new a.DeleteFunctionCommand({FunctionName:e}))},Q=e=>k(e,"main\
30
+ .mjs"),X=e=>`main.${e}`;var ee=()=>({equals:Ke,create:re,replace:Je,preview:_e,update:Qe,delete:Xe}),te=e=>{
31
+ let{parameters:t}=e;return t.variables&&(t.variables=M(t.variables)),e},Ke=(e,t)=>!!e.
32
+ result&&e.result.functionArn===t.result?.functionArn,_e=async(e,t)=>{let r=e.parameters,
33
+ n=t.parameters,o=(0,u.deepCompare)({...r,dependencies:e.dependencies,sourceHash:await(0,u.hashFile)(
34
+ r.sourceFile),...r.variables&&{variables:M(r.variables)}},{...n,dependencies:t.dependencies,
35
+ sourceHash:t.result?.sourceHash});if(o.counts)return{...o,name:r.functionName}},
36
+ Je=async(e,t,r)=>{if(t.result)throw new F.ReplaceResourceError(i,e.entryId,t.entryId);
37
+ return re(e,r)},re=async(e,t)=>{let r=e.parameters,n=r.functionName,o=(0,U.getRoleArn)(
38
+ i,n,t),s=r.sourceFile,c=await(0,u.hashFile)(s),l,x=await(0,u.waitFor)(async()=>{
39
+ try{return await G({...r,sourceFile:s,roleArn:o})}catch(f){if(!(f instanceof Y.InvalidParameterValueException))
40
+ throw f;return l=f,null}});if(!x)throw l;return te(e),{functionArn:x.functionArn,
41
+ sourceHash:c,roleArn:o}},Qe=async(e,t,r)=>{let{parameters:n,result:o}=e;if(!o)return;
42
+ let s=n.functionName,c=(0,U.getRoleArn)(i,s,r),l=t.result?.roleArn??c,x={...n,roleArn:c},
43
+ f={...t.parameters,roleArn:l};await Promise.all([Ye(s,x,f),et(o.functionArn,n,t.
44
+ parameters)]);let j=await tt(s,n,t.result);return te(e),{...o,roleArn:c,sourceHash:j}},
45
+ Xe=async e=>{let{result:t,parameters:r}=e;t&&await(0,F.waitDeletion)(()=>J(r.functionName))},
46
+ Ye=async(e,t,r)=>{let n={...t,...t.variables&&{variables:M(t.variables)}};!(0,u.deepEqual)(
47
+ n,r,{sourceFile:!0,functionName:!0,tags:!0})&&await _(e,t)},et=async(e,t,r)=>{await(0,F.applyTagUpdates)(
48
+ t.tags,r.tags,n=>W(e,n),n=>O(e,n))},tt=async(e,t,r)=>{let n=t.sourceFile,o=await(0,u.hashFile)(
49
+ n),s=r?.sourceHash;return o!==s?(await K(e,t),o):s};var oe=()=>{(0,ne.registerProvider)(m,ee())};var ue=require("@ez4/aws-common");var pe=require("@ez4/aws-common");var z=require("@ez4/aws-common");var D=e=>e.type===m,R=(e,t,r)=>{let n=r.getDependencies(m).at(0);if(!n?.parameters.
50
+ functionName)throw new z.IncompleteResourceError(e,t,"functionName");return n.parameters.
51
+ functionName},rt=(e,t,r)=>{let n=r.getDependencies(m).at(0)?.result;if(!n?.functionArn)
52
+ throw new z.IncompleteResourceError(e,t,"functionArn");return n.functionArn};var C=require("@aws-sdk/client-lambda"),q=require("@ez4/aws-common");var w="AWS:Lambda/Permission",y="aws:lambda.permission";var se=new C.LambdaClient({}),ae=async e=>{q.Logger.logCreate(w,e.functionName);
53
+ let t=e.statementId??`SID${Date.now()}`;return await se.send(new C.AddPermissionCommand(
54
54
  {StatementId:t,FunctionName:e.functionName,SourceArn:e.sourceArn,Principal:e.principal,
55
- Action:e.action})),{statementId:t}},se=async(e,t)=>{j.Logger.logDelete(w,e),await oe.
56
- send(new C.RemovePermissionCommand({FunctionName:e,StatementId:t}))};var pe=()=>({equals:Oe,create:ce,replace:_e,preview:Ke,update:Je,delete:Qe}),Oe=(e,t)=>!!e.
57
- result&&e.result.functionName===t.result?.functionName,Ke=async(e,t)=>{},_e=async(e,t,n)=>{
58
- if(t.result)throw new ie.ReplaceResourceError(w,e.entryId,t.entryId);return ce(e,
59
- n)},ce=async(e,t)=>{let n=e.parameters,r=R(w,"permission",t),o=await n.getPermission(
60
- t);return{statementId:(await ae({functionName:r,principal:o.principal,sourceArn:o.
61
- sourceArn,action:"lambda:InvokeFunction"})).statementId,functionName:r}},Je=async()=>{},
62
- Qe=async e=>{let t=e.result;t&&await se(t.functionName,t.statementId)};var ge=require("@ez4/aws-common"),h=require("@ez4/utils");var p=require("@aws-sdk/client-lambda"),E=require("@ez4/aws-common"),me=require("@ez4/utils");var y="AWS:Lambda/Mapping",F="aws:lambda.mapping";var I=new p.LambdaClient({}),ue=async e=>{E.Logger.logCreate(y,e.functionName);let{
63
- service:t}=(0,E.parseArn)(e.sourceArn),{batch:n}=e,o=(await I.send(new p.CreateEventSourceMappingCommand(
64
- {FunctionName:e.functionName,EventSourceArn:e.sourceArn,Enabled:e.enabled,...t===
65
- "dynamodb"&&{StartingPosition:p.EventSourcePosition.LATEST},...n&&{BatchSize:n.batchSize,
66
- MaximumBatchingWindowInSeconds:n.maxWindow}}))).UUID;return await de(o),{eventId:o}},
67
- le=async(e,t)=>{E.Logger.logUpdate(y,e);let{batch:n}=t;await I.send(new p.UpdateEventSourceMappingCommand(
68
- {UUID:e,FunctionName:t.functionName,Enabled:t.enabled,...n&&{BatchSize:n.batchSize,
69
- MaximumBatchingWindowInSeconds:n.maxWindow}})),await de(e)},ye=async e=>{E.Logger.
70
- logDelete(y,e),await I.send(new p.DeleteEventSourceMappingCommand({UUID:e}))},Xe=async e=>(await I.
71
- send(new p.GetEventSourceMappingCommand({UUID:e}))).State,de=async e=>{let t=new Set(
72
- ["Enabled","Disabled"]);await(0,me.waitFor)(async()=>{let n=await Xe(e);return t.
73
- has(n)})};var fe=()=>({equals:Ye,create:Se,replace:tt,preview:et,update:nt,delete:rt}),Ye=(e,t)=>!!e.
74
- result&&e.result.eventId===t.result?.eventId,et=async(e,t)=>{let n={...e.parameters,
75
- dependencies:e.dependencies},r={...t.parameters,dependencies:t.dependencies},o=(0,h.deepCompare)(
76
- n,r,{getSourceArn:!0});return o.counts?o:void 0},tt=async(e,t,n)=>{if(t.result)throw new ge.ReplaceResourceError(
77
- y,e.entryId,t.entryId);return Se(e,n)},Se=async(e,t)=>{let n=e.parameters,r=R(y,
78
- "mapping",t),o=await n.getSourceArn(t);return{eventId:(await ue({...e.parameters,
79
- functionName:r,sourceArn:o})).eventId,functionName:r,sourceArn:o}},nt=async(e,t,n)=>{
80
- let r=e.result;if(!r)return;let o=R(y,"mapping",n),a=t.result?.functionName??r.functionName,
81
- c={...e.parameters,functionName:o},m={...t.parameters,functionName:a};return await ot(
82
- r.eventId,c,m),{...r,functionName:o}},rt=async e=>{let t=e.result;t&&await ye(t.
83
- eventId)},ot=async(e,t,n)=>{(0,h.deepEqual)(t,n,{getSourceArn:!0})||await le(e,t)};var A=require("@ez4/utils"),we=require("@ez4/stateful");var Fe=e=>e.type===u,at=(e,t,n)=>{let r=(0,A.toKebabCase)(n.functionName),o=(0,A.hashData)(
84
- u,t.entryId,r);return(0,we.attachEntry)(e,{type:u,entryId:o,dependencies:[t.entryId],
85
- parameters:{...n,functionName:r}})},st=(e,t,n)=>{let r=(0,A.toKebabCase)(n),o=(0,A.hashData)(
86
- u,t.entryId,r),a=e[o];return a&&Fe(a)?a:null};var q=require("@ez4/utils"),xe=require("@ez4/stateful");var Pe=e=>e.type===d,it=(e,t,n,r)=>{let o=(0,q.hashData)(d,t.entryId,n.entryId);
87
- return(0,xe.attachEntry)(e,{type:d,entryId:o,dependencies:[t.entryId,n.entryId],
88
- parameters:r})},pt=(e,t,n)=>{let r=(0,q.hashData)(d,t.entryId,n.entryId),o=e[r];
89
- return o&&Pe(o)?o:null};var Re=require("@ez4/utils"),Ce=require("@ez4/stateful");var ct=e=>e.type===F,mt=(e,t,n,r)=>{let o=(0,Re.hashData)(F,t.entryId,n.entryId);
90
- return(0,Ce.attachEntry)(e,{type:F,entryId:o,dependencies:[t.entryId,n.entryId],
91
- parameters:r})};var Ae=require("@ez4/aws-common"),M=require("@ez4/aws-identity"),ve=require("@ez4/project/library");var v=require("@ez4/aws-identity"),Ee=async e=>{let[t,n]=await Promise.all([(0,v.getRegion)(),
55
+ Action:e.action})),{statementId:t}},ie=async(e,t)=>{q.Logger.logDelete(w,e),await se.
56
+ send(new C.RemovePermissionCommand({FunctionName:e,StatementId:t}))};var ce=()=>({equals:nt,create:me,replace:st,preview:ot,update:at,delete:it}),nt=(e,t)=>!!e.
57
+ result&&e.result.functionName===t.result?.functionName,ot=async(e,t)=>{},st=async(e,t,r)=>{
58
+ if(t.result)throw new pe.ReplaceResourceError(w,e.entryId,t.entryId);return me(e,
59
+ r)},me=async(e,t)=>{let r=e.parameters,n=R(w,"permission",t),o=await r.getPermission(
60
+ t);return{statementId:(await ae({functionName:n,principal:o.principal,sourceArn:o.
61
+ sourceArn,action:"lambda:InvokeFunction"})).statementId,functionName:n}},at=async()=>{},
62
+ it=async e=>{let t=e.result;t&&await ie(t.functionName,t.statementId)};var le=()=>{(0,ue.registerProvider)(y,ce())};var Re=require("@ez4/aws-common");var we=require("@ez4/aws-common"),I=require("@ez4/utils");var p=require("@aws-sdk/client-lambda"),E=require("@ez4/aws-common"),ye=require("@ez4/utils");var g="AWS:Lambda/Mapping",d="aws:lambda.mapping";var N=new p.LambdaClient({}),ge=async e=>{let{sourceArn:t,functionName:r}=e;E.Logger.
63
+ logCreate(g,r);let o=(await N.send(new p.CreateEventSourceMappingCommand({FunctionName:r,
64
+ EventSourceArn:t,...Pe(e)}))).UUID;return await Se(o),{eventId:o}},de=async(e,t)=>{
65
+ let{functionName:r}=t;E.Logger.logUpdate(g,`${r} (${e})`),await N.send(new p.UpdateEventSourceMappingCommand(
66
+ {UUID:e,FunctionName:r,...Pe(t)})),await Se(e)},fe=async e=>{E.Logger.logDelete(
67
+ g,e),await N.send(new p.DeleteEventSourceMappingCommand({UUID:e}))},pt=async e=>(await N.
68
+ send(new p.GetEventSourceMappingCommand({UUID:e}))).State,Se=async e=>{let t=new Set(
69
+ ["Enabled","Disabled"]);await(0,ye.waitFor)(async()=>{let r=await pt(e);return t.
70
+ has(r)})},Pe=e=>{let{sourceArn:t,enabled:r,concurrency:n,batch:o}=e,{service:s}=(0,E.parseArn)(
71
+ t);return{Enabled:r,...s==="dynamodb"&&{StartingPosition:p.EventSourcePosition.LATEST},
72
+ ...s==="sqs"&&n&&{ScalingConfig:{MaximumConcurrency:n}},...o&&{MaximumBatchingWindowInSeconds:o.
73
+ maxWindow,BatchSize:o.batchSize}}};var xe=()=>({equals:ct,create:Fe,replace:ut,preview:mt,update:lt,delete:yt}),ct=(e,t)=>!!e.
74
+ result&&e.result.eventId===t.result?.eventId,mt=async(e,t)=>{let r={...e.parameters,
75
+ dependencies:e.dependencies},n={...t.parameters,dependencies:t.dependencies},o=(0,I.deepCompare)(
76
+ r,n,{getSourceArn:!0});return o.counts?o:void 0},ut=async(e,t,r)=>{if(t.result)throw new we.ReplaceResourceError(
77
+ g,e.entryId,t.entryId);return Fe(e,r)},Fe=async(e,t)=>{let r=e.parameters,n=R(g,
78
+ "mapping",t),o=await r.getSourceArn(t);return{eventId:(await ge({...e.parameters,
79
+ functionName:n,sourceArn:o})).eventId,functionName:n,sourceArn:o}},lt=async(e,t,r)=>{
80
+ let n=e.result;if(!n)return;let o=n.sourceArn,s=R(g,"mapping",r),c=t.result?.functionName??
81
+ n.functionName;return await gt(n.eventId,{...e.parameters,functionName:s,sourceArn:o},
82
+ {...t.parameters,functionName:c,sourceArn:o}),{...n,functionName:s}},yt=async e=>{
83
+ let t=e.result;t&&await fe(t.eventId)},gt=async(e,t,r)=>{!(0,I.deepEqual)(t,r)&&
84
+ await de(e,t)};var Ce=()=>{(0,Re.registerProvider)(d,xe())};var Ee=()=>[{account:"lambda.amazonaws.com"}];var Ae=require("@ez4/aws-identity");var v=require("@ez4/aws-identity"),ve=async e=>{let[t,r]=await Promise.all([(0,v.getRegion)(),
92
85
  (0,v.getAccountId)()]);return(0,v.createPolicyDocument)([{permissions:["logs:Cre\
93
86
  ateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resourceIds:[`arn:aws:l\
94
- ogs:${t}:${n}:log-group:/aws/lambda/${e}-*:*`]}])};var V=!1,ut=()=>(V||((0,Ae.registerTriggers)(),(0,M.registerTriggers)(),(0,ve.createTrigger)(
95
- "@ez4/aws-function",{"deploy:prepareIdentityAccount":lt,"deploy:prepareExecution\
96
- Policy":yt}),V=!0),V),lt=()=>[{account:"lambda.amazonaws.com"}],yt=async e=>{let{
97
- state:t,options:n}=e,{resourcePrefix:r,projectName:o}=n,a=`${r}-${o}`;return(0,M.createPolicy)(
98
- t,{policyName:`${a}-lambda-policy`,policyDocument:await Ee(a)})};(0,T.registerProvider)(u,te());(0,T.registerProvider)(d,pe());(0,T.registerProvider)(
99
- F,fe());0&&(module.exports={FunctionServiceName,FunctionServiceType,MappingServiceName,MappingServiceType,
87
+ ogs:${t}:${r}:log-group:/aws/lambda/${e}-*:*`]}])};var be=async e=>{let{state:t,options:r}=e,{resourcePrefix:n,projectName:o}=r,s=`${n}\
88
+ -${o}`;return(0,Ae.createPolicy)(t,{policyName:`${s}-lambda-policy`,policyDocument:await ve(
89
+ s)})};var Me=!1,dt=()=>{Me||((0,Ne.registerTriggers)(),(0,Ie.registerTriggers)(),(0,he.createTrigger)(
90
+ "@ez4/aws-function",{"deploy:prepareIdentityAccount":Ee,"deploy:prepareExecution\
91
+ Policy":be}),oe(),le(),Ce(),Me=!0)};var A=require("@ez4/utils"),Te=require("@ez4/stateful");var ft=(e,t,r)=>{let n=(0,A.toKebabCase)(r.functionName),o=(0,A.hashData)(m,t.entryId,
92
+ n);return(0,Te.attachEntry)(e,{type:m,entryId:o,dependencies:[t.entryId],parameters:{
93
+ ...r,functionName:n}})},St=(e,t,r)=>{let n=(0,A.toKebabCase)(r),o=(0,A.hashData)(
94
+ m,t.entryId,n),s=e[o];return s&&D(s)?s:null};var ze=require("@ez4/stateful"),H=require("@ez4/utils");var Ue=e=>e.type===y;var Pt=(e,t,r,n)=>{let o=(0,H.hashData)(y,t.entryId,r.entryId);return(0,ze.attachEntry)(
95
+ e,{type:y,entryId:o,dependencies:[t.entryId,r.entryId],parameters:n})},wt=(e,t,r)=>{
96
+ let n=(0,H.hashData)(y,t.entryId,r.entryId),o=e[n];return o&&Ue(o)?o:null};var De=require("@ez4/utils"),qe=require("@ez4/stateful");var xt=(e,t,r,n)=>{let o=(0,De.hashData)(d,t.entryId,r.entryId);return(0,qe.attachEntry)(
97
+ e,{type:d,entryId:o,dependencies:[t.entryId,r.entryId],parameters:n})};var Ft=e=>e.type===d;0&&(module.exports={FunctionServiceName,FunctionServiceType,MappingServiceName,MappingServiceType,
100
98
  PermissionServiceName,PermissionServiceType,createFunction,createMapping,createPermission,
101
- getFunction,getFunctionArn,getFunctionName,getPermission,isFunction,isMapping,isPermission,
99
+ getFunction,getFunctionArn,getFunctionName,getPermission,isFunctionState,isMappingState,
102
100
  registerTriggers});
package/dist/main.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './triggers/register.js';
1
2
  export * from './types/variables.js';
2
3
  export * from './function/service.js';
3
4
  export * from './function/types.js';
@@ -6,4 +7,4 @@ export * from './permission/service.js';
6
7
  export * from './permission/types.js';
7
8
  export * from './mapping/service.js';
8
9
  export * from './mapping/types.js';
9
- export * from './triggers/register.js';
10
+ export * from './mapping/utils.js';
package/dist/main.mjs CHANGED
@@ -1,95 +1,94 @@
1
- import{registerProvider as v}from"@ez4/aws-common";import{InvalidParameterValueException as Fe}from"@aws-sdk/client-lambda";import{
2
- applyTagUpdates as xe,ReplaceResourceError as Pe,waitDeletion as Re}from"@ez4/aws-common";
3
- import{deepCompare as Ce,deepEqual as Ee,hashFile as C,waitFor as Ae}from"@ez4/utils";
4
- import{getRoleArn as j}from"@ez4/aws-identity";import{CreateFunctionCommand as ue,DeleteFunctionCommand as le,LambdaClient as ye,
5
- TagResourceCommand as de,UntagResourceCommand as ge,UpdateFunctionCodeCommand as fe,
6
- UpdateFunctionConfigurationCommand as Se,waitUntilFunctionActive as we,waitUntilFunctionUpdated as N}from"@aws-sdk/client-lambda";
7
- import{Logger as g}from"@ez4/aws-common";import{InvalidParameterError as ae}from"@ez4/aws-common";import{hashData as se}from"@ez4/utils";var s="AWS:Lambda/Function",c="aws:lambda.function";var ie=/[a-z][\w]+/i,pe=e=>ie.test(e),P=e=>{for(let t in e)if(!pe(t))throw new ae(
8
- s,`${t} is an invalid variable name .`)},F=e=>{let t={};for(let n in e)t[n]=se(e[n]);
9
- return t};import ce from"adm-zip";import{readFile as me}from"node:fs/promises";var b=async(e,t)=>{
10
- let n=new ce,r=await me(e);return n.addFile(t,r),n.toBufferPromise()};var l=new ye({}),R={maxWaitTime:90,client:l},I=async e=>{let{functionName:t,variables:n}=e;
11
- g.logCreate(s,t),n&&P(n);let{description:r,memory:o,timeout:a,roleArn:i,handlerName:p,
12
- sourceFile:d,tags:u}=e,oe=(await l.send(new ue({Publish:!0,FunctionName:t,Description:r,
13
- MemorySize:o,Timeout:a,Role:i,PackageType:"Zip",Handler:H(p),Runtime:"nodejs20.x",
14
- Code:{ZipFile:await D(d)},Environment:{Variables:n},Tags:{...u,ManagedBy:"EZ4"}}))).
15
- FunctionArn;return await we(R,{FunctionName:t}),{functionArn:oe}},h=async(e,t)=>{
16
- g.logTag(s,e),await l.send(new de({Resource:e,Tags:{...t,ManagedBy:"EZ4"}}))},M=async(e,t)=>{
17
- g.logUntag(s,e),await l.send(new ge({Resource:e,TagKeys:t}))},T=async(e,t)=>{g.logUpdate(
18
- s,`${e} source code`);let{sourceFile:n}=t;await l.send(new fe({FunctionName:e,ZipFile:await D(
19
- n),Publish:!0})),await N(R,{FunctionName:e})},z=async(e,t)=>{let{variables:n}=t;
20
- g.logUpdate(s,`${e} configuration`),n&&P(n);let{description:r,memory:o,timeout:a,
21
- roleArn:i,handlerName:p}=t;await l.send(new Se({FunctionName:e,Description:r,MemorySize:o,
22
- Timeout:a,Role:i,...p&&{Handler:H(p)},Environment:{Variables:n}})),await N(R,{FunctionName:e})},
23
- U=async e=>{g.logDelete(s,e),await l.send(new le({FunctionName:e}))},D=e=>b(e,"m\
24
- ain.mjs"),H=e=>`main.${e}`;var q=()=>({equals:ve,create:L,replace:Ne,preview:be,update:Ie,delete:he}),V=e=>{
25
- let{parameters:t}=e;return t.variables&&(t.variables=F(t.variables)),e},ve=(e,t)=>!!e.
26
- result&&e.result.functionArn===t.result?.functionArn,be=async(e,t)=>{let n=e.parameters,
27
- r=t.parameters,o=Ce({...n,dependencies:e.dependencies,sourceHash:await C(n.sourceFile),
28
- ...n.variables&&{variables:F(n.variables)}},{...r,dependencies:t.dependencies,sourceHash:t.
29
- result?.sourceHash});if(o.counts)return{...o,name:n.functionName}},Ne=async(e,t,n)=>{
30
- if(t.result)throw new Pe(s,e.entryId,t.entryId);return L(e,n)},L=async(e,t)=>{let n=e.
31
- parameters,r=n.functionName,o=j(s,r,t),a=n.sourceFile,i=await C(a),p,d=await Ae(
32
- async()=>{try{return await I({...n,sourceFile:a,roleArn:o})}catch(u){if(!(u instanceof
33
- Fe))throw u;return p=u,null}});if(!d)throw p;return V(e),{functionArn:d.functionArn,
34
- sourceHash:i,roleArn:o}},Ie=async(e,t,n)=>{let{parameters:r,result:o}=e;if(!o)return;
35
- let a=r.functionName,i=j(s,a,n),p={...r,roleArn:i},d={...t.parameters,roleArn:t.
36
- result?.roleArn??i};await Promise.all([Me(a,p,d),Te(o.functionArn,r,t.parameters)]);
37
- let u=await ze(a,r,t.result);return V(e),{...o,sourceHash:u,roleArn:i}},he=async e=>{
38
- let{result:t,parameters:n}=e;t&&await Re(()=>U(n.functionName))},Me=async(e,t,n)=>{
39
- let r={...t,...t.variables&&{variables:F(t.variables)}};!Ee(r,n,{sourceFile:!0,functionName:!0,
40
- tags:!0})&&await z(e,t)},Te=async(e,t,n)=>{await xe(t.tags,n.tags,r=>h(e,r),r=>M(
41
- e,r))},ze=async(e,t,n)=>{let r=t.sourceFile,o=await C(r),a=n?.sourceHash;return o!==
42
- a?(await T(e,t),o):a};import{ReplaceResourceError as je}from"@ez4/aws-common";import{IncompleteResourceError as B}from"@ez4/aws-common";var w=(e,t,n)=>{let r=n.getDependencies(c).at(0);if(!r?.parameters.functionName)
43
- throw new B(e,t,"functionName");return r.parameters.functionName},Ot=(e,t,n)=>{let r=n.
44
- getDependencies(c).at(0)?.result;if(!r?.functionArn)throw new B(e,t,"functionArn");
45
- return r.functionArn};import{AddPermissionCommand as Ue,LambdaClient as De,RemovePermissionCommand as He}from"@aws-sdk/client-lambda";
46
- import{Logger as $}from"@ez4/aws-common";var f="AWS:Lambda/Permission",y="aws:lambda.permission";var W=new De({}),Z=async e=>{$.logCreate(f,e.functionName);let t=e.statementId??
47
- `SID${Date.now()}`;return await W.send(new Ue({StatementId:t,FunctionName:e.functionName,
1
+ import{registerTriggers as Rt}from"@ez4/aws-common";import{registerTriggers as Ct}from"@ez4/aws-identity";
2
+ import{createTrigger as Et}from"@ez4/project/library";import{registerProvider as Be}from"@ez4/aws-common";import{InvalidParameterValueException as be}from"@aws-sdk/client-lambda";import{
3
+ applyTagUpdates as Me,ReplaceResourceError as Ne,waitDeletion as Ie}from"@ez4/aws-common";
4
+ import{deepCompare as he,deepEqual as Te,hashFile as C,waitFor as Ue}from"@ez4/utils";
5
+ import{getRoleArn as q}from"@ez4/aws-identity";import{CreateFunctionCommand as we,DeleteFunctionCommand as xe,LambdaClient as Fe,
6
+ TagResourceCommand as Re,UntagResourceCommand as Ce,UpdateFunctionCodeCommand as Ee,
7
+ UpdateFunctionConfigurationCommand as ve,waitUntilFunctionActive as Ae,waitUntilFunctionUpdated as b}from"@aws-sdk/client-lambda";
8
+ import{Logger as f}from"@ez4/aws-common";import{InvalidParameterError as ye}from"@ez4/aws-common";import{hashData as ge}from"@ez4/utils";var a="AWS:Lambda/Function",p="aws:lambda.function";var de=/[a-z][\w]+/i,fe=e=>de.test(e),F=e=>{for(let t in e)if(!fe(t))throw new ye(
9
+ a,`${t} is an invalid variable name .`)},w=e=>{let t={};for(let r in e)t[r]=ge(e[r]);
10
+ return t};import Se from"adm-zip";import{readFile as Pe}from"node:fs/promises";var A=async(e,t)=>{
11
+ let r=new Se,n=await Pe(e);return r.addFile(t,n),r.toBufferPromise()};var y=new Fe({}),R={minDelay:15,maxWaitTime:1800,maxDelay:60,client:y},M=async e=>{
12
+ let{functionName:t,variables:r}=e;f.logCreate(a,t),r&&F(r);let{description:n,memory:o,
13
+ timeout:s,roleArn:i,handlerName:c,sourceFile:d,tags:l}=e,le=(await y.send(new we(
14
+ {Publish:!0,FunctionName:t,Description:n,MemorySize:o,Timeout:s,Role:i,PackageType:"\
15
+ Zip",Handler:D(c),Runtime:"nodejs20.x",Code:{ZipFile:await z(d)},Environment:{Variables:r},
16
+ Tags:{...l,ManagedBy:"EZ4"}}))).FunctionArn;return await Ae(R,{FunctionName:t}),
17
+ {functionArn:le}},N=async(e,t)=>{f.logTag(a,e),await y.send(new Re({Resource:e,Tags:{
18
+ ...t,ManagedBy:"EZ4"}}))},I=async(e,t)=>{f.logUntag(a,e),await y.send(new Ce({Resource:e,
19
+ TagKeys:t}))},h=async(e,t)=>{f.logUpdate(a,`${e} source code`);let{sourceFile:r}=t;
20
+ await y.send(new Ee({FunctionName:e,ZipFile:await z(r),Publish:!0})),await b(R,{
21
+ FunctionName:e})},T=async(e,t)=>{let{variables:r}=t;f.logUpdate(a,`${e} configur\
22
+ ation`),r&&F(r);let{description:n,memory:o,timeout:s,roleArn:i,handlerName:c}=t;
23
+ await y.send(new ve({FunctionName:e,Description:n,MemorySize:o,Timeout:s,Role:i,
24
+ ...c&&{Handler:D(c)},Environment:{Variables:r}})),await b(R,{FunctionName:e})},U=async e=>{
25
+ f.logDelete(a,e),await y.send(new xe({FunctionName:e}))},z=e=>A(e,"main.mjs"),D=e=>`\
26
+ main.${e}`;var H=()=>({equals:ze,create:V,replace:qe,preview:De,update:He,delete:je}),j=e=>{
27
+ let{parameters:t}=e;return t.variables&&(t.variables=w(t.variables)),e},ze=(e,t)=>!!e.
28
+ result&&e.result.functionArn===t.result?.functionArn,De=async(e,t)=>{let r=e.parameters,
29
+ n=t.parameters,o=he({...r,dependencies:e.dependencies,sourceHash:await C(r.sourceFile),
30
+ ...r.variables&&{variables:w(r.variables)}},{...n,dependencies:t.dependencies,sourceHash:t.
31
+ result?.sourceHash});if(o.counts)return{...o,name:r.functionName}},qe=async(e,t,r)=>{
32
+ if(t.result)throw new Ne(a,e.entryId,t.entryId);return V(e,r)},V=async(e,t)=>{let r=e.
33
+ parameters,n=r.functionName,o=q(a,n,t),s=r.sourceFile,i=await C(s),c,d=await Ue(
34
+ async()=>{try{return await M({...r,sourceFile:s,roleArn:o})}catch(l){if(!(l instanceof
35
+ be))throw l;return c=l,null}});if(!d)throw c;return j(e),{functionArn:d.functionArn,
36
+ sourceHash:i,roleArn:o}},He=async(e,t,r)=>{let{parameters:n,result:o}=e;if(!o)return;
37
+ let s=n.functionName,i=q(a,s,r),c=t.result?.roleArn??i,d={...n,roleArn:i},l={...t.
38
+ parameters,roleArn:c};await Promise.all([Ve(s,d,l),Le(o.functionArn,n,t.parameters)]);
39
+ let v=await $e(s,n,t.result);return j(e),{...o,roleArn:i,sourceHash:v}},je=async e=>{
40
+ let{result:t,parameters:r}=e;t&&await Ie(()=>U(r.functionName))},Ve=async(e,t,r)=>{
41
+ let n={...t,...t.variables&&{variables:w(t.variables)}};!Te(n,r,{sourceFile:!0,functionName:!0,
42
+ tags:!0})&&await T(e,t)},Le=async(e,t,r)=>{await Me(t.tags,r.tags,n=>N(e,n),n=>I(
43
+ e,n))},$e=async(e,t,r)=>{let n=t.sourceFile,o=await C(n),s=r?.sourceHash;return o!==
44
+ s?(await h(e,t),o):s};var L=()=>{Be(p,H())};import{registerProvider as Xe}from"@ez4/aws-common";import{ReplaceResourceError as We}from"@ez4/aws-common";import{IncompleteResourceError as $}from"@ez4/aws-common";var B=e=>e.type===p,P=(e,t,r)=>{let n=r.getDependencies(p).at(0);if(!n?.parameters.
45
+ functionName)throw new $(e,t,"functionName");return n.parameters.functionName},nr=(e,t,r)=>{
46
+ let n=r.getDependencies(p).at(0)?.result;if(!n?.functionArn)throw new $(e,t,"fun\
47
+ ctionArn");return n.functionArn};import{AddPermissionCommand as Ze,LambdaClient as ke,RemovePermissionCommand as Ge}from"@aws-sdk/client-lambda";
48
+ import{Logger as Z}from"@ez4/aws-common";var S="AWS:Lambda/Permission",m="aws:lambda.permission";var k=new ke({}),G=async e=>{Z.logCreate(S,e.functionName);let t=e.statementId??
49
+ `SID${Date.now()}`;return await k.send(new Ze({StatementId:t,FunctionName:e.functionName,
48
50
  SourceArn:e.sourceArn,Principal:e.principal,Action:e.action})),{statementId:t}},
49
- k=async(e,t)=>{$.logDelete(f,e),await W.send(new He({FunctionName:e,StatementId:t}))};var G=()=>({equals:qe,create:O,replace:Le,preview:Ve,update:Be,delete:$e}),qe=(e,t)=>!!e.
50
- result&&e.result.functionName===t.result?.functionName,Ve=async(e,t)=>{},Le=async(e,t,n)=>{
51
- if(t.result)throw new je(f,e.entryId,t.entryId);return O(e,n)},O=async(e,t)=>{let n=e.
52
- parameters,r=w(f,"permission",t),o=await n.getPermission(t);return{statementId:(await Z(
53
- {functionName:r,principal:o.principal,sourceArn:o.sourceArn,action:"lambda:Invok\
54
- eFunction"})).statementId,functionName:r}},Be=async()=>{},$e=async e=>{let t=e.result;
55
- t&&await k(t.functionName,t.statementId)};import{ReplaceResourceError as Xe}from"@ez4/aws-common";import{deepCompare as Ye,
56
- deepEqual as et}from"@ez4/utils";import{CreateEventSourceMappingCommand as We,UpdateEventSourceMappingCommand as Ze,
57
- DeleteEventSourceMappingCommand as ke,GetEventSourceMappingCommand as Ge,EventSourcePosition as Oe,
58
- LambdaClient as Ke}from"@aws-sdk/client-lambda";import{Logger as E,parseArn as _e}from"@ez4/aws-common";
59
- import{waitFor as Je}from"@ez4/utils";var m="AWS:Lambda/Mapping",S="aws:lambda.mapping";var x=new Ke({}),K=async e=>{E.logCreate(m,e.functionName);let{service:t}=_e(e.sourceArn),
60
- {batch:n}=e,o=(await x.send(new We({FunctionName:e.functionName,EventSourceArn:e.
61
- sourceArn,Enabled:e.enabled,...t==="dynamodb"&&{StartingPosition:Oe.LATEST},...n&&
62
- {BatchSize:n.batchSize,MaximumBatchingWindowInSeconds:n.maxWindow}}))).UUID;return await Q(
63
- o),{eventId:o}},_=async(e,t)=>{E.logUpdate(m,e);let{batch:n}=t;await x.send(new Ze(
64
- {UUID:e,FunctionName:t.functionName,Enabled:t.enabled,...n&&{BatchSize:n.batchSize,
65
- MaximumBatchingWindowInSeconds:n.maxWindow}})),await Q(e)},J=async e=>{E.logDelete(
66
- m,e),await x.send(new ke({UUID:e}))},Qe=async e=>(await x.send(new Ge({UUID:e}))).
67
- State,Q=async e=>{let t=new Set(["Enabled","Disabled"]);await Je(async()=>{let n=await Qe(
68
- e);return t.has(n)})};var X=()=>({equals:tt,create:Y,replace:rt,preview:nt,update:ot,delete:at}),tt=(e,t)=>!!e.
69
- result&&e.result.eventId===t.result?.eventId,nt=async(e,t)=>{let n={...e.parameters,
70
- dependencies:e.dependencies},r={...t.parameters,dependencies:t.dependencies},o=Ye(
71
- n,r,{getSourceArn:!0});return o.counts?o:void 0},rt=async(e,t,n)=>{if(t.result)throw new Xe(
72
- m,e.entryId,t.entryId);return Y(e,n)},Y=async(e,t)=>{let n=e.parameters,r=w(m,"m\
73
- apping",t),o=await n.getSourceArn(t);return{eventId:(await K({...e.parameters,functionName:r,
74
- sourceArn:o})).eventId,functionName:r,sourceArn:o}},ot=async(e,t,n)=>{let r=e.result;
75
- if(!r)return;let o=w(m,"mapping",n),a=t.result?.functionName??r.functionName,i={
76
- ...e.parameters,functionName:o},p={...t.parameters,functionName:a};return await st(
77
- r.eventId,i,p),{...r,functionName:o}},at=async e=>{let t=e.result;t&&await J(t.eventId)},
78
- st=async(e,t,n)=>{et(t,n,{getSourceArn:!0})||await _(e,t)};import{toKebabCase as ee,hashData as te}from"@ez4/utils";import{attachEntry as it}from"@ez4/stateful";var pt=e=>e.type===c,Pn=(e,t,n)=>{let r=ee(n.functionName),o=te(c,t.entryId,r);return it(
79
- e,{type:c,entryId:o,dependencies:[t.entryId],parameters:{...n,functionName:r}})},
80
- Rn=(e,t,n)=>{let r=ee(n),o=te(c,t.entryId,r),a=e[o];return a&&pt(a)?a:null};import{hashData as ne}from"@ez4/utils";import{attachEntry as ct}from"@ez4/stateful";var mt=e=>e.type===y,bn=(e,t,n,r)=>{let o=ne(y,t.entryId,n.entryId);return ct(e,
81
- {type:y,entryId:o,dependencies:[t.entryId,n.entryId],parameters:r})},Nn=(e,t,n)=>{
82
- let r=ne(y,t.entryId,n.entryId),o=e[r];return o&&mt(o)?o:null};import{hashData as ut}from"@ez4/utils";import{attachEntry as lt}from"@ez4/stateful";var zn=e=>e.type===S,Un=(e,t,n,r)=>{let o=ut(S,t.entryId,n.entryId);return lt(e,
83
- {type:S,entryId:o,dependencies:[t.entryId,n.entryId],parameters:r})};import{registerTriggers as ft}from"@ez4/aws-common";import{createPolicy as St,registerTriggers as wt}from"@ez4/aws-identity";
84
- import{createTrigger as Ft}from"@ez4/project/library";import{getAccountId as yt,getRegion as dt,createPolicyDocument as gt}from"@ez4/aws-identity";
85
- var re=async e=>{let[t,n]=await Promise.all([dt(),yt()]);return gt([{permissions:[
51
+ W=async(e,t)=>{Z.logDelete(S,e),await k.send(new Ge({FunctionName:e,StatementId:t}))};var O=()=>({equals:Oe,create:K,replace:_e,preview:Ke,update:Je,delete:Qe}),Oe=(e,t)=>!!e.
52
+ result&&e.result.functionName===t.result?.functionName,Ke=async(e,t)=>{},_e=async(e,t,r)=>{
53
+ if(t.result)throw new We(S,e.entryId,t.entryId);return K(e,r)},K=async(e,t)=>{let r=e.
54
+ parameters,n=P(S,"permission",t),o=await r.getPermission(t);return{statementId:(await G(
55
+ {functionName:n,principal:o.principal,sourceArn:o.sourceArn,action:"lambda:Invok\
56
+ eFunction"})).statementId,functionName:n}},Je=async()=>{},Qe=async e=>{let t=e.result;
57
+ t&&await W(t.functionName,t.statementId)};var _=()=>{Xe(m,O())};import{registerProvider as St}from"@ez4/aws-common";import{ReplaceResourceError as pt}from"@ez4/aws-common";import{deepCompare as ct,
58
+ deepEqual as mt}from"@ez4/utils";import{CreateEventSourceMappingCommand as Ye,UpdateEventSourceMappingCommand as et,
59
+ DeleteEventSourceMappingCommand as tt,GetEventSourceMappingCommand as rt,EventSourcePosition as nt,
60
+ LambdaClient as ot}from"@aws-sdk/client-lambda";import{Logger as E,parseArn as st}from"@ez4/aws-common";
61
+ import{waitFor as at}from"@ez4/utils";var u="AWS:Lambda/Mapping",g="aws:lambda.mapping";var x=new ot({}),J=async e=>{let{sourceArn:t,functionName:r}=e;E.logCreate(u,r);
62
+ let o=(await x.send(new Ye({FunctionName:r,EventSourceArn:t,...ee(e)}))).UUID;return await Y(
63
+ o),{eventId:o}},Q=async(e,t)=>{let{functionName:r}=t;E.logUpdate(u,`${r} (${e})`),
64
+ await x.send(new et({UUID:e,FunctionName:r,...ee(t)})),await Y(e)},X=async e=>{E.
65
+ logDelete(u,e),await x.send(new tt({UUID:e}))},it=async e=>(await x.send(new rt(
66
+ {UUID:e}))).State,Y=async e=>{let t=new Set(["Enabled","Disabled"]);await at(async()=>{
67
+ let r=await it(e);return t.has(r)})},ee=e=>{let{sourceArn:t,enabled:r,concurrency:n,
68
+ batch:o}=e,{service:s}=st(t);return{Enabled:r,...s==="dynamodb"&&{StartingPosition:nt.
69
+ LATEST},...s==="sqs"&&n&&{ScalingConfig:{MaximumConcurrency:n}},...o&&{MaximumBatchingWindowInSeconds:o.
70
+ maxWindow,BatchSize:o.batchSize}}};var te=()=>({equals:ut,create:re,replace:yt,preview:lt,update:gt,delete:dt}),ut=(e,t)=>!!e.
71
+ result&&e.result.eventId===t.result?.eventId,lt=async(e,t)=>{let r={...e.parameters,
72
+ dependencies:e.dependencies},n={...t.parameters,dependencies:t.dependencies},o=ct(
73
+ r,n,{getSourceArn:!0});return o.counts?o:void 0},yt=async(e,t,r)=>{if(t.result)throw new pt(
74
+ u,e.entryId,t.entryId);return re(e,r)},re=async(e,t)=>{let r=e.parameters,n=P(u,
75
+ "mapping",t),o=await r.getSourceArn(t);return{eventId:(await J({...e.parameters,
76
+ functionName:n,sourceArn:o})).eventId,functionName:n,sourceArn:o}},gt=async(e,t,r)=>{
77
+ let n=e.result;if(!n)return;let o=n.sourceArn,s=P(u,"mapping",r),i=t.result?.functionName??
78
+ n.functionName;return await ft(n.eventId,{...e.parameters,functionName:s,sourceArn:o},
79
+ {...t.parameters,functionName:i,sourceArn:o}),{...n,functionName:s}},dt=async e=>{
80
+ let t=e.result;t&&await X(t.eventId)},ft=async(e,t,r)=>{!mt(t,r)&&await Q(e,t)};var ne=()=>{St(g,te())};var oe=()=>[{account:"lambda.amazonaws.com"}];import{createPolicy as Ft}from"@ez4/aws-identity";import{getAccountId as Pt,getRegion as wt,createPolicyDocument as xt}from"@ez4/aws-identity";
81
+ var se=async e=>{let[t,r]=await Promise.all([wt(),Pt()]);return xt([{permissions:[
86
82
  "logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resourceIds:[`\
87
- arn:aws:logs:${t}:${n}:log-group:/aws/lambda/${e}-*:*`]}])};var A=!1,$n=()=>(A||(ft(),wt(),Ft("@ez4/aws-function",{"deploy:prepareIdentityAc\
88
- count":xt,"deploy:prepareExecutionPolicy":Pt}),A=!0),A),xt=()=>[{account:"lambda\
89
- .amazonaws.com"}],Pt=async e=>{let{state:t,options:n}=e,{resourcePrefix:r,projectName:o}=n,
90
- a=`${r}-${o}`;return St(t,{policyName:`${a}-lambda-policy`,policyDocument:await re(
91
- a)})};v(c,q());v(y,G());v(S,X());export{s as FunctionServiceName,c as FunctionServiceType,m as MappingServiceName,
92
- S as MappingServiceType,f as PermissionServiceName,y as PermissionServiceType,Pn as createFunction,
93
- Un as createMapping,bn as createPermission,Rn as getFunction,Ot as getFunctionArn,
94
- w as getFunctionName,Nn as getPermission,pt as isFunction,zn as isMapping,mt as isPermission,
95
- $n as registerTriggers};
83
+ arn:aws:logs:${t}:${r}:log-group:/aws/lambda/${e}-*:*`]}])};var ae=async e=>{let{state:t,options:r}=e,{resourcePrefix:n,projectName:o}=r,s=`${n}\
84
+ -${o}`;return Ft(t,{policyName:`${s}-lambda-policy`,policyDocument:await se(s)})};var ie=!1,_r=()=>{ie||(Rt(),Ct(),Et("@ez4/aws-function",{"deploy:prepareIdentity\
85
+ Account":oe,"deploy:prepareExecutionPolicy":ae}),L(),_(),ne(),ie=!0)};import{toKebabCase as pe,hashData as ce}from"@ez4/utils";import{attachEntry as vt}from"@ez4/stateful";var tn=(e,t,r)=>{let n=pe(r.functionName),o=ce(p,t.entryId,n);return vt(e,{type:p,
86
+ entryId:o,dependencies:[t.entryId],parameters:{...r,functionName:n}})},rn=(e,t,r)=>{
87
+ let n=pe(r),o=ce(p,t.entryId,n),s=e[o];return s&&B(s)?s:null};import{attachEntry as At}from"@ez4/stateful";import{hashData as ue}from"@ez4/utils";var me=e=>e.type===m;var un=(e,t,r,n)=>{let o=ue(m,t.entryId,r.entryId);return At(e,{type:m,entryId:o,
88
+ dependencies:[t.entryId,r.entryId],parameters:n})},ln=(e,t,r)=>{let n=ue(m,t.entryId,
89
+ r.entryId),o=e[n];return o&&me(o)?o:null};import{hashData as bt}from"@ez4/utils";import{attachEntry as Mt}from"@ez4/stateful";var Sn=(e,t,r,n)=>{let o=bt(g,t.entryId,r.entryId);return Mt(e,{type:g,entryId:o,
90
+ dependencies:[t.entryId,r.entryId],parameters:n})};var xn=e=>e.type===g;export{a as FunctionServiceName,p as FunctionServiceType,u as MappingServiceName,
91
+ g as MappingServiceType,S as PermissionServiceName,m as PermissionServiceType,tn as createFunction,
92
+ Sn as createMapping,un as createPermission,rn as getFunction,nr as getFunctionArn,
93
+ P as getFunctionName,ln as getPermission,B as isFunctionState,xn as isMappingState,
94
+ _r as registerTriggers};
@@ -5,14 +5,15 @@ export type BatchOptions = {
5
5
  };
6
6
  export type CreateRequest = {
7
7
  functionName: string;
8
- batch?: BatchOptions;
9
8
  sourceArn: Arn;
9
+ concurrency?: number;
10
10
  enabled?: boolean;
11
+ batch?: BatchOptions;
11
12
  };
12
13
  export type CreateResponse = {
13
14
  eventId: string;
14
15
  };
15
- export type UpdateRequest = Partial<Omit<CreateRequest, 'sourceArn'>>;
16
+ export type UpdateRequest = CreateRequest;
16
17
  export declare const createMapping: (request: CreateRequest) => Promise<CreateResponse>;
17
18
  export declare const updateMapping: (eventId: string, request: UpdateRequest) => Promise<void>;
18
19
  export declare const deleteMapping: (eventId: string) => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const registerMappingProvider: () => void;
@@ -1,5 +1,4 @@
1
1
  import type { EntryState, EntryStates } from '@ez4/stateful';
2
2
  import type { MappingParameters, MappingState } from './types.js';
3
3
  import type { FunctionState } from '../function/types.js';
4
- export declare const isMapping: (resource: EntryState) => resource is MappingState;
5
4
  export declare const createMapping: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState, parameters: MappingParameters) => MappingState;
@@ -0,0 +1,3 @@
1
+ import type { EntryState } from '@ez4/stateful';
2
+ import type { MappingState } from './types.js';
3
+ export declare const isMappingState: (resource: EntryState) => resource is MappingState;
@@ -0,0 +1 @@
1
+ export declare const registerPermissionProvider: () => void;
@@ -2,7 +2,6 @@ import type { EntryState, EntryStates } from '@ez4/stateful';
2
2
  import type { FunctionState } from '../function/types.js';
3
3
  import type { PermissionParameters, PermissionState } from './types.js';
4
4
  import { PermissionServiceType } from './types.js';
5
- export declare const isPermission: (resource: EntryState) => resource is PermissionState;
6
5
  export declare const createPermission: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState, parameters: PermissionParameters) => PermissionState;
7
6
  export declare const getPermission: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState) => (E & EntryState & {
8
7
  type: typeof PermissionServiceType;
@@ -0,0 +1,3 @@
1
+ import type { EntryState } from '@ez4/stateful';
2
+ import type { PermissionState } from './types.js';
3
+ export declare const isPermissionState: (resource: EntryState) => resource is PermissionState;
@@ -0,0 +1,2 @@
1
+ import type { IdentityAccount } from '@ez4/project/library';
2
+ export declare const prepareIdentityAccount: () => IdentityAccount[];
@@ -0,0 +1,2 @@
1
+ import type { PolicyResourceEvent } from '@ez4/project/library';
2
+ export declare const prepareExecutionPolicy: (event: PolicyResourceEvent) => Promise<import("@ez4/aws-identity").PolicyState>;
@@ -1,4 +1 @@
1
- /**
2
- * Register all triggers.
3
- */
4
- export declare const registerTriggers: () => true;
1
+ export declare const registerTriggers: () => void;
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "@ez4/aws-function",
3
- "description": "EZ4: Self-managed AWS lambda functions",
4
- "version": "0.4.0",
3
+ "description": "EZ4: Self-managed AWS lambda function provider",
4
+ "version": "0.6.0",
5
5
  "author": "Silas B.",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
+ "keywords": [
9
+ "ez4"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/sbalmt/ez4.git",
14
+ "directory": "packages/aws-function"
15
+ },
8
16
  "engines": {
9
17
  "node": ">=20.15.0"
10
18
  },
@@ -28,13 +36,15 @@
28
36
  "clean:registry": "rm -rf ../../.registry/@ez4/aws-function",
29
37
  "live:publish": "npm run test && npm publish --access public"
30
38
  },
39
+ "peerDependencies": {
40
+ "@ez4/project": "^0.6.0"
41
+ },
31
42
  "dependencies": {
32
43
  "@aws-sdk/client-lambda": "^3.614.0",
33
- "@ez4/aws-common": "^0.4.0",
34
- "@ez4/aws-identity": "^0.4.0",
35
- "@ez4/project": "^0.4.0",
36
- "@ez4/stateful": "^0.4.0",
37
- "@ez4/utils": "^0.4.0",
44
+ "@ez4/aws-common": "^0.6.0",
45
+ "@ez4/aws-identity": "^0.6.0",
46
+ "@ez4/stateful": "^0.6.0",
47
+ "@ez4/utils": "^0.6.0",
38
48
  "@types/adm-zip": "^0.5.5",
39
49
  "adm-zip": "^0.5.14"
40
50
  }