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