@walkeros/server-source-aws 0.5.0 → 0.5.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @walkeros/server-source-aws
2
2
 
3
+ ## 0.5.1-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [5163b01]
8
+ - @walkeros/core@0.5.1-next.0
9
+
3
10
  ## 0.5.0
4
11
 
5
12
  ### Minor Changes
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,a=(e,r)=>{for(var o in r)t(e,o,{get:r[o],enumerable:!0})},s={};a(s,{SourceLambda:()=>y,examples:()=>A,schemas:()=>f,sourceLambda:()=>J}),module.exports=(e=s,((e,a,s,i)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))n.call(e,c)||c===s||t(e,c,{get:()=>a[c],enumerable:!(i=r(a,c))||i.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core");function c(e){return"version"in e&&"2.0"===e.version}function l(e,t,r={},o){const n={"Content-Type":"object"==typeof t?"application/json":"text/plain",...r};return o&&(n["X-Request-ID"]=o),{statusCode:e,headers:n,body:"object"==typeof t?JSON.stringify(t):String(t),isBase64Encoded:!1}}var u=require("@walkeros/core/dev"),d=require("@walkeros/core/dev"),p=d.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),h=d.z.union([d.z.string(),d.z.array(d.z.string()),d.z.literal("*")]),g=d.z.object({origin:h.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:d.z.array(p).describe("Allowed HTTP methods").optional(),headers:d.z.array(d.z.string()).describe("Allowed request headers").optional(),credentials:d.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:d.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),m=u.z.object({cors:u.z.union([u.z.boolean(),g]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:u.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:u.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:u.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),y={},f={};a(f,{CorsOptionsSchema:()=>g,CorsOrigin:()=>h,HttpMethod:()=>p,SettingsSchema:()=>m,settings:()=>b});var b=(0,require("@walkeros/core/dev").zodToSchema)(m),A={};a(A,{env:()=>v,events:()=>j,inputs:()=>E,outputs:()=>H});var v={};a(v,{push:()=>C});var w=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),P=()=>{},q={error:P,info:P,debug:P,throw:e=>{throw"string"==typeof e?new Error(e):e},scope:()=>q},C={get push(){return w()},get command(){return w()},get elb(){return w()},logger:q},E={};a(E,{apiGatewayV1PostEvent:()=>T,apiGatewayV2GetEvent:()=>S,apiGatewayV2PostEvent:()=>I,healthCheckEvent:()=>O,invalidJsonEvent:()=>x,missingEventField:()=>z});var I={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}},S={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}},T={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}},O={...S,rawPath:"/health",rawQueryString:"",requestContext:{...S.requestContext,http:{...S.requestContext.http,path:"/health"}}},x={...I,body:"{invalid json"},z={...I,body:JSON.stringify({data:{foo:"bar"}})},j={};a(j,{buttonClickEvent:()=>B,pageViewEvent:()=>k,productAddEvent:()=>R});var k={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},B={name:"button click",data:{id:"cta",text:"Sign Up"}},R={name:"product add",data:{id:"P123",name:"Laptop",price:999}},H={};a(H,{healthResponse:()=>L,invalidBodyResponse:()=>N,pixelResponse:()=>G,successResponse:()=>M});var M={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},L={statusCode:200,body:expect.stringContaining('"status":"ok"')},G={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},N={statusCode:400,body:expect.stringContaining('"success":false')},D=async(e={},t)=>{const{push:r}=t,o=m.parse(e.settings||{});return{type:"lambda",config:{...e,settings:o},push:async(e,n)=>{var a;const s=n.awsRequestId;let u;try{const n=function(e){if(!e)return{};if(!0===e)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 t={};if(e.origin){const r=Array.isArray(e.origin)?e.origin.join(", "):e.origin;t["Access-Control-Allow-Origin"]=r}return e.methods&&(t["Access-Control-Allow-Methods"]=e.methods.join(", ")),e.headers&&(t["Access-Control-Allow-Headers"]=e.headers.join(", ")),e.credentials&&(t["Access-Control-Allow-Credentials"]="true"),void 0!==e.maxAge&&(t["Access-Control-Max-Age"]=e.maxAge.toString()),t}(o.cors||!1);u=function(e){if(c(e)){const t={};return e.headers&&Object.entries(e.headers).forEach(([e,r])=>{r&&(t[e.toLowerCase()]=r)}),{method:e.requestContext.http.method,body:e.body,queryString:e.rawQueryString||null,headers:t,isBase64Encoded:e.isBase64Encoded||!1}}{const t={};e.headers&&Object.entries(e.headers).forEach(([e,r])=>{r&&(t[e.toLowerCase()]=r)});let r=null;if(e.queryStringParameters){const t=new URLSearchParams;Object.entries(e.queryStringParameters).forEach(([e,r])=>{r&&t.append(e,r)}),r=t.toString()||null}return{method:e.httpMethod,body:e.body,queryString:r,headers:t,isBase64Encoded:e.isBase64Encoded||!1}}}(e);const a=function(e){return c(e)?e.rawPath:e.path}(e);if(o.healthPath&&a===o.healthPath)return l(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:s},n,s);if("OPTIONS"===u.method)return l(204,"",n,s);if("GET"===u.method){if(!o.enablePixelTracking)return l(405,{success:!1,error:"GET not allowed",requestId:s},n,s);if(u.queryString){const e=(0,i.requestToData)(u.queryString);e&&"object"==typeof e&&await r(e)}return function(e={},t){const r={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...e};return t&&(r["X-Request-ID"]=t),{statusCode:200,headers:r,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(n,s)}if("POST"===u.method){if(!u.body)return l(400,{success:!1,error:"Request body is required",requestId:s},n,s);const e=function(e,t){if(!e||"string"!=typeof e)return e;try{const r=t?Buffer.from(e,"base64").toString("utf8"):e;return JSON.parse(r)}catch(t){return e}}(u.body,u.isBase64Encoded);if(!e||"object"!=typeof e)return l(400,{success:!1,error:"Invalid event body",requestId:s},n,s);if(function(e){return"object"==typeof e&&null!==e&&"event"in e&&"string"==typeof e.event}(e)){const o=await async function(e,t,r,o){var n;try{const r=await t({name:e.event,data:e.data||{},context:e.context,user:e.user,globals:e.globals,consent:e.consent});return{id:null==(n=null==r?void 0:r.event)?void 0:n.id}}catch(t){return null==r||r.error("Event processing failed",{error:t,eventName:e.event,requestId:o}),{error:t instanceof Error?t.message:"Unknown error"}}}(e,r,t.logger,s);return o.error?l(400,{success:!1,error:o.error,requestId:s},n,s):l(200,{success:!0,id:o.id,requestId:s},n,s)}return l(400,{success:!1,error:"Invalid request format",requestId:s},n,s)}return l(405,{success:!1,error:"Method not allowed",requestId:s},n,s)}catch(e){return null==(a=t.logger)||a.error("Lambda handler error",{error:e,requestId:s,method:null==u?void 0:u.method}),l(500,{success:!1,error:e instanceof Error?e.message:"Internal server error",requestId:s},{},s)}}}},J=D;//# 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,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&&params.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
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,r)=>{for(var o in r)e(t,o,{get:r[o],enumerable:!0})};import{requestToData as r}from"@walkeros/core";function o(e){return"version"in e&&"2.0"===e.version}function n(e,t,r={},o){const n={"Content-Type":"object"==typeof t?"application/json":"text/plain",...r};return o&&(n["X-Request-ID"]=o),{statusCode:e,headers:n,body:"object"==typeof t?JSON.stringify(t):String(t),isBase64Encoded:!1}}import{z as a}from"@walkeros/core/dev";import{z as s}from"@walkeros/core/dev";var i=s.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),c=s.union([s.string(),s.array(s.string()),s.literal("*")]),l=s.object({origin:c.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:s.array(i).describe("Allowed HTTP methods").optional(),headers:s.array(s.string()).describe("Allowed request headers").optional(),credentials:s.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:s.number().int().positive().describe("Preflight cache duration in seconds").optional()}),d=a.object({cors:a.union([a.boolean(),l]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:a.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:a.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:a.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),u={},p={};t(p,{CorsOptionsSchema:()=>l,CorsOrigin:()=>c,HttpMethod:()=>i,SettingsSchema:()=>d,settings:()=>g});import{zodToSchema as h}from"@walkeros/core/dev";var g=h(d),m={};t(m,{env:()=>f,events:()=>T,inputs:()=>w,outputs:()=>k});var f={};t(f,{push:()=>v});var y=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),A=()=>{},b={error:A,info:A,debug:A,throw:e=>{throw"string"==typeof e?new Error(e):e},scope:()=>b},v={get push(){return y()},get command(){return y()},get elb(){return y()},logger:b},w={};t(w,{apiGatewayV1PostEvent:()=>E,apiGatewayV2GetEvent:()=>C,apiGatewayV2PostEvent:()=>P,healthCheckEvent:()=>I,invalidJsonEvent:()=>q,missingEventField:()=>S});var P={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}},C={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}},E={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}},I={...C,rawPath:"/health",rawQueryString:"",requestContext:{...C.requestContext,http:{...C.requestContext.http,path:"/health"}}},q={...P,body:"{invalid json"},S={...P,body:JSON.stringify({data:{foo:"bar"}})},T={};t(T,{buttonClickEvent:()=>O,pageViewEvent:()=>x,productAddEvent:()=>j});var x={name:"page view",data:{title:"Home Page",path:"/"},user:{id:"user-123"}},O={name:"button click",data:{id:"cta",text:"Sign Up"}},j={name:"product add",data:{id:"P123",name:"Laptop",price:999}},k={};t(k,{healthResponse:()=>R,invalidBodyResponse:()=>L,pixelResponse:()=>H,successResponse:()=>B});var B={statusCode:200,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"},body:expect.stringContaining('"success":true')},R={statusCode:200,body:expect.stringContaining('"status":"ok"')},H={statusCode:200,headers:expect.objectContaining({"Content-Type":"image/gif"}),isBase64Encoded:!0},L={statusCode:400,body:expect.stringContaining('"success":false')},M=async(e={},t)=>{const{push:a}=t,s=d.parse(e.settings||{});return{type:"lambda",config:{...e,settings:s},push:async(e,i)=>{var c;const l=i.awsRequestId;let d;try{const i=function(e){if(!e)return{};if(!0===e)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 t={};if(e.origin){const r=Array.isArray(e.origin)?e.origin.join(", "):e.origin;t["Access-Control-Allow-Origin"]=r}return e.methods&&(t["Access-Control-Allow-Methods"]=e.methods.join(", ")),e.headers&&(t["Access-Control-Allow-Headers"]=e.headers.join(", ")),e.credentials&&(t["Access-Control-Allow-Credentials"]="true"),void 0!==e.maxAge&&(t["Access-Control-Max-Age"]=e.maxAge.toString()),t}(s.cors||!1);d=function(e){if(o(e)){const t={};return e.headers&&Object.entries(e.headers).forEach(([e,r])=>{r&&(t[e.toLowerCase()]=r)}),{method:e.requestContext.http.method,body:e.body,queryString:e.rawQueryString||null,headers:t,isBase64Encoded:e.isBase64Encoded||!1}}{const t={};e.headers&&Object.entries(e.headers).forEach(([e,r])=>{r&&(t[e.toLowerCase()]=r)});let r=null;if(e.queryStringParameters){const t=new URLSearchParams;Object.entries(e.queryStringParameters).forEach(([e,r])=>{r&&t.append(e,r)}),r=t.toString()||null}return{method:e.httpMethod,body:e.body,queryString:r,headers:t,isBase64Encoded:e.isBase64Encoded||!1}}}(e);const c=function(e){return o(e)?e.rawPath:e.path}(e);if(s.healthPath&&c===s.healthPath)return n(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:l},i,l);if("OPTIONS"===d.method)return n(204,"",i,l);if("GET"===d.method){if(!s.enablePixelTracking)return n(405,{success:!1,error:"GET not allowed",requestId:l},i,l);if(d.queryString){const e=r(d.queryString);e&&"object"==typeof e&&await a(e)}return function(e={},t){const r={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...e};return t&&(r["X-Request-ID"]=t),{statusCode:200,headers:r,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(i,l)}if("POST"===d.method){if(!d.body)return n(400,{success:!1,error:"Request body is required",requestId:l},i,l);const e=function(e,t){if(!e||"string"!=typeof e)return e;try{const r=t?Buffer.from(e,"base64").toString("utf8"):e;return JSON.parse(r)}catch(t){return e}}(d.body,d.isBase64Encoded);if(!e||"object"!=typeof e)return n(400,{success:!1,error:"Invalid event body",requestId:l},i,l);if(function(e){return"object"==typeof e&&null!==e&&"event"in e&&"string"==typeof e.event}(e)){const r=await async function(e,t,r,o){var n;try{const r=await t({name:e.event,data:e.data||{},context:e.context,user:e.user,globals:e.globals,consent:e.consent});return{id:null==(n=null==r?void 0:r.event)?void 0:n.id}}catch(t){return null==r||r.error("Event processing failed",{error:t,eventName:e.event,requestId:o}),{error:t instanceof Error?t.message:"Unknown error"}}}(e,a,t.logger,l);return r.error?n(400,{success:!1,error:r.error,requestId:l},i,l):n(200,{success:!0,id:r.id,requestId:l},i,l)}return n(400,{success:!1,error:"Invalid request format",requestId:l},i,l)}return n(405,{success:!1,error:"Method not allowed",requestId:l},i,l)}catch(e){return null==(c=t.logger)||c.error("Lambda handler error",{error:e,requestId:l,method:null==d?void 0:d.method}),n(500,{success:!1,error:e instanceof Error?e.message:"Internal server error",requestId:l},{},l)}}}};export{u as SourceLambda,m as examples,p as schemas,M 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,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&&params.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
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.5.0",
4
+ "version": "0.5.1-next.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -20,13 +20,13 @@
20
20
  "update": "npx npm-check-updates -u && npm update"
21
21
  },
22
22
  "dependencies": {
23
- "@walkeros/core": "0.5.0"
23
+ "@walkeros/core": "0.5.1-next.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "@types/aws-lambda": "^8.10.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@types/aws-lambda": "^8.10.145"
29
+ "@types/aws-lambda": "^8.10.159"
30
30
  },
31
31
  "repository": {
32
32
  "url": "git+https://github.com/elbwalker/walkerOS.git",