@walkeros/server-source-aws 0.5.1-next.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +45 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @walkeros/server-source-aws
|
|
2
2
|
|
|
3
|
+
## 0.6.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [f5120b2]
|
|
8
|
+
- @walkeros/core@0.7.0
|
|
9
|
+
|
|
10
|
+
## 0.0.0-next-20251219153324
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies [5163b01]
|
|
15
|
+
- @walkeros/core@0.0.0-next-20251219153324
|
|
16
|
+
|
|
3
17
|
## 0.5.1-next.0
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -99,7 +99,7 @@ fn.addFunctionUrl({
|
|
|
99
99
|
|
|
100
100
|
```yaml
|
|
101
101
|
# serverless.yml
|
|
102
|
-
service: walkeros-
|
|
102
|
+
service: walkeros-flow
|
|
103
103
|
|
|
104
104
|
provider:
|
|
105
105
|
name: aws
|
|
@@ -174,6 +174,50 @@ interface CorsOptions {
|
|
|
174
174
|
}
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
+
### Ingest Metadata
|
|
178
|
+
|
|
179
|
+
Extract request metadata from Lambda events and forward it to processors and
|
|
180
|
+
destinations:
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
await startFlow({
|
|
184
|
+
sources: {
|
|
185
|
+
lambda: {
|
|
186
|
+
code: sourceLambda,
|
|
187
|
+
config: {
|
|
188
|
+
settings: { cors: true },
|
|
189
|
+
ingest: {
|
|
190
|
+
// API Gateway v1 (REST API)
|
|
191
|
+
ip: 'requestContext.identity.sourceIp',
|
|
192
|
+
ua: 'requestContext.identity.userAgent',
|
|
193
|
+
// Or API Gateway v2 (HTTP API) / Function URLs:
|
|
194
|
+
// ip: 'requestContext.http.sourceIp',
|
|
195
|
+
// ua: 'requestContext.http.userAgent',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Available ingest paths (API Gateway v1):**
|
|
204
|
+
|
|
205
|
+
| Path | Description |
|
|
206
|
+
| ----------------------------------- | ----------------- |
|
|
207
|
+
| `requestContext.identity.sourceIp` | Client IP address |
|
|
208
|
+
| `requestContext.identity.userAgent` | User agent string |
|
|
209
|
+
| `headers.*` | HTTP headers |
|
|
210
|
+
| `httpMethod` | HTTP method |
|
|
211
|
+
|
|
212
|
+
**Available ingest paths (API Gateway v2 / Function URLs):**
|
|
213
|
+
|
|
214
|
+
| Path | Description |
|
|
215
|
+
| ------------------------------- | ----------------- |
|
|
216
|
+
| `requestContext.http.sourceIp` | Client IP address |
|
|
217
|
+
| `requestContext.http.userAgent` | User agent string |
|
|
218
|
+
| `requestContext.http.method` | HTTP method |
|
|
219
|
+
| `headers.*` | HTTP headers |
|
|
220
|
+
|
|
177
221
|
### Request Format
|
|
178
222
|
|
|
179
223
|
**POST - Single Event:**
|
package/dist/index.d.mts
CHANGED
|
@@ -218,6 +218,6 @@ declare namespace index {
|
|
|
218
218
|
export { index_env as env, index_events as events, index_inputs as inputs, index_outputs as outputs };
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
declare const sourceLambda:
|
|
221
|
+
declare const sourceLambda: Source.Init<Types>;
|
|
222
222
|
|
|
223
223
|
export { types as SourceLambda, index as examples, index$1 as schemas, sourceLambda };
|
package/dist/index.d.ts
CHANGED
|
@@ -218,6 +218,6 @@ declare namespace index {
|
|
|
218
218
|
export { index_env as env, index_events as events, index_inputs as inputs, index_outputs as outputs };
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
declare const sourceLambda:
|
|
221
|
+
declare const sourceLambda: Source.Init<Types>;
|
|
222
222
|
|
|
223
223
|
export { types as SourceLambda, index as examples, index$1 as schemas, sourceLambda };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,examples:()=>examples_exports,schemas:()=>schemas_exports,sourceLambda:()=>lambda_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core=require("@walkeros/core");function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var import_dev2=require("@walkeros/core/dev"),import_dev=require("@walkeros/core/dev"),HttpMethod=import_dev.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),CorsOrigin=import_dev.z.union([import_dev.z.string(),import_dev.z.array(import_dev.z.string()),import_dev.z.literal("*")]),CorsOptionsSchema=import_dev.z.object({origin:CorsOrigin.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:import_dev.z.array(HttpMethod).describe("Allowed HTTP methods").optional(),headers:import_dev.z.array(import_dev.z.string()).describe("Allowed request headers").optional(),credentials:import_dev.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:import_dev.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),SettingsSchema=import_dev2.z.object({cors:import_dev2.z.union([import_dev2.z.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:import_dev2.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:import_dev2.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:import_dev2.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),types_exports={},schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,HttpMethod:()=>HttpMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});var settings=(0,require("@walkeros/core/dev").zodToSchema)(SettingsSchema),examples_exports={};__export(examples_exports,{env:()=>env_exports,events:()=>events_exports,inputs:()=>inputs_exports,outputs:()=>outputs_exports});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),noopFn=()=>{},noopLogger={error:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},inputs_exports={};__export(inputs_exports,{apiGatewayV1PostEvent:()=>apiGatewayV1PostEvent,apiGatewayV2GetEvent:()=>apiGatewayV2GetEvent,apiGatewayV2PostEvent:()=>apiGatewayV2PostEvent,healthCheckEvent:()=>healthCheckEvent,invalidJsonEvent:()=>invalidJsonEvent,missingEventField:()=>missingEventField});var apiGatewayV2PostEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"",headers:{"content-type":"application/json","user-agent":"Mozilla/5.0"},body:JSON.stringify({event:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}}),isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"POST",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-123",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:00 +0000",timeEpoch:17040672e5}},apiGatewayV2GetEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"event=button%20click&data[id]=cta&data[text]=Sign%20Up",headers:{},isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"GET",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-456",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:01 +0000",timeEpoch:1704067201e3}},apiGatewayV1PostEvent={httpMethod:"POST",path:"/collect",body:JSON.stringify({event:"product add",data:{id:"P123",name:"Laptop",price:999}}),headers:{"content-type":"application/json"},multiValueHeaders:{},isBase64Encoded:!1,pathParameters:null,queryStringParameters:null,multiValueQueryStringParameters:null,stageVariables:null,resource:"/collect",requestContext:{accountId:"123456789012",apiId:"api-id",protocol:"HTTP/1.1",httpMethod:"POST",path:"/collect",stage:"prod",requestId:"request-789",requestTimeEpoch:1704067202e3,resourceId:"resource-id",resourcePath:"/collect",identity:{sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0",accessKey:null,accountId:null,apiKey:null,apiKeyId:null,caller:null,clientCert:null,cognitoAuthenticationProvider:null,cognitoAuthenticationType:null,cognitoIdentityId:null,cognitoIdentityPoolId:null,principalOrgId:null,user:null,userArn:null},authorizer:null}},healthCheckEvent={...apiGatewayV2GetEvent,rawPath:"/health",rawQueryString:"",requestContext:{...apiGatewayV2GetEvent.requestContext,http:{...apiGatewayV2GetEvent.requestContext.http,path:"/health"}}},invalidJsonEvent={...apiGatewayV2PostEvent,body:"{invalid json"},missingEventField={...apiGatewayV2PostEvent,body:JSON.stringify({data:{foo:"bar"}})},events_exports={};__export(events_exports,{buttonClickEvent:()=>buttonClickEvent,pageViewEvent:()=>pageViewEvent,productAddEvent:()=>productAddEvent});var pageViewEvent={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},buttonClickEvent={name:"button click",data:{id:"cta",text:"Sign Up"}},productAddEvent={name:"product add",data:{id:"P123",name:"Laptop",price:999}},outputs_exports={};__export(outputs_exports,{healthResponse:()=>healthResponse,invalidBodyResponse:()=>invalidBodyResponse,pixelResponse:()=>pixelResponse,successResponse:()=>successResponse});var successResponse={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},healthResponse={statusCode:200,body:expect.stringContaining('"status":"ok"')},pixelResponse={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},invalidBodyResponse={statusCode:400,body:expect.stringContaining('"success":false')},sourceLambda=async(config={},env)=>{const{push:envPush}=env,settings2=SettingsSchema.parse(config.settings||{});return{type:"lambda",config:{...config,settings:settings2},push:async(event,context)=>{var _a;const requestId=context.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings2.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings2.healthPath&&path===settings2.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if("GET"===parsed.method){if(!settings2.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=(0,import_core.requestToData)(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return createResponse(400,{success:!1,error:"Invalid event body",requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a=env.logger)||_a.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}},lambda_default=sourceLambda;//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,examples:()=>examples_exports,schemas:()=>schemas_exports,sourceLambda:()=>lambda_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core=require("@walkeros/core");function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var import_dev2=require("@walkeros/core/dev"),import_dev=require("@walkeros/core/dev"),HttpMethod=import_dev.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),CorsOrigin=import_dev.z.union([import_dev.z.string(),import_dev.z.array(import_dev.z.string()),import_dev.z.literal("*")]),CorsOptionsSchema=import_dev.z.object({origin:CorsOrigin.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:import_dev.z.array(HttpMethod).describe("Allowed HTTP methods").optional(),headers:import_dev.z.array(import_dev.z.string()).describe("Allowed request headers").optional(),credentials:import_dev.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:import_dev.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),SettingsSchema=import_dev2.z.object({cors:import_dev2.z.union([import_dev2.z.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:import_dev2.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:import_dev2.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:import_dev2.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),types_exports={},schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,HttpMethod:()=>HttpMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});var settings=(0,require("@walkeros/core/dev").zodToSchema)(SettingsSchema),examples_exports={};__export(examples_exports,{env:()=>env_exports,events:()=>events_exports,inputs:()=>inputs_exports,outputs:()=>outputs_exports});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},inputs_exports={};__export(inputs_exports,{apiGatewayV1PostEvent:()=>apiGatewayV1PostEvent,apiGatewayV2GetEvent:()=>apiGatewayV2GetEvent,apiGatewayV2PostEvent:()=>apiGatewayV2PostEvent,healthCheckEvent:()=>healthCheckEvent,invalidJsonEvent:()=>invalidJsonEvent,missingEventField:()=>missingEventField});var apiGatewayV2PostEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"",headers:{"content-type":"application/json","user-agent":"Mozilla/5.0"},body:JSON.stringify({event:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}}),isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"POST",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-123",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:00 +0000",timeEpoch:17040672e5}},apiGatewayV2GetEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"event=button%20click&data[id]=cta&data[text]=Sign%20Up",headers:{},isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"GET",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-456",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:01 +0000",timeEpoch:1704067201e3}},apiGatewayV1PostEvent={httpMethod:"POST",path:"/collect",body:JSON.stringify({event:"product add",data:{id:"P123",name:"Laptop",price:999}}),headers:{"content-type":"application/json"},multiValueHeaders:{},isBase64Encoded:!1,pathParameters:null,queryStringParameters:null,multiValueQueryStringParameters:null,stageVariables:null,resource:"/collect",requestContext:{accountId:"123456789012",apiId:"api-id",protocol:"HTTP/1.1",httpMethod:"POST",path:"/collect",stage:"prod",requestId:"request-789",requestTimeEpoch:1704067202e3,resourceId:"resource-id",resourcePath:"/collect",identity:{sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0",accessKey:null,accountId:null,apiKey:null,apiKeyId:null,caller:null,clientCert:null,cognitoAuthenticationProvider:null,cognitoAuthenticationType:null,cognitoIdentityId:null,cognitoIdentityPoolId:null,principalOrgId:null,user:null,userArn:null},authorizer:null}},healthCheckEvent={...apiGatewayV2GetEvent,rawPath:"/health",rawQueryString:"",requestContext:{...apiGatewayV2GetEvent.requestContext,http:{...apiGatewayV2GetEvent.requestContext.http,path:"/health"}}},invalidJsonEvent={...apiGatewayV2PostEvent,body:"{invalid json"},missingEventField={...apiGatewayV2PostEvent,body:JSON.stringify({data:{foo:"bar"}})},events_exports={};__export(events_exports,{buttonClickEvent:()=>buttonClickEvent,pageViewEvent:()=>pageViewEvent,productAddEvent:()=>productAddEvent});var pageViewEvent={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},buttonClickEvent={name:"button click",data:{id:"cta",text:"Sign Up"}},productAddEvent={name:"product add",data:{id:"P123",name:"Laptop",price:999}},outputs_exports={};__export(outputs_exports,{healthResponse:()=>healthResponse,invalidBodyResponse:()=>invalidBodyResponse,pixelResponse:()=>pixelResponse,successResponse:()=>successResponse});var successResponse={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},healthResponse={statusCode:200,body:expect.stringContaining('"status":"ok"')},pixelResponse={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},invalidBodyResponse={statusCode:400,body:expect.stringContaining('"success":false')},sourceLambda=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,settings2=SettingsSchema.parse(config.settings||{});return{type:"lambda",config:{...config,settings:settings2},push:async(event,context2)=>{var _a;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings2.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings2.healthPath&&path===settings2.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings2.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=(0,import_core.requestToData)(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return createResponse(400,{success:!1,error:"Invalid event body",requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a=env.logger)||_a.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}},lambda_default=sourceLambda;//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/types.ts","../src/lambda/schemas/index.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/inputs.ts","../src/lambda/examples/events.ts","../src/lambda/examples/outputs.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\n","import type { LambdaSource, Env, Settings, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\nimport { SettingsSchema } from './schemas/settings';\n\nexport * as SourceLambda from './types';\nexport * as schemas from './schemas';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda = async (\n config: Partial<Source.Config<Types>> = {},\n env: Env,\n): Promise<LambdaSource> => {\n const { push: envPush } = env;\n\n const settings = SettingsSchema.parse(config.settings || {});\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n if (!body || typeof body !== 'object') {\n return createResponse(\n 400,\n { success: false, error: 'Invalid event body', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","export * as env from './env';\nexport * as inputs from './inputs';\nexport * as events from './events';\nexport * as outputs from './outputs';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { APIGatewayProxyEvent, APIGatewayProxyEventV2 } from 'aws-lambda';\n\n/**\n * Real examples of Lambda events this source will receive.\n * These define the CONTRACT - implementation must handle these inputs.\n */\n\n// API Gateway v2 (HTTP API) - POST with walker event\nexport const apiGatewayV2PostEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: '',\n headers: {\n 'content-type': 'application/json',\n 'user-agent': 'Mozilla/5.0',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n }),\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'POST',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-123',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:00 +0000',\n timeEpoch: 1704067200000,\n },\n};\n\n// API Gateway v2 - GET with query params (pixel tracking)\nexport const apiGatewayV2GetEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: 'event=button%20click&data[id]=cta&data[text]=Sign%20Up',\n headers: {},\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'GET',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-456',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:01 +0000',\n timeEpoch: 1704067201000,\n },\n};\n\n// API Gateway v1 (REST API) - POST with walker event\nexport const apiGatewayV1PostEvent: APIGatewayProxyEvent = {\n httpMethod: 'POST',\n path: '/collect',\n body: JSON.stringify({\n event: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n }),\n headers: { 'content-type': 'application/json' },\n multiValueHeaders: {},\n isBase64Encoded: false,\n pathParameters: null,\n queryStringParameters: null,\n multiValueQueryStringParameters: null,\n stageVariables: null,\n resource: '/collect',\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n protocol: 'HTTP/1.1',\n httpMethod: 'POST',\n path: '/collect',\n stage: 'prod',\n requestId: 'request-789',\n requestTimeEpoch: 1704067202000,\n resourceId: 'resource-id',\n resourcePath: '/collect',\n identity: {\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n accessKey: null,\n accountId: null,\n apiKey: null,\n apiKeyId: null,\n caller: null,\n clientCert: null,\n cognitoAuthenticationProvider: null,\n cognitoAuthenticationType: null,\n cognitoIdentityId: null,\n cognitoIdentityPoolId: null,\n principalOrgId: null,\n user: null,\n userArn: null,\n },\n authorizer: null,\n },\n};\n\n// Health check request\nexport const healthCheckEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2GetEvent,\n rawPath: '/health',\n rawQueryString: '',\n requestContext: {\n ...apiGatewayV2GetEvent.requestContext,\n http: {\n ...apiGatewayV2GetEvent.requestContext.http,\n path: '/health',\n },\n },\n};\n\n// Invalid event - malformed JSON\nexport const invalidJsonEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: '{invalid json',\n};\n\n// Missing event field\nexport const missingEventField: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: JSON.stringify({ data: { foo: 'bar' } }),\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS events from Lambda inputs.\n * These are what processEvent should produce.\n */\n\n// From apiGatewayV2PostEvent\nexport const pageViewEvent: Partial<WalkerOS.Event> = {\n name: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n};\n\n// From apiGatewayV2GetEvent\nexport const buttonClickEvent: Partial<WalkerOS.Event> = {\n name: 'button click',\n data: { id: 'cta', text: 'Sign Up' },\n};\n\n// From apiGatewayV1PostEvent\nexport const productAddEvent: Partial<WalkerOS.Event> = {\n name: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n};\n","import type { APIGatewayProxyResult } from 'aws-lambda';\n\n/**\n * Expected Lambda response outputs.\n * Tests verify implementation produces these.\n */\n\n// Successful event processing\nexport const successResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n },\n body: expect.stringContaining('\"success\":true'),\n};\n\n// Health check response\nexport const healthResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n body: expect.stringContaining('\"status\":\"ok\"'),\n};\n\n// Pixel tracking response\nexport const pixelResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: expect.objectContaining({\n 'Content-Type': 'image/gif',\n }),\n isBase64Encoded: true,\n};\n\n// Error responses\nexport const invalidBodyResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 400,\n body: expect.stringContaining('\"success\":false'),\n};\n"],"mappings":"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","names":["push","import_dev","import_dev","settings","push"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/types.ts","../src/lambda/schemas/index.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/inputs.ts","../src/lambda/examples/events.ts","../src/lambda/examples/outputs.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\n","import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\nimport { SettingsSchema } from './schemas/settings';\n\nexport * as SourceLambda from './types';\nexport * as schemas from './schemas';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const settings = SettingsSchema.parse(config.settings || {});\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n if (!body || typeof body !== 'object') {\n return createResponse(\n 400,\n { success: false, error: 'Invalid event body', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","export * as env from './env';\nexport * as inputs from './inputs';\nexport * as events from './events';\nexport * as outputs from './outputs';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { APIGatewayProxyEvent, APIGatewayProxyEventV2 } from 'aws-lambda';\n\n/**\n * Real examples of Lambda events this source will receive.\n * These define the CONTRACT - implementation must handle these inputs.\n */\n\n// API Gateway v2 (HTTP API) - POST with walker event\nexport const apiGatewayV2PostEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: '',\n headers: {\n 'content-type': 'application/json',\n 'user-agent': 'Mozilla/5.0',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n }),\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'POST',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-123',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:00 +0000',\n timeEpoch: 1704067200000,\n },\n};\n\n// API Gateway v2 - GET with query params (pixel tracking)\nexport const apiGatewayV2GetEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: 'event=button%20click&data[id]=cta&data[text]=Sign%20Up',\n headers: {},\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'GET',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-456',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:01 +0000',\n timeEpoch: 1704067201000,\n },\n};\n\n// API Gateway v1 (REST API) - POST with walker event\nexport const apiGatewayV1PostEvent: APIGatewayProxyEvent = {\n httpMethod: 'POST',\n path: '/collect',\n body: JSON.stringify({\n event: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n }),\n headers: { 'content-type': 'application/json' },\n multiValueHeaders: {},\n isBase64Encoded: false,\n pathParameters: null,\n queryStringParameters: null,\n multiValueQueryStringParameters: null,\n stageVariables: null,\n resource: '/collect',\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n protocol: 'HTTP/1.1',\n httpMethod: 'POST',\n path: '/collect',\n stage: 'prod',\n requestId: 'request-789',\n requestTimeEpoch: 1704067202000,\n resourceId: 'resource-id',\n resourcePath: '/collect',\n identity: {\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n accessKey: null,\n accountId: null,\n apiKey: null,\n apiKeyId: null,\n caller: null,\n clientCert: null,\n cognitoAuthenticationProvider: null,\n cognitoAuthenticationType: null,\n cognitoIdentityId: null,\n cognitoIdentityPoolId: null,\n principalOrgId: null,\n user: null,\n userArn: null,\n },\n authorizer: null,\n },\n};\n\n// Health check request\nexport const healthCheckEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2GetEvent,\n rawPath: '/health',\n rawQueryString: '',\n requestContext: {\n ...apiGatewayV2GetEvent.requestContext,\n http: {\n ...apiGatewayV2GetEvent.requestContext.http,\n path: '/health',\n },\n },\n};\n\n// Invalid event - malformed JSON\nexport const invalidJsonEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: '{invalid json',\n};\n\n// Missing event field\nexport const missingEventField: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: JSON.stringify({ data: { foo: 'bar' } }),\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS events from Lambda inputs.\n * These are what processEvent should produce.\n */\n\n// From apiGatewayV2PostEvent\nexport const pageViewEvent: Partial<WalkerOS.Event> = {\n name: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n};\n\n// From apiGatewayV2GetEvent\nexport const buttonClickEvent: Partial<WalkerOS.Event> = {\n name: 'button click',\n data: { id: 'cta', text: 'Sign Up' },\n};\n\n// From apiGatewayV1PostEvent\nexport const productAddEvent: Partial<WalkerOS.Event> = {\n name: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n};\n","import type { APIGatewayProxyResult } from 'aws-lambda';\n\n/**\n * Expected Lambda response outputs.\n * Tests verify implementation produces these.\n */\n\n// Successful event processing\nexport const successResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n },\n body: expect.stringContaining('\"success\":true'),\n};\n\n// Health check response\nexport const healthResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n body: expect.stringContaining('\"status\":\"ok\"'),\n};\n\n// Pixel tracking response\nexport const pixelResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: expect.objectContaining({\n 'Content-Type': 'image/gif',\n }),\n isBase64Encoded: true,\n};\n\n// Error responses\nexport const invalidBodyResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 400,\n body: expect.stringContaining('\"success\":false'),\n};\n"],"mappings":"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","names":["push","import_dev","import_dev","settings","push","context"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}import{z as z2}from"@walkeros/core/dev";import{z}from"@walkeros/core/dev";var HttpMethod=z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),CorsOrigin=z.union([z.string(),z.array(z.string()),z.literal("*")]),CorsOptionsSchema=z.object({origin:CorsOrigin.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:z.array(HttpMethod).describe("Allowed HTTP methods").optional(),headers:z.array(z.string()).describe("Allowed request headers").optional(),credentials:z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),SettingsSchema=z2.object({cors:z2.union([z2.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:z2.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:z2.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:z2.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),types_exports={},schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,HttpMethod:()=>HttpMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});import{zodToSchema}from"@walkeros/core/dev";var settings=zodToSchema(SettingsSchema),examples_exports={};__export(examples_exports,{env:()=>env_exports,events:()=>events_exports,inputs:()=>inputs_exports,outputs:()=>outputs_exports});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),noopFn=()=>{},noopLogger={error:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},inputs_exports={};__export(inputs_exports,{apiGatewayV1PostEvent:()=>apiGatewayV1PostEvent,apiGatewayV2GetEvent:()=>apiGatewayV2GetEvent,apiGatewayV2PostEvent:()=>apiGatewayV2PostEvent,healthCheckEvent:()=>healthCheckEvent,invalidJsonEvent:()=>invalidJsonEvent,missingEventField:()=>missingEventField});var apiGatewayV2PostEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"",headers:{"content-type":"application/json","user-agent":"Mozilla/5.0"},body:JSON.stringify({event:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}}),isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"POST",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-123",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:00 +0000",timeEpoch:17040672e5}},apiGatewayV2GetEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"event=button%20click&data[id]=cta&data[text]=Sign%20Up",headers:{},isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"GET",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-456",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:01 +0000",timeEpoch:1704067201e3}},apiGatewayV1PostEvent={httpMethod:"POST",path:"/collect",body:JSON.stringify({event:"product add",data:{id:"P123",name:"Laptop",price:999}}),headers:{"content-type":"application/json"},multiValueHeaders:{},isBase64Encoded:!1,pathParameters:null,queryStringParameters:null,multiValueQueryStringParameters:null,stageVariables:null,resource:"/collect",requestContext:{accountId:"123456789012",apiId:"api-id",protocol:"HTTP/1.1",httpMethod:"POST",path:"/collect",stage:"prod",requestId:"request-789",requestTimeEpoch:1704067202e3,resourceId:"resource-id",resourcePath:"/collect",identity:{sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0",accessKey:null,accountId:null,apiKey:null,apiKeyId:null,caller:null,clientCert:null,cognitoAuthenticationProvider:null,cognitoAuthenticationType:null,cognitoIdentityId:null,cognitoIdentityPoolId:null,principalOrgId:null,user:null,userArn:null},authorizer:null}},healthCheckEvent={...apiGatewayV2GetEvent,rawPath:"/health",rawQueryString:"",requestContext:{...apiGatewayV2GetEvent.requestContext,http:{...apiGatewayV2GetEvent.requestContext.http,path:"/health"}}},invalidJsonEvent={...apiGatewayV2PostEvent,body:"{invalid json"},missingEventField={...apiGatewayV2PostEvent,body:JSON.stringify({data:{foo:"bar"}})},events_exports={};__export(events_exports,{buttonClickEvent:()=>buttonClickEvent,pageViewEvent:()=>pageViewEvent,productAddEvent:()=>productAddEvent});var pageViewEvent={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},buttonClickEvent={name:"button click",data:{id:"cta",text:"Sign Up"}},productAddEvent={name:"product add",data:{id:"P123",name:"Laptop",price:999}},outputs_exports={};__export(outputs_exports,{healthResponse:()=>healthResponse,invalidBodyResponse:()=>invalidBodyResponse,pixelResponse:()=>pixelResponse,successResponse:()=>successResponse});var successResponse={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},healthResponse={statusCode:200,body:expect.stringContaining('"status":"ok"')},pixelResponse={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},invalidBodyResponse={statusCode:400,body:expect.stringContaining('"success":false')},lambda_default=async(config={},env)=>{const{push:envPush}=env,settings2=SettingsSchema.parse(config.settings||{});return{type:"lambda",config:{...config,settings:settings2},push:async(event,context)=>{var _a;const requestId=context.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings2.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings2.healthPath&&path===settings2.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if("GET"===parsed.method){if(!settings2.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return createResponse(400,{success:!1,error:"Invalid event body",requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a=env.logger)||_a.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};export{types_exports as SourceLambda,examples_exports as examples,schemas_exports as schemas,lambda_default as sourceLambda};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}import{z as z2}from"@walkeros/core/dev";import{z}from"@walkeros/core/dev";var HttpMethod=z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),CorsOrigin=z.union([z.string(),z.array(z.string()),z.literal("*")]),CorsOptionsSchema=z.object({origin:CorsOrigin.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:z.array(HttpMethod).describe("Allowed HTTP methods").optional(),headers:z.array(z.string()).describe("Allowed request headers").optional(),credentials:z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),SettingsSchema=z2.object({cors:z2.union([z2.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:z2.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:z2.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:z2.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),types_exports={},schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,HttpMethod:()=>HttpMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});import{zodToSchema}from"@walkeros/core/dev";var settings=zodToSchema(SettingsSchema),examples_exports={};__export(examples_exports,{env:()=>env_exports,events:()=>events_exports,inputs:()=>inputs_exports,outputs:()=>outputs_exports});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},inputs_exports={};__export(inputs_exports,{apiGatewayV1PostEvent:()=>apiGatewayV1PostEvent,apiGatewayV2GetEvent:()=>apiGatewayV2GetEvent,apiGatewayV2PostEvent:()=>apiGatewayV2PostEvent,healthCheckEvent:()=>healthCheckEvent,invalidJsonEvent:()=>invalidJsonEvent,missingEventField:()=>missingEventField});var apiGatewayV2PostEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"",headers:{"content-type":"application/json","user-agent":"Mozilla/5.0"},body:JSON.stringify({event:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}}),isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"POST",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-123",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:00 +0000",timeEpoch:17040672e5}},apiGatewayV2GetEvent={version:"2.0",routeKey:"$default",rawPath:"/collect",rawQueryString:"event=button%20click&data[id]=cta&data[text]=Sign%20Up",headers:{},isBase64Encoded:!1,requestContext:{accountId:"123456789012",apiId:"api-id",domainName:"api.example.com",domainPrefix:"api",http:{method:"GET",path:"/collect",protocol:"HTTP/1.1",sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0"},requestId:"request-456",routeKey:"$default",stage:"prod",time:"01/Jan/2024:00:00:01 +0000",timeEpoch:1704067201e3}},apiGatewayV1PostEvent={httpMethod:"POST",path:"/collect",body:JSON.stringify({event:"product add",data:{id:"P123",name:"Laptop",price:999}}),headers:{"content-type":"application/json"},multiValueHeaders:{},isBase64Encoded:!1,pathParameters:null,queryStringParameters:null,multiValueQueryStringParameters:null,stageVariables:null,resource:"/collect",requestContext:{accountId:"123456789012",apiId:"api-id",protocol:"HTTP/1.1",httpMethod:"POST",path:"/collect",stage:"prod",requestId:"request-789",requestTimeEpoch:1704067202e3,resourceId:"resource-id",resourcePath:"/collect",identity:{sourceIp:"1.2.3.4",userAgent:"Mozilla/5.0",accessKey:null,accountId:null,apiKey:null,apiKeyId:null,caller:null,clientCert:null,cognitoAuthenticationProvider:null,cognitoAuthenticationType:null,cognitoIdentityId:null,cognitoIdentityPoolId:null,principalOrgId:null,user:null,userArn:null},authorizer:null}},healthCheckEvent={...apiGatewayV2GetEvent,rawPath:"/health",rawQueryString:"",requestContext:{...apiGatewayV2GetEvent.requestContext,http:{...apiGatewayV2GetEvent.requestContext.http,path:"/health"}}},invalidJsonEvent={...apiGatewayV2PostEvent,body:"{invalid json"},missingEventField={...apiGatewayV2PostEvent,body:JSON.stringify({data:{foo:"bar"}})},events_exports={};__export(events_exports,{buttonClickEvent:()=>buttonClickEvent,pageViewEvent:()=>pageViewEvent,productAddEvent:()=>productAddEvent});var pageViewEvent={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},buttonClickEvent={name:"button click",data:{id:"cta",text:"Sign Up"}},productAddEvent={name:"product add",data:{id:"P123",name:"Laptop",price:999}},outputs_exports={};__export(outputs_exports,{healthResponse:()=>healthResponse,invalidBodyResponse:()=>invalidBodyResponse,pixelResponse:()=>pixelResponse,successResponse:()=>successResponse});var successResponse={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},healthResponse={statusCode:200,body:expect.stringContaining('"status":"ok"')},pixelResponse={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},invalidBodyResponse={statusCode:400,body:expect.stringContaining('"success":false')},lambda_default=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,settings2=SettingsSchema.parse(config.settings||{});return{type:"lambda",config:{...config,settings:settings2},push:async(event,context2)=>{var _a;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings2.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings2.healthPath&&path===settings2.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings2.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return createResponse(400,{success:!1,error:"Invalid event body",requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a=env.logger)||_a.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};export{types_exports as SourceLambda,examples_exports as examples,schemas_exports as schemas,lambda_default as sourceLambda};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/types.ts","../src/lambda/schemas/index.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/inputs.ts","../src/lambda/examples/events.ts","../src/lambda/examples/outputs.ts"],"sourcesContent":["import type { LambdaSource, Env, Settings, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\nimport { SettingsSchema } from './schemas/settings';\n\nexport * as SourceLambda from './types';\nexport * as schemas from './schemas';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda = async (\n config: Partial<Source.Config<Types>> = {},\n env: Env,\n): Promise<LambdaSource> => {\n const { push: envPush } = env;\n\n const settings = SettingsSchema.parse(config.settings || {});\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n if (!body || typeof body !== 'object') {\n return createResponse(\n 400,\n { success: false, error: 'Invalid event body', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","export * as env from './env';\nexport * as inputs from './inputs';\nexport * as events from './events';\nexport * as outputs from './outputs';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { APIGatewayProxyEvent, APIGatewayProxyEventV2 } from 'aws-lambda';\n\n/**\n * Real examples of Lambda events this source will receive.\n * These define the CONTRACT - implementation must handle these inputs.\n */\n\n// API Gateway v2 (HTTP API) - POST with walker event\nexport const apiGatewayV2PostEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: '',\n headers: {\n 'content-type': 'application/json',\n 'user-agent': 'Mozilla/5.0',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n }),\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'POST',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-123',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:00 +0000',\n timeEpoch: 1704067200000,\n },\n};\n\n// API Gateway v2 - GET with query params (pixel tracking)\nexport const apiGatewayV2GetEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: 'event=button%20click&data[id]=cta&data[text]=Sign%20Up',\n headers: {},\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'GET',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-456',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:01 +0000',\n timeEpoch: 1704067201000,\n },\n};\n\n// API Gateway v1 (REST API) - POST with walker event\nexport const apiGatewayV1PostEvent: APIGatewayProxyEvent = {\n httpMethod: 'POST',\n path: '/collect',\n body: JSON.stringify({\n event: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n }),\n headers: { 'content-type': 'application/json' },\n multiValueHeaders: {},\n isBase64Encoded: false,\n pathParameters: null,\n queryStringParameters: null,\n multiValueQueryStringParameters: null,\n stageVariables: null,\n resource: '/collect',\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n protocol: 'HTTP/1.1',\n httpMethod: 'POST',\n path: '/collect',\n stage: 'prod',\n requestId: 'request-789',\n requestTimeEpoch: 1704067202000,\n resourceId: 'resource-id',\n resourcePath: '/collect',\n identity: {\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n accessKey: null,\n accountId: null,\n apiKey: null,\n apiKeyId: null,\n caller: null,\n clientCert: null,\n cognitoAuthenticationProvider: null,\n cognitoAuthenticationType: null,\n cognitoIdentityId: null,\n cognitoIdentityPoolId: null,\n principalOrgId: null,\n user: null,\n userArn: null,\n },\n authorizer: null,\n },\n};\n\n// Health check request\nexport const healthCheckEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2GetEvent,\n rawPath: '/health',\n rawQueryString: '',\n requestContext: {\n ...apiGatewayV2GetEvent.requestContext,\n http: {\n ...apiGatewayV2GetEvent.requestContext.http,\n path: '/health',\n },\n },\n};\n\n// Invalid event - malformed JSON\nexport const invalidJsonEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: '{invalid json',\n};\n\n// Missing event field\nexport const missingEventField: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: JSON.stringify({ data: { foo: 'bar' } }),\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS events from Lambda inputs.\n * These are what processEvent should produce.\n */\n\n// From apiGatewayV2PostEvent\nexport const pageViewEvent: Partial<WalkerOS.Event> = {\n name: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n};\n\n// From apiGatewayV2GetEvent\nexport const buttonClickEvent: Partial<WalkerOS.Event> = {\n name: 'button click',\n data: { id: 'cta', text: 'Sign Up' },\n};\n\n// From apiGatewayV1PostEvent\nexport const productAddEvent: Partial<WalkerOS.Event> = {\n name: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n};\n","import type { APIGatewayProxyResult } from 'aws-lambda';\n\n/**\n * Expected Lambda response outputs.\n * Tests verify implementation produces these.\n */\n\n// Successful event processing\nexport const successResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n },\n body: expect.stringContaining('\"success\":true'),\n};\n\n// Health check response\nexport const healthResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n body: expect.stringContaining('\"status\":\"ok\"'),\n};\n\n// Pixel tracking response\nexport const pixelResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: expect.objectContaining({\n 'Content-Type': 'image/gif',\n }),\n isBase64Encoded: true,\n};\n\n// Error responses\nexport const invalidBodyResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 400,\n body: expect.stringContaining('\"success\":false'),\n};\n"],"mappings":"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","names":["push","z","z","settings","push"]}
|
|
1
|
+
{"version":3,"sources":["../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/types.ts","../src/lambda/schemas/index.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/inputs.ts","../src/lambda/examples/events.ts","../src/lambda/examples/outputs.ts"],"sourcesContent":["import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\nimport { SettingsSchema } from './schemas/settings';\n\nexport * as SourceLambda from './types';\nexport * as schemas from './schemas';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const settings = SettingsSchema.parse(config.settings || {});\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n if (!body || typeof body !== 'object') {\n return createResponse(\n 400,\n { success: false, error: 'Invalid event body', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","export * as env from './env';\nexport * as inputs from './inputs';\nexport * as events from './events';\nexport * as outputs from './outputs';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { APIGatewayProxyEvent, APIGatewayProxyEventV2 } from 'aws-lambda';\n\n/**\n * Real examples of Lambda events this source will receive.\n * These define the CONTRACT - implementation must handle these inputs.\n */\n\n// API Gateway v2 (HTTP API) - POST with walker event\nexport const apiGatewayV2PostEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: '',\n headers: {\n 'content-type': 'application/json',\n 'user-agent': 'Mozilla/5.0',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n }),\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'POST',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-123',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:00 +0000',\n timeEpoch: 1704067200000,\n },\n};\n\n// API Gateway v2 - GET with query params (pixel tracking)\nexport const apiGatewayV2GetEvent: APIGatewayProxyEventV2 = {\n version: '2.0',\n routeKey: '$default',\n rawPath: '/collect',\n rawQueryString: 'event=button%20click&data[id]=cta&data[text]=Sign%20Up',\n headers: {},\n isBase64Encoded: false,\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n domainName: 'api.example.com',\n domainPrefix: 'api',\n http: {\n method: 'GET',\n path: '/collect',\n protocol: 'HTTP/1.1',\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n },\n requestId: 'request-456',\n routeKey: '$default',\n stage: 'prod',\n time: '01/Jan/2024:00:00:01 +0000',\n timeEpoch: 1704067201000,\n },\n};\n\n// API Gateway v1 (REST API) - POST with walker event\nexport const apiGatewayV1PostEvent: APIGatewayProxyEvent = {\n httpMethod: 'POST',\n path: '/collect',\n body: JSON.stringify({\n event: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n }),\n headers: { 'content-type': 'application/json' },\n multiValueHeaders: {},\n isBase64Encoded: false,\n pathParameters: null,\n queryStringParameters: null,\n multiValueQueryStringParameters: null,\n stageVariables: null,\n resource: '/collect',\n requestContext: {\n accountId: '123456789012',\n apiId: 'api-id',\n protocol: 'HTTP/1.1',\n httpMethod: 'POST',\n path: '/collect',\n stage: 'prod',\n requestId: 'request-789',\n requestTimeEpoch: 1704067202000,\n resourceId: 'resource-id',\n resourcePath: '/collect',\n identity: {\n sourceIp: '1.2.3.4',\n userAgent: 'Mozilla/5.0',\n accessKey: null,\n accountId: null,\n apiKey: null,\n apiKeyId: null,\n caller: null,\n clientCert: null,\n cognitoAuthenticationProvider: null,\n cognitoAuthenticationType: null,\n cognitoIdentityId: null,\n cognitoIdentityPoolId: null,\n principalOrgId: null,\n user: null,\n userArn: null,\n },\n authorizer: null,\n },\n};\n\n// Health check request\nexport const healthCheckEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2GetEvent,\n rawPath: '/health',\n rawQueryString: '',\n requestContext: {\n ...apiGatewayV2GetEvent.requestContext,\n http: {\n ...apiGatewayV2GetEvent.requestContext.http,\n path: '/health',\n },\n },\n};\n\n// Invalid event - malformed JSON\nexport const invalidJsonEvent: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: '{invalid json',\n};\n\n// Missing event field\nexport const missingEventField: APIGatewayProxyEventV2 = {\n ...apiGatewayV2PostEvent,\n body: JSON.stringify({ data: { foo: 'bar' } }),\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS events from Lambda inputs.\n * These are what processEvent should produce.\n */\n\n// From apiGatewayV2PostEvent\nexport const pageViewEvent: Partial<WalkerOS.Event> = {\n name: 'page view',\n data: { title: 'Home Page', path: '/' },\n user: { id: 'user-123' },\n};\n\n// From apiGatewayV2GetEvent\nexport const buttonClickEvent: Partial<WalkerOS.Event> = {\n name: 'button click',\n data: { id: 'cta', text: 'Sign Up' },\n};\n\n// From apiGatewayV1PostEvent\nexport const productAddEvent: Partial<WalkerOS.Event> = {\n name: 'product add',\n data: { id: 'P123', name: 'Laptop', price: 999 },\n};\n","import type { APIGatewayProxyResult } from 'aws-lambda';\n\n/**\n * Expected Lambda response outputs.\n * Tests verify implementation produces these.\n */\n\n// Successful event processing\nexport const successResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n },\n body: expect.stringContaining('\"success\":true'),\n};\n\n// Health check response\nexport const healthResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n body: expect.stringContaining('\"status\":\"ok\"'),\n};\n\n// Pixel tracking response\nexport const pixelResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 200,\n headers: expect.objectContaining({\n 'Content-Type': 'image/gif',\n }),\n isBase64Encoded: true,\n};\n\n// Error responses\nexport const invalidBodyResponse: Partial<APIGatewayProxyResult> = {\n statusCode: 400,\n body: expect.stringContaining('\"success\":false'),\n};\n"],"mappings":"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","names":["push","z","z","settings","push","context"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/server-source-aws",
|
|
3
3
|
"description": "AWS server sources for walkerOS (Lambda, API Gateway, Function URLs)",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"update": "npx npm-check-updates -u && npm update"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@walkeros/core": "0.
|
|
23
|
+
"@walkeros/core": "0.7.0"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"@types/aws-lambda": "^8.10.0"
|