@walkeros/server-source-fetch 3.0.2 → 3.1.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/dist/dev.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { z } from '@walkeros/core/dev';
3
- import { WalkerOS, Flow } from '@walkeros/core';
3
+ import { WalkerOS, Flow, Trigger } from '@walkeros/core';
4
4
 
5
5
  declare const HttpMethod: z.ZodEnum<{
6
6
  GET: "GET";
@@ -224,11 +224,25 @@ declare namespace step {
224
224
  export { step_batchRequest as batchRequest, step_pixelGet as pixelGet, step_postEvent as postEvent };
225
225
  }
226
226
 
227
+ interface Content {
228
+ method: string;
229
+ url: string;
230
+ body?: unknown;
231
+ headers?: Record<string, string>;
232
+ }
233
+ interface Result {
234
+ status: number;
235
+ body: unknown;
236
+ headers: Record<string, string>;
237
+ }
238
+ declare const createTrigger: Trigger.CreateFn<Content, Result>;
239
+
240
+ declare const index_createTrigger: typeof createTrigger;
227
241
  declare const index_inputs: typeof inputs;
228
242
  declare const index_requests: typeof requests;
229
243
  declare const index_step: typeof step;
230
244
  declare namespace index {
231
- export { index_inputs as inputs, index_requests as requests, index_step as step };
245
+ export { index_createTrigger as createTrigger, index_inputs as inputs, index_requests as requests, index_step as step };
232
246
  }
233
247
 
234
248
  export { index as examples, index$1 as schemas };
package/dist/dev.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { z } from '@walkeros/core/dev';
3
- import { WalkerOS, Flow } from '@walkeros/core';
3
+ import { WalkerOS, Flow, Trigger } from '@walkeros/core';
4
4
 
5
5
  declare const HttpMethod: z.ZodEnum<{
6
6
  GET: "GET";
@@ -224,11 +224,25 @@ declare namespace step {
224
224
  export { step_batchRequest as batchRequest, step_pixelGet as pixelGet, step_postEvent as postEvent };
225
225
  }
226
226
 
227
+ interface Content {
228
+ method: string;
229
+ url: string;
230
+ body?: unknown;
231
+ headers?: Record<string, string>;
232
+ }
233
+ interface Result {
234
+ status: number;
235
+ body: unknown;
236
+ headers: Record<string, string>;
237
+ }
238
+ declare const createTrigger: Trigger.CreateFn<Content, Result>;
239
+
240
+ declare const index_createTrigger: typeof createTrigger;
227
241
  declare const index_inputs: typeof inputs;
228
242
  declare const index_requests: typeof requests;
229
243
  declare const index_step: typeof step;
230
244
  declare namespace index {
231
- export { index_inputs as inputs, index_requests as requests, index_step as step };
245
+ export { index_createTrigger as createTrigger, index_inputs as inputs, index_requests as requests, index_step as step };
232
246
  }
233
247
 
234
248
  export { index as examples, index$1 as schemas };
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,n=(e,o)=>{for(var a in o)t(e,a,{get:o[a],enumerable:!0})},r={};n(r,{examples:()=>j,schemas:()=>s}),module.exports=(e=r,((e,n,r,s)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let l of a(n))i.call(e,l)||l===r||t(e,l,{get:()=>n[l],enumerable:!(s=o(n,l))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};n(s,{CorsOptionsSchema:()=>u,CorsOrigin:()=>d,EventSchema:()=>P,HttpMethod:()=>m,RouteConfigSchema:()=>z,RouteMethod:()=>g,SettingsSchema:()=>h,settings:()=>f});var l=require("@walkeros/core/dev"),c=require("@walkeros/core/dev"),p=require("@walkeros/core/dev"),m=p.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),d=p.z.union([p.z.string(),p.z.array(p.z.string()),p.z.literal("*")]),u=p.z.object({origin:d.optional(),methods:p.z.array(m).optional(),headers:p.z.array(p.z.string()).optional(),credentials:p.z.boolean().optional(),maxAge:p.z.number().int().positive().optional()}),g=p.z.enum(["GET","POST"]),z=p.z.object({path:p.z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:p.z.array(g).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),h=c.z.object({path:c.z.string().describe("Deprecated: use paths instead").optional(),paths:c.z.array(c.z.union([c.z.string(),z])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:c.z.union([c.z.boolean(),u]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:c.z.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:c.z.number().int().positive().describe("Maximum events per batch request").default(100)}),b=require("@walkeros/core/dev"),y=b.z.record(b.z.string(),b.z.union([b.z.string(),b.z.number(),b.z.boolean(),b.z.record(b.z.string(),b.z.any())])),v=b.z.record(b.z.string(),b.z.tuple([b.z.union([b.z.string(),b.z.number(),b.z.boolean(),b.z.record(b.z.string(),b.z.any())]),b.z.number()])),O=b.z.object({id:b.z.string().optional(),device:b.z.string().optional(),session:b.z.string().optional(),email:b.z.string().optional(),hash:b.z.string().optional()}).passthrough(),S=b.z.record(b.z.string(),b.z.boolean()),x=b.z.lazy(()=>b.z.object({entity:b.z.string(),data:y.optional(),nested:b.z.array(x).optional(),context:v.optional()}).passthrough()),T=b.z.object({source:b.z.string(),tagging:b.z.number()}),w=b.z.object({type:b.z.string(),id:b.z.string(),previous_id:b.z.string()}).passthrough(),P=b.z.object({name:b.z.string().min(1,"Event name is required"),data:y.optional(),context:v.optional(),globals:y.optional(),custom:y.optional(),user:O.optional(),nested:b.z.array(x).optional(),consent:S.optional(),id:b.z.string().optional(),trigger:b.z.string().optional(),entity:b.z.string().optional(),action:b.z.string().optional(),timestamp:b.z.number().optional(),timing:b.z.number().optional(),group:b.z.string().optional(),count:b.z.number().optional(),version:T.optional(),source:w.optional()}).passthrough(),f=(0,l.zodToSchema)(h),j={};n(j,{inputs:()=>q,requests:()=>D,step:()=>L});var q={};n(q,{batch:()=>H,completeEvent:()=>k,minimal:()=>C,pageView:()=>R,productAdd:()=>E});var R={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},E={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},k={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},C={name:"ping"},H=[R,E,{name:"button click",data:{id:"cta"}}],D={};n(D,{batchPostRequest:()=>N,healthCheckRequest:()=>M,invalidJsonRequest:()=>I,optionsRequest:()=>U,oversizedRequest:()=>J,pixelGetRequest:()=>A,validPostRequest:()=>G});var G={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},N={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},A={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},M={method:"GET",url:"https://example.com/health"},U={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},I={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},J={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},L={};n(L,{batchRequest:()=>B,pixelGet:()=>V,postEvent:()=>_});var _={in:{method:"POST",url:"https://example.com/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},B={in:{method:"POST",url:"https://example.com/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},V={in:{method:"GET",url:"https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,i=(e,o)=>{for(var a in o)t(e,a,{get:o[a],enumerable:!0})},r={};i(r,{examples:()=>j,schemas:()=>s}),module.exports=(e=r,((e,i,r,s)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let l of a(i))n.call(e,l)||l===r||t(e,l,{get:()=>i[l],enumerable:!(s=o(i,l))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};i(s,{CorsOptionsSchema:()=>m,CorsOrigin:()=>u,EventSchema:()=>x,HttpMethod:()=>d,RouteConfigSchema:()=>h,RouteMethod:()=>g,SettingsSchema:()=>z,settings:()=>P});var l=require("@walkeros/core/dev"),c=require("@walkeros/core/dev"),p=require("@walkeros/core/dev"),d=p.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),u=p.z.union([p.z.string(),p.z.array(p.z.string()),p.z.literal("*")]),m=p.z.object({origin:u.optional(),methods:p.z.array(d).optional(),headers:p.z.array(p.z.string()).optional(),credentials:p.z.boolean().optional(),maxAge:p.z.number().int().positive().optional()}),g=p.z.enum(["GET","POST"]),h=p.z.object({path:p.z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:p.z.array(g).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),z=c.z.object({path:c.z.string().describe("Deprecated: use paths instead").optional(),paths:c.z.array(c.z.union([c.z.string(),h])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:c.z.union([c.z.boolean(),m]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:c.z.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:c.z.number().int().positive().describe("Maximum events per batch request").default(100)}),b=require("@walkeros/core/dev"),y=b.z.record(b.z.string(),b.z.union([b.z.string(),b.z.number(),b.z.boolean(),b.z.record(b.z.string(),b.z.any())])),v=b.z.record(b.z.string(),b.z.tuple([b.z.union([b.z.string(),b.z.number(),b.z.boolean(),b.z.record(b.z.string(),b.z.any())]),b.z.number()])),w=b.z.object({id:b.z.string().optional(),device:b.z.string().optional(),session:b.z.string().optional(),email:b.z.string().optional(),hash:b.z.string().optional()}).passthrough(),O=b.z.record(b.z.string(),b.z.boolean()),f=b.z.lazy(()=>b.z.object({entity:b.z.string(),data:y.optional(),nested:b.z.array(f).optional(),context:v.optional()}).passthrough()),T=b.z.object({source:b.z.string(),tagging:b.z.number()}),S=b.z.object({type:b.z.string(),id:b.z.string(),previous_id:b.z.string()}).passthrough(),x=b.z.object({name:b.z.string().min(1,"Event name is required"),data:y.optional(),context:v.optional(),globals:y.optional(),custom:y.optional(),user:w.optional(),nested:b.z.array(f).optional(),consent:O.optional(),id:b.z.string().optional(),trigger:b.z.string().optional(),entity:b.z.string().optional(),action:b.z.string().optional(),timestamp:b.z.number().optional(),timing:b.z.number().optional(),group:b.z.string().optional(),count:b.z.number().optional(),version:T.optional(),source:S.optional()}).passthrough(),P=(0,l.zodToSchema)(z),j={};i(j,{createTrigger:()=>K,inputs:()=>q,requests:()=>D,step:()=>L});var q={};i(q,{batch:()=>H,completeEvent:()=>k,minimal:()=>C,pageView:()=>E,productAdd:()=>R});var E={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},R={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},k={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},C={name:"ping"},H=[E,R,{name:"button click",data:{id:"cta"}}],D={};i(D,{batchPostRequest:()=>N,healthCheckRequest:()=>J,invalidJsonRequest:()=>U,optionsRequest:()=>M,oversizedRequest:()=>I,pixelGetRequest:()=>A,validPostRequest:()=>G});var G={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},N={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},A={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},J={method:"GET",url:"https://example.com/health"},M={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},U={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},I={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},L={};i(L,{batchRequest:()=>B,pixelGet:()=>F,postEvent:()=>_});var _={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},B={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},F={trigger:{type:"GET"},in:{method:"GET",url:"http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},V=require("@walkeros/collector");var K=async e=>{let t;return{get flow(){return t},trigger:()=>async o=>{if(!t){const o=await(0,V.startFlow)(e);t={collector:o.collector,elb:o.elb}}const a=function(e){for(const t of Object.values(e.sources||{}))if("fetch"===t.type)return t}(t.collector);if(!a)throw new Error("Fetch source not found in collector");const n={method:o.method,headers:{"Content-Type":"application/json",...o.headers}};"GET"!==o.method&&void 0!==o.body&&(n.body=JSON.stringify(o.body));const i=new Request(o.url,n),r=await a.push(i),s={};r.headers.forEach((e,t)=>{s[t]=e});const l=(r.headers.get("content-type")||"").includes("json")?await r.json():await r.text();return{status:r.status,body:l,headers:s}}}};//# sourceMappingURL=dev.js.map
package/dist/dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n in: {\n method: 'GET',\n url: 'https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n"],"mappings":"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","names":["import_dev","import_dev","import_dev"]}
1
+ {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n trigger: { type: 'GET' },\n in: {\n method: 'GET',\n url: 'http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n method: string;\n url: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nexport interface Result {\n status: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\nfunction findFetchSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'fetch') return source;\n }\n}\n\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findFetchSource(flow.collector);\n if (!source) throw new Error('Fetch source not found in collector');\n\n // Construct real Request from content\n const init: RequestInit = {\n method: content.method,\n headers: { 'Content-Type': 'application/json', ...content.headers },\n };\n if (content.method !== 'GET' && content.body !== undefined) {\n init.body = JSON.stringify(content.body);\n }\n const request = new Request(content.url, init);\n\n // Call source.push with the real Request\n const response = await (\n source as unknown as { push: (r: Request) => Promise<Response> }\n ).push(request);\n\n // Convert Response to serializable result\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((v, k) => {\n responseHeaders[k] = v;\n });\n\n const ct = response.headers.get('content-type') || '';\n const body = ct.includes('json')\n ? await response.json()\n : await response.text();\n\n return { status: response.status, body, headers: responseHeaders };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\nexport { createTrigger };\n"],"mappings":"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","names":["import_dev","import_dev","import_dev"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,o)=>{for(var a in o)e(t,a,{get:o[a],enumerable:!0})},o={};t(o,{CorsOptionsSchema:()=>l,CorsOrigin:()=>s,EventSchema:()=>S,HttpMethod:()=>r,RouteConfigSchema:()=>c,RouteMethod:()=>p,SettingsSchema:()=>m,settings:()=>T});import{zodToSchema as a}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";var r=n.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),s=n.union([n.string(),n.array(n.string()),n.literal("*")]),l=n.object({origin:s.optional(),methods:n.array(r).optional(),headers:n.array(n.string()).optional(),credentials:n.boolean().optional(),maxAge:n.number().int().positive().optional()}),p=n.enum(["GET","POST"]),c=n.object({path:n.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:n.array(p).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),m=i.object({path:i.string().describe("Deprecated: use paths instead").optional(),paths:i.array(i.union([i.string(),c])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:i.union([i.boolean(),l]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:i.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:i.number().int().positive().describe("Maximum events per batch request").default(100)});import{z as d}from"@walkeros/core/dev";var u=d.record(d.string(),d.union([d.string(),d.number(),d.boolean(),d.record(d.string(),d.any())])),g=d.record(d.string(),d.tuple([d.union([d.string(),d.number(),d.boolean(),d.record(d.string(),d.any())]),d.number()])),h=d.object({id:d.string().optional(),device:d.string().optional(),session:d.string().optional(),email:d.string().optional(),hash:d.string().optional()}).passthrough(),b=d.record(d.string(),d.boolean()),v=d.lazy(()=>d.object({entity:d.string(),data:u.optional(),nested:d.array(v).optional(),context:g.optional()}).passthrough()),y=d.object({source:d.string(),tagging:d.number()}),x=d.object({type:d.string(),id:d.string(),previous_id:d.string()}).passthrough(),S=d.object({name:d.string().min(1,"Event name is required"),data:u.optional(),context:g.optional(),globals:u.optional(),custom:u.optional(),user:h.optional(),nested:d.array(v).optional(),consent:b.optional(),id:d.string().optional(),trigger:d.string().optional(),entity:d.string().optional(),action:d.string().optional(),timestamp:d.number().optional(),timing:d.number().optional(),group:d.string().optional(),count:d.number().optional(),version:y.optional(),source:x.optional()}).passthrough(),T=a(m),O={};t(O,{inputs:()=>w,requests:()=>q,step:()=>N});var w={};t(w,{batch:()=>j,completeEvent:()=>R,minimal:()=>E,pageView:()=>f,productAdd:()=>P});var f={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},P={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},R={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},E={name:"ping"},j=[f,P,{name:"button click",data:{id:"cta"}}],q={};t(q,{batchPostRequest:()=>C,healthCheckRequest:()=>D,invalidJsonRequest:()=>z,optionsRequest:()=>G,oversizedRequest:()=>A,pixelGetRequest:()=>H,validPostRequest:()=>k});var k={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},C={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},H={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},D={method:"GET",url:"https://example.com/health"},G={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},z={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},A={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},N={};t(N,{batchRequest:()=>I,pixelGet:()=>J,postEvent:()=>U});var U={in:{method:"POST",url:"https://example.com/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},I={in:{method:"POST",url:"https://example.com/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},J={in:{method:"GET",url:"https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};export{O as examples,o as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,o)=>{for(var a in o)e(t,a,{get:o[a],enumerable:!0})},o={};t(o,{CorsOptionsSchema:()=>l,CorsOrigin:()=>s,EventSchema:()=>T,HttpMethod:()=>r,RouteConfigSchema:()=>p,RouteMethod:()=>c,SettingsSchema:()=>d,settings:()=>w});import{zodToSchema as a}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";var r=i.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),s=i.union([i.string(),i.array(i.string()),i.literal("*")]),l=i.object({origin:s.optional(),methods:i.array(r).optional(),headers:i.array(i.string()).optional(),credentials:i.boolean().optional(),maxAge:i.number().int().positive().optional()}),c=i.enum(["GET","POST"]),p=i.object({path:i.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:i.array(c).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),d=n.object({path:n.string().describe("Deprecated: use paths instead").optional(),paths:n.array(n.union([n.string(),p])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:n.union([n.boolean(),l]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:n.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:n.number().int().positive().describe("Maximum events per batch request").default(100)});import{z as m}from"@walkeros/core/dev";var u=m.record(m.string(),m.union([m.string(),m.number(),m.boolean(),m.record(m.string(),m.any())])),g=m.record(m.string(),m.tuple([m.union([m.string(),m.number(),m.boolean(),m.record(m.string(),m.any())]),m.number()])),h=m.object({id:m.string().optional(),device:m.string().optional(),session:m.string().optional(),email:m.string().optional(),hash:m.string().optional()}).passthrough(),b=m.record(m.string(),m.boolean()),y=m.lazy(()=>m.object({entity:m.string(),data:u.optional(),nested:m.array(y).optional(),context:g.optional()}).passthrough()),v=m.object({source:m.string(),tagging:m.number()}),f=m.object({type:m.string(),id:m.string(),previous_id:m.string()}).passthrough(),T=m.object({name:m.string().min(1,"Event name is required"),data:u.optional(),context:g.optional(),globals:u.optional(),custom:u.optional(),user:h.optional(),nested:m.array(y).optional(),consent:b.optional(),id:m.string().optional(),trigger:m.string().optional(),entity:m.string().optional(),action:m.string().optional(),timestamp:m.number().optional(),timing:m.number().optional(),group:m.string().optional(),count:m.number().optional(),version:v.optional(),source:f.optional()}).passthrough(),w=a(d),S={};t(S,{createTrigger:()=>L,inputs:()=>O,requests:()=>q,step:()=>A});var O={};t(O,{batch:()=>R,completeEvent:()=>E,minimal:()=>j,pageView:()=>x,productAdd:()=>P});var x={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},P={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},E={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},j={name:"ping"},R=[x,P,{name:"button click",data:{id:"cta"}}],q={};t(q,{batchPostRequest:()=>C,healthCheckRequest:()=>G,invalidJsonRequest:()=>z,optionsRequest:()=>D,oversizedRequest:()=>N,pixelGetRequest:()=>H,validPostRequest:()=>k});var k={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},C={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},H={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},G={method:"GET",url:"https://example.com/health"},D={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},z={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},N={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},A={};t(A,{batchRequest:()=>U,pixelGet:()=>I,postEvent:()=>J});var J={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},U={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},I={trigger:{type:"GET"},in:{method:"GET",url:"http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{startFlow as M}from"@walkeros/collector";var L=async e=>{let t;return{get flow(){return t},trigger:()=>async o=>{if(!t){const o=await M(e);t={collector:o.collector,elb:o.elb}}const a=function(e){for(const t of Object.values(e.sources||{}))if("fetch"===t.type)return t}(t.collector);if(!a)throw new Error("Fetch source not found in collector");const n={method:o.method,headers:{"Content-Type":"application/json",...o.headers}};"GET"!==o.method&&void 0!==o.body&&(n.body=JSON.stringify(o.body));const i=new Request(o.url,n),r=await a.push(i),s={};r.headers.forEach((e,t)=>{s[t]=e});const l=(r.headers.get("content-type")||"").includes("json")?await r.json():await r.text();return{status:r.status,body:l,headers:s}}}};export{S as examples,o as schemas};//# sourceMappingURL=dev.mjs.map
package/dist/dev.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n in: {\n method: 'GET',\n url: 'https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n"],"mappings":"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","names":["z","z","z"]}
1
+ {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n trigger: { type: 'GET' },\n in: {\n method: 'GET',\n url: 'http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n method: string;\n url: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nexport interface Result {\n status: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\nfunction findFetchSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'fetch') return source;\n }\n}\n\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findFetchSource(flow.collector);\n if (!source) throw new Error('Fetch source not found in collector');\n\n // Construct real Request from content\n const init: RequestInit = {\n method: content.method,\n headers: { 'Content-Type': 'application/json', ...content.headers },\n };\n if (content.method !== 'GET' && content.body !== undefined) {\n init.body = JSON.stringify(content.body);\n }\n const request = new Request(content.url, init);\n\n // Call source.push with the real Request\n const response = await (\n source as unknown as { push: (r: Request) => Promise<Response> }\n ).push(request);\n\n // Convert Response to serializable result\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((v, k) => {\n responseHeaders[k] = v;\n });\n\n const ct = response.headers.get('content-type') || '';\n const body = ct.includes('json')\n ? await response.json()\n : await response.text();\n\n return { status: response.status, body, headers: responseHeaders };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\nexport { createTrigger };\n"],"mappings":"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","names":["z","z","z"]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, WalkerOS, Flow } from '@walkeros/core';
1
+ import { Source, WalkerOS, Flow, Trigger } from '@walkeros/core';
2
2
  import * as _walkeros_core_dev from '@walkeros/core/dev';
3
3
  import { z } from '@walkeros/core/dev';
4
4
 
@@ -272,11 +272,25 @@ declare namespace step {
272
272
  export { step_batchRequest as batchRequest, step_pixelGet as pixelGet, step_postEvent as postEvent };
273
273
  }
274
274
 
275
+ interface Content {
276
+ method: string;
277
+ url: string;
278
+ body?: unknown;
279
+ headers?: Record<string, string>;
280
+ }
281
+ interface Result {
282
+ status: number;
283
+ body: unknown;
284
+ headers: Record<string, string>;
285
+ }
286
+ declare const createTrigger: Trigger.CreateFn<Content, Result>;
287
+
288
+ declare const index_createTrigger: typeof createTrigger;
275
289
  declare const index_inputs: typeof inputs;
276
290
  declare const index_requests: typeof requests;
277
291
  declare const index_step: typeof step;
278
292
  declare namespace index {
279
- export { index_inputs as inputs, index_requests as requests, index_step as step };
293
+ export { index_createTrigger as createTrigger, index_inputs as inputs, index_requests as requests, index_step as step };
280
294
  }
281
295
 
282
296
  declare const sourceFetch: Source.Init<Types>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, WalkerOS, Flow } from '@walkeros/core';
1
+ import { Source, WalkerOS, Flow, Trigger } from '@walkeros/core';
2
2
  import * as _walkeros_core_dev from '@walkeros/core/dev';
3
3
  import { z } from '@walkeros/core/dev';
4
4
 
@@ -272,11 +272,25 @@ declare namespace step {
272
272
  export { step_batchRequest as batchRequest, step_pixelGet as pixelGet, step_postEvent as postEvent };
273
273
  }
274
274
 
275
+ interface Content {
276
+ method: string;
277
+ url: string;
278
+ body?: unknown;
279
+ headers?: Record<string, string>;
280
+ }
281
+ interface Result {
282
+ status: number;
283
+ body: unknown;
284
+ headers: Record<string, string>;
285
+ }
286
+ declare const createTrigger: Trigger.CreateFn<Content, Result>;
287
+
288
+ declare const index_createTrigger: typeof createTrigger;
275
289
  declare const index_inputs: typeof inputs;
276
290
  declare const index_requests: typeof requests;
277
291
  declare const index_step: typeof step;
278
292
  declare namespace index {
279
- export { index_inputs as inputs, index_requests as requests, index_step as step };
293
+ export { index_createTrigger as createTrigger, index_inputs as inputs, index_requests as requests, index_step as step };
280
294
  }
281
295
 
282
296
  declare const sourceFetch: Source.Init<Types>;
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,{SourceFetch:()=>types_exports,TRANSPARENT_GIF_BASE64:()=>TRANSPARENT_GIF_BASE64,createCorsHeaders:()=>createCorsHeaders,createJsonResponse:()=>createJsonResponse,createPixelResponse:()=>createPixelResponse,default:()=>index_default,examples:()=>examples_exports,matchPath:()=>matchPath,schemas:()=>schemas_exports,sourceFetch:()=>sourceFetch}),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"),schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,EventSchema:()=>EventSchema,HttpMethod:()=>HttpMethod,RouteConfigSchema:()=>RouteConfigSchema,RouteMethod:()=>RouteMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});var import_dev4=require("@walkeros/core/dev"),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.optional(),methods:import_dev.z.array(HttpMethod).optional(),headers:import_dev.z.array(import_dev.z.string()).optional(),credentials:import_dev.z.boolean().optional(),maxAge:import_dev.z.number().int().positive().optional()}),RouteMethod=import_dev.z.enum(["GET","POST"]),RouteConfigSchema=import_dev.z.object({path:import_dev.z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:import_dev.z.array(RouteMethod).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),SettingsSchema=import_dev2.z.object({path:import_dev2.z.string().describe("Deprecated: use paths instead").optional(),paths:import_dev2.z.array(import_dev2.z.union([import_dev2.z.string(),RouteConfigSchema])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:import_dev2.z.union([import_dev2.z.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:import_dev2.z.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:import_dev2.z.number().int().positive().describe("Maximum events per batch request").default(100)}),import_dev3=require("@walkeros/core/dev"),PropertiesSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.union([import_dev3.z.string(),import_dev3.z.number(),import_dev3.z.boolean(),import_dev3.z.record(import_dev3.z.string(),import_dev3.z.any())])),OrderedPropertiesSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.tuple([import_dev3.z.union([import_dev3.z.string(),import_dev3.z.number(),import_dev3.z.boolean(),import_dev3.z.record(import_dev3.z.string(),import_dev3.z.any())]),import_dev3.z.number()])),UserSchema=import_dev3.z.object({id:import_dev3.z.string().optional(),device:import_dev3.z.string().optional(),session:import_dev3.z.string().optional(),email:import_dev3.z.string().optional(),hash:import_dev3.z.string().optional()}).passthrough(),ConsentSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.boolean()),EntitySchema=import_dev3.z.lazy(()=>import_dev3.z.object({entity:import_dev3.z.string(),data:PropertiesSchema.optional(),nested:import_dev3.z.array(EntitySchema).optional(),context:OrderedPropertiesSchema.optional()}).passthrough()),VersionSchema=import_dev3.z.object({source:import_dev3.z.string(),tagging:import_dev3.z.number()}),SourceSchema=import_dev3.z.object({type:import_dev3.z.string(),id:import_dev3.z.string(),previous_id:import_dev3.z.string()}).passthrough(),EventSchema=import_dev3.z.object({name:import_dev3.z.string().min(1,"Event name is required"),data:PropertiesSchema.optional(),context:OrderedPropertiesSchema.optional(),globals:PropertiesSchema.optional(),custom:PropertiesSchema.optional(),user:UserSchema.optional(),nested:import_dev3.z.array(EntitySchema).optional(),consent:ConsentSchema.optional(),id:import_dev3.z.string().optional(),trigger:import_dev3.z.string().optional(),entity:import_dev3.z.string().optional(),action:import_dev3.z.string().optional(),timestamp:import_dev3.z.number().optional(),timing:import_dev3.z.number().optional(),group:import_dev3.z.string().optional(),count:import_dev3.z.number().optional(),version:VersionSchema.optional(),source:SourceSchema.optional()}).passthrough(),settings=(0,import_dev4.zodToSchema)(SettingsSchema);function createCorsHeaders(corsConfig=!0,requestOrigin){const headers=new Headers;if(!1===corsConfig)return headers;if(!0===corsConfig)headers.set("Access-Control-Allow-Origin","*"),headers.set("Access-Control-Allow-Methods","GET, POST, OPTIONS"),headers.set("Access-Control-Allow-Headers","Content-Type");else{if(corsConfig.origin){let origin;origin=Array.isArray(corsConfig.origin)?requestOrigin&&corsConfig.origin.includes(requestOrigin)?requestOrigin:corsConfig.origin[0]:corsConfig.origin,headers.set("Access-Control-Allow-Origin",origin)}corsConfig.methods&&headers.set("Access-Control-Allow-Methods",corsConfig.methods.join(", ")),corsConfig.headers&&headers.set("Access-Control-Allow-Headers",corsConfig.headers.join(", ")),corsConfig.credentials&&headers.set("Access-Control-Allow-Credentials","true"),corsConfig.maxAge&&headers.set("Access-Control-Max-Age",String(corsConfig.maxAge))}return headers}var TRANSPARENT_GIF_BASE64="R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";function createPixelResponse(corsHeaders){const binaryString=atob(TRANSPARENT_GIF_BASE64),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);const headers=new Headers(corsHeaders);return headers.set("Content-Type","image/gif"),headers.set("Cache-Control","no-cache, no-store, must-revalidate"),new Response(bytes,{status:200,headers:headers})}function createJsonResponse(body,status=200,corsHeaders){const headers=new Headers(corsHeaders);return headers.set("Content-Type","application/json"),new Response(JSON.stringify(body),{status:status,headers:headers})}function matchPath(requestPath,pattern){if(pattern.endsWith("/*")){const prefix=pattern.slice(0,-2);return requestPath===prefix||requestPath.startsWith(prefix+"/")}return requestPath===pattern}var types_exports={},examples_exports={};__export(examples_exports,{inputs:()=>inputs_exports,requests:()=>requests_exports,step:()=>step_exports});var inputs_exports={};__export(inputs_exports,{batch:()=>batch,completeEvent:()=>completeEvent,minimal:()=>minimal,pageView:()=>pageView,productAdd:()=>productAdd});var pageView={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},productAdd={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},completeEvent={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},minimal={name:"ping"},batch=[pageView,productAdd,{name:"button click",data:{id:"cta"}}],requests_exports={};__export(requests_exports,{batchPostRequest:()=>batchPostRequest,healthCheckRequest:()=>healthCheckRequest,invalidJsonRequest:()=>invalidJsonRequest,optionsRequest:()=>optionsRequest,oversizedRequest:()=>oversizedRequest,pixelGetRequest:()=>pixelGetRequest,validPostRequest:()=>validPostRequest});var validPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},batchPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},pixelGetRequest={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},healthCheckRequest={method:"GET",url:"https://example.com/health"},optionsRequest={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},invalidJsonRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},oversizedRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},step_exports={};__export(step_exports,{batchRequest:()=>batchRequest,pixelGet:()=>pixelGet,postEvent:()=>postEvent});var postEvent={in:{method:"POST",url:"https://example.com/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},batchRequest={in:{method:"POST",url:"https://example.com/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},pixelGet={in:{method:"GET",url:"https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},sourceFetch=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,parsed=SettingsSchema.parse(config.settings||{}),settings2={...parsed,paths:parsed.paths??(parsed.path?[parsed.path]:["/collect"])},{logger:logger}=env;return{type:"fetch",config:{...config,settings:settings2},push:async request=>{Date.now();try{const url=new URL(request.url),method=request.method.toUpperCase(),origin=request.headers.get("Origin"),corsHeaders=createCorsHeaders(settings2.cors,origin),matchedRoute=settings2.paths.map(entry=>"string"==typeof entry?{path:entry,methods:["GET","POST"]}:{path:entry.path,methods:entry.methods||["GET","POST"]}).find(route=>matchPath(url.pathname,route.path));if(!matchedRoute)return createJsonResponse({success:!1,error:"Not found"},404,corsHeaders);if("OPTIONS"===method)return new Response(null,{status:204,headers:corsHeaders});if(!matchedRoute.methods.includes(method))return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders);if(await setIngest(request),"GET"===method){const parsedData=(0,import_core.requestToData)(url.search);return parsedData&&(0,import_core.isObject)(parsedData)&&await env.push(parsedData),createPixelResponse(corsHeaders)}if("POST"===method){const contentLength=request.headers.get("Content-Length");if(contentLength){const size=parseInt(contentLength,10);if(size>settings2.maxRequestSize)return logger.error("Request too large",{size:size,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders)}let eventData,bodyText;try{if(bodyText=await request.text(),bodyText.length>settings2.maxRequestSize)return logger.error("Request body too large",{size:bodyText.length,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders);eventData=JSON.parse(bodyText)}catch(error){return logger.error("Failed to parse JSON",error),createJsonResponse({success:!1,error:"Invalid JSON body"},400,corsHeaders)}if(!(0,import_core.isDefined)(eventData)||!(0,import_core.isObject)(eventData))return logger.error("Invalid event body type"),createJsonResponse({success:!1,error:"Invalid event: body must be an object"},400,corsHeaders);if("batch"in eventData&&Array.isArray(eventData.batch)){const batch2=eventData.batch;if(batch2.length>settings2.maxBatchSize)return logger.error("Batch too large",{size:batch2.length,limit:settings2.maxBatchSize}),createJsonResponse({success:!1,error:`Batch too large. Maximum size: ${settings2.maxBatchSize} events`},400,corsHeaders);const results=await async function(events,push,logger){const results={successful:0,failed:0,ids:[],errors:[]};for(let i=0;i<events.length;i++){const event=events[i],validation=EventSchema.safeParse(event);if(validation.success)try{const result=await push(validation.data);result?.event?.id&&results.ids.push(result.event.id),results.successful++}catch(error){results.failed++,results.errors.push({index:i,error:error instanceof Error?error.message:"Unknown error"}),logger.error(`Batch event ${i} processing failed`,error)}else results.failed++,results.errors.push({index:i,error:`Validation failed: ${validation.error.issues[0].message}`}),logger.error(`Batch event ${i} validation failed`,{errors:validation.error.issues})}return results}(batch2,env.push,logger);return results.failed>0?createJsonResponse({success:!1,processed:results.successful,failed:results.failed,errors:results.errors},207,corsHeaders):createJsonResponse({success:!0,processed:results.successful,ids:results.ids},200,corsHeaders)}const validation=EventSchema.safeParse(eventData);if(!validation.success){const errors=validation.error.issues.map(issue=>({path:issue.path.join("."),message:issue.message}));return logger.error("Event validation failed",{errors:errors}),createJsonResponse({success:!1,error:"Event validation failed",validationErrors:errors},400,corsHeaders)}const result=await async function(event,push){try{const result=await push(event);return{id:result?.event?.id}}catch(error){return{error:error instanceof Error?error.message:"Unknown error"}}}(validation.data,env.push);return result.error?(logger.error("Event processing failed",{error:result.error}),createJsonResponse({success:!1,error:result.error},400,corsHeaders)):createJsonResponse({success:!0,id:result.id,timestamp:Date.now()},200,corsHeaders)}return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders)}catch(error){logger.error("Internal server error",error);const corsHeaders=createCorsHeaders(settings2.cors);return createJsonResponse({success:!1,error:error instanceof Error?error.message:"Internal server error"},500,corsHeaders)}}}};var index_default=sourceFetch;//# 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,{SourceFetch:()=>types_exports,TRANSPARENT_GIF_BASE64:()=>TRANSPARENT_GIF_BASE64,createCorsHeaders:()=>createCorsHeaders,createJsonResponse:()=>createJsonResponse,createPixelResponse:()=>createPixelResponse,default:()=>index_default,examples:()=>examples_exports,matchPath:()=>matchPath,schemas:()=>schemas_exports,sourceFetch:()=>sourceFetch}),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"),schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,EventSchema:()=>EventSchema,HttpMethod:()=>HttpMethod,RouteConfigSchema:()=>RouteConfigSchema,RouteMethod:()=>RouteMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});var import_dev4=require("@walkeros/core/dev"),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.optional(),methods:import_dev.z.array(HttpMethod).optional(),headers:import_dev.z.array(import_dev.z.string()).optional(),credentials:import_dev.z.boolean().optional(),maxAge:import_dev.z.number().int().positive().optional()}),RouteMethod=import_dev.z.enum(["GET","POST"]),RouteConfigSchema=import_dev.z.object({path:import_dev.z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:import_dev.z.array(RouteMethod).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),SettingsSchema=import_dev2.z.object({path:import_dev2.z.string().describe("Deprecated: use paths instead").optional(),paths:import_dev2.z.array(import_dev2.z.union([import_dev2.z.string(),RouteConfigSchema])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:import_dev2.z.union([import_dev2.z.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:import_dev2.z.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:import_dev2.z.number().int().positive().describe("Maximum events per batch request").default(100)}),import_dev3=require("@walkeros/core/dev"),PropertiesSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.union([import_dev3.z.string(),import_dev3.z.number(),import_dev3.z.boolean(),import_dev3.z.record(import_dev3.z.string(),import_dev3.z.any())])),OrderedPropertiesSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.tuple([import_dev3.z.union([import_dev3.z.string(),import_dev3.z.number(),import_dev3.z.boolean(),import_dev3.z.record(import_dev3.z.string(),import_dev3.z.any())]),import_dev3.z.number()])),UserSchema=import_dev3.z.object({id:import_dev3.z.string().optional(),device:import_dev3.z.string().optional(),session:import_dev3.z.string().optional(),email:import_dev3.z.string().optional(),hash:import_dev3.z.string().optional()}).passthrough(),ConsentSchema=import_dev3.z.record(import_dev3.z.string(),import_dev3.z.boolean()),EntitySchema=import_dev3.z.lazy(()=>import_dev3.z.object({entity:import_dev3.z.string(),data:PropertiesSchema.optional(),nested:import_dev3.z.array(EntitySchema).optional(),context:OrderedPropertiesSchema.optional()}).passthrough()),VersionSchema=import_dev3.z.object({source:import_dev3.z.string(),tagging:import_dev3.z.number()}),SourceSchema=import_dev3.z.object({type:import_dev3.z.string(),id:import_dev3.z.string(),previous_id:import_dev3.z.string()}).passthrough(),EventSchema=import_dev3.z.object({name:import_dev3.z.string().min(1,"Event name is required"),data:PropertiesSchema.optional(),context:OrderedPropertiesSchema.optional(),globals:PropertiesSchema.optional(),custom:PropertiesSchema.optional(),user:UserSchema.optional(),nested:import_dev3.z.array(EntitySchema).optional(),consent:ConsentSchema.optional(),id:import_dev3.z.string().optional(),trigger:import_dev3.z.string().optional(),entity:import_dev3.z.string().optional(),action:import_dev3.z.string().optional(),timestamp:import_dev3.z.number().optional(),timing:import_dev3.z.number().optional(),group:import_dev3.z.string().optional(),count:import_dev3.z.number().optional(),version:VersionSchema.optional(),source:SourceSchema.optional()}).passthrough(),settings=(0,import_dev4.zodToSchema)(SettingsSchema);function createCorsHeaders(corsConfig=!0,requestOrigin){const headers=new Headers;if(!1===corsConfig)return headers;if(!0===corsConfig)headers.set("Access-Control-Allow-Origin","*"),headers.set("Access-Control-Allow-Methods","GET, POST, OPTIONS"),headers.set("Access-Control-Allow-Headers","Content-Type");else{if(corsConfig.origin){let origin;origin=Array.isArray(corsConfig.origin)?requestOrigin&&corsConfig.origin.includes(requestOrigin)?requestOrigin:corsConfig.origin[0]:corsConfig.origin,headers.set("Access-Control-Allow-Origin",origin)}corsConfig.methods&&headers.set("Access-Control-Allow-Methods",corsConfig.methods.join(", ")),corsConfig.headers&&headers.set("Access-Control-Allow-Headers",corsConfig.headers.join(", ")),corsConfig.credentials&&headers.set("Access-Control-Allow-Credentials","true"),corsConfig.maxAge&&headers.set("Access-Control-Max-Age",String(corsConfig.maxAge))}return headers}var TRANSPARENT_GIF_BASE64="R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";function createPixelResponse(corsHeaders){const binaryString=atob(TRANSPARENT_GIF_BASE64),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);const headers=new Headers(corsHeaders);return headers.set("Content-Type","image/gif"),headers.set("Cache-Control","no-cache, no-store, must-revalidate"),new Response(bytes,{status:200,headers:headers})}function createJsonResponse(body,status=200,corsHeaders){const headers=new Headers(corsHeaders);return headers.set("Content-Type","application/json"),new Response(JSON.stringify(body),{status:status,headers:headers})}function matchPath(requestPath,pattern){if(pattern.endsWith("/*")){const prefix=pattern.slice(0,-2);return requestPath===prefix||requestPath.startsWith(prefix+"/")}return requestPath===pattern}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,inputs:()=>inputs_exports,requests:()=>requests_exports,step:()=>step_exports});var inputs_exports={};__export(inputs_exports,{batch:()=>batch,completeEvent:()=>completeEvent,minimal:()=>minimal,pageView:()=>pageView,productAdd:()=>productAdd});var pageView={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},productAdd={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},completeEvent={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},minimal={name:"ping"},batch=[pageView,productAdd,{name:"button click",data:{id:"cta"}}],requests_exports={};__export(requests_exports,{batchPostRequest:()=>batchPostRequest,healthCheckRequest:()=>healthCheckRequest,invalidJsonRequest:()=>invalidJsonRequest,optionsRequest:()=>optionsRequest,oversizedRequest:()=>oversizedRequest,pixelGetRequest:()=>pixelGetRequest,validPostRequest:()=>validPostRequest});var validPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},batchPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},pixelGetRequest={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},healthCheckRequest={method:"GET",url:"https://example.com/health"},optionsRequest={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},invalidJsonRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},oversizedRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},step_exports={};__export(step_exports,{batchRequest:()=>batchRequest,pixelGet:()=>pixelGet,postEvent:()=>postEvent});var postEvent={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},batchRequest={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},pixelGet={trigger:{type:"GET"},in:{method:"GET",url:"http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},import_collector=require("@walkeros/collector");var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await(0,import_collector.startFlow)(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("fetch"===source.type)return source}(flow.collector);if(!source)throw new Error("Fetch source not found in collector");const init={method:content.method,headers:{"Content-Type":"application/json",...content.headers}};"GET"!==content.method&&void 0!==content.body&&(init.body=JSON.stringify(content.body));const request=new Request(content.url,init),response=await source.push(request),responseHeaders={};response.headers.forEach((v,k)=>{responseHeaders[k]=v});const body=(response.headers.get("content-type")||"").includes("json")?await response.json():await response.text();return{status:response.status,body:body,headers:responseHeaders}}}},sourceFetch=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,parsed=SettingsSchema.parse(config.settings||{}),settings2={...parsed,paths:parsed.paths??(parsed.path?[parsed.path]:["/collect"])},{logger:logger}=env;return{type:"fetch",config:{...config,settings:settings2},push:async request=>{Date.now();try{const url=new URL(request.url),method=request.method.toUpperCase(),origin=request.headers.get("Origin"),corsHeaders=createCorsHeaders(settings2.cors,origin),matchedRoute=settings2.paths.map(entry=>"string"==typeof entry?{path:entry,methods:["GET","POST"]}:{path:entry.path,methods:entry.methods||["GET","POST"]}).find(route=>matchPath(url.pathname,route.path));if(!matchedRoute)return createJsonResponse({success:!1,error:"Not found"},404,corsHeaders);if("OPTIONS"===method)return new Response(null,{status:204,headers:corsHeaders});if(!matchedRoute.methods.includes(method))return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders);if(await setIngest(request),"GET"===method){const parsedData=(0,import_core.requestToData)(url.search);return parsedData&&(0,import_core.isObject)(parsedData)&&await env.push(parsedData),createPixelResponse(corsHeaders)}if("POST"===method){const contentLength=request.headers.get("Content-Length");if(contentLength){const size=parseInt(contentLength,10);if(size>settings2.maxRequestSize)return logger.error("Request too large",{size:size,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders)}let eventData,bodyText;try{if(bodyText=await request.text(),bodyText.length>settings2.maxRequestSize)return logger.error("Request body too large",{size:bodyText.length,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders);eventData=JSON.parse(bodyText)}catch(error){return logger.error("Failed to parse JSON",error),createJsonResponse({success:!1,error:"Invalid JSON body"},400,corsHeaders)}if(!(0,import_core.isDefined)(eventData)||!(0,import_core.isObject)(eventData))return logger.error("Invalid event body type"),createJsonResponse({success:!1,error:"Invalid event: body must be an object"},400,corsHeaders);if("batch"in eventData&&Array.isArray(eventData.batch)){const batch2=eventData.batch;if(batch2.length>settings2.maxBatchSize)return logger.error("Batch too large",{size:batch2.length,limit:settings2.maxBatchSize}),createJsonResponse({success:!1,error:`Batch too large. Maximum size: ${settings2.maxBatchSize} events`},400,corsHeaders);const results=await async function(events,push,logger){const results={successful:0,failed:0,ids:[],errors:[]};for(let i=0;i<events.length;i++){const event=events[i],validation=EventSchema.safeParse(event);if(validation.success)try{const result=await push(validation.data);result?.event?.id&&results.ids.push(result.event.id),results.successful++}catch(error){results.failed++,results.errors.push({index:i,error:error instanceof Error?error.message:"Unknown error"}),logger.error(`Batch event ${i} processing failed`,error)}else results.failed++,results.errors.push({index:i,error:`Validation failed: ${validation.error.issues[0].message}`}),logger.error(`Batch event ${i} validation failed`,{errors:validation.error.issues})}return results}(batch2,env.push,logger);return results.failed>0?createJsonResponse({success:!1,processed:results.successful,failed:results.failed,errors:results.errors},207,corsHeaders):createJsonResponse({success:!0,processed:results.successful,ids:results.ids},200,corsHeaders)}const validation=EventSchema.safeParse(eventData);if(!validation.success){const errors=validation.error.issues.map(issue=>({path:issue.path.join("."),message:issue.message}));return logger.error("Event validation failed",{errors:errors}),createJsonResponse({success:!1,error:"Event validation failed",validationErrors:errors},400,corsHeaders)}const result=await async function(event,push){try{const result=await push(event);return{id:result?.event?.id}}catch(error){return{error:error instanceof Error?error.message:"Unknown error"}}}(validation.data,env.push);return result.error?(logger.error("Event processing failed",{error:result.error}),createJsonResponse({success:!1,error:result.error},400,corsHeaders)):createJsonResponse({success:!0,id:result.id,timestamp:Date.now()},200,corsHeaders)}return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders)}catch(error){logger.error("Internal server error",error);const corsHeaders=createCorsHeaders(settings2.cors);return createJsonResponse({success:!1,error:error instanceof Error?error.message:"Internal server error"},500,corsHeaders)}}}};var index_default=sourceFetch;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/utils.ts","../src/types.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts"],"sourcesContent":["import { requestToData, isObject, isDefined } from '@walkeros/core';\nimport type { WalkerOS, Collector, Source } from '@walkeros/core';\nimport type { FetchSource, Types } from './types';\nimport { SettingsSchema, EventSchema } from './schemas';\nimport {\n createCorsHeaders,\n createPixelResponse,\n createJsonResponse,\n matchPath,\n} from './utils';\n\nexport const sourceFetch: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const parsed = SettingsSchema.parse(config.settings || {});\n const settings = {\n ...parsed,\n paths: parsed.paths ?? (parsed.path ? [parsed.path] : ['/collect']),\n };\n const { logger } = env;\n\n const push = async (request: Request): Promise<Response> => {\n const startTime = Date.now();\n\n try {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const origin = request.headers.get('Origin');\n const corsHeaders = createCorsHeaders(settings.cors, origin);\n\n // Resolve route configs\n const resolvedPaths = settings.paths.map((entry) =>\n typeof entry === 'string'\n ? { path: entry, methods: ['GET', 'POST'] as const }\n : {\n path: entry.path,\n methods: entry.methods || (['GET', 'POST'] as const),\n },\n );\n\n // Match request path against configured routes\n const matchedRoute = resolvedPaths.find((route) =>\n matchPath(url.pathname, route.path),\n );\n\n if (!matchedRoute) {\n return createJsonResponse(\n { success: false, error: 'Not found' },\n 404,\n corsHeaders,\n );\n }\n\n // OPTIONS (CORS preflight - no logging, routine)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n // Check method is allowed for this route\n if (!matchedRoute.methods.includes(method as 'GET' | 'POST')) {\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n }\n\n // Extract ingest metadata from request (if config.ingest is defined)\n await setIngest(request);\n\n // GET (pixel tracking - no logging, routine)\n if (method === 'GET') {\n const parsedData = requestToData(url.search);\n if (parsedData && isObject(parsedData)) {\n await env.push(parsedData);\n }\n return createPixelResponse(corsHeaders);\n }\n\n // POST\n if (method === 'POST') {\n // Check request size\n const contentLength = request.headers.get('Content-Length');\n if (contentLength) {\n const size = parseInt(contentLength, 10);\n if (size > settings.maxRequestSize) {\n logger.error('Request too large', {\n size,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n }\n\n let eventData: unknown;\n let bodyText: string;\n\n try {\n bodyText = await request.text();\n\n // Check actual body size\n if (bodyText.length > settings.maxRequestSize) {\n logger.error('Request body too large', {\n size: bodyText.length,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n\n eventData = JSON.parse(bodyText);\n } catch (error) {\n logger.error('Failed to parse JSON', error);\n return createJsonResponse(\n { success: false, error: 'Invalid JSON body' },\n 400,\n corsHeaders,\n );\n }\n\n if (!isDefined(eventData) || !isObject(eventData)) {\n logger.error('Invalid event body type');\n return createJsonResponse(\n { success: false, error: 'Invalid event: body must be an object' },\n 400,\n corsHeaders,\n );\n }\n\n // Check for batch\n const isBatch = 'batch' in eventData && Array.isArray(eventData.batch);\n\n if (isBatch) {\n const batch = eventData.batch as unknown[];\n\n if (batch.length > settings.maxBatchSize) {\n logger.error('Batch too large', {\n size: batch.length,\n limit: settings.maxBatchSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Batch too large. Maximum size: ${settings.maxBatchSize} events`,\n },\n 400,\n corsHeaders,\n );\n }\n\n const results = await processBatch(batch, env.push, logger);\n\n if (results.failed > 0) {\n return createJsonResponse(\n {\n success: false,\n processed: results.successful,\n failed: results.failed,\n errors: results.errors,\n },\n 207,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n {\n success: true,\n processed: results.successful,\n ids: results.ids,\n },\n 200,\n corsHeaders,\n );\n }\n\n // Single event - validate\n const validation = EventSchema.safeParse(eventData);\n if (!validation.success) {\n const errors = validation.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n logger.error('Event validation failed', { errors });\n\n return createJsonResponse(\n {\n success: false,\n error: 'Event validation failed',\n validationErrors: errors,\n },\n 400,\n corsHeaders,\n );\n }\n\n const result = await processEvent(\n validation.data as WalkerOS.DeepPartialEvent,\n env.push,\n );\n if (result.error) {\n logger.error('Event processing failed', { error: result.error });\n return createJsonResponse(\n { success: false, error: result.error },\n 400,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: true, id: result.id, timestamp: Date.now() },\n 200,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n } catch (error) {\n logger.error('Internal server error', error);\n const corsHeaders = createCorsHeaders(settings.cors);\n return createJsonResponse(\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n },\n 500,\n corsHeaders,\n );\n }\n };\n\n return { type: 'fetch', config: { ...config, settings }, push };\n};\n\nasync function processEvent(\n event: WalkerOS.DeepPartialEvent,\n push: Collector.PushFn,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push(event);\n return { id: result?.event?.id };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n\nasync function processBatch(\n events: unknown[],\n push: Collector.PushFn,\n logger: Types['env']['logger'],\n): Promise<{\n successful: number;\n failed: number;\n ids: string[];\n errors: Array<{ index: number; error: string }>;\n}> {\n const results = {\n successful: 0,\n failed: 0,\n ids: [] as string[],\n errors: [] as Array<{ index: number; error: string }>,\n };\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i];\n\n const validation = EventSchema.safeParse(event);\n if (!validation.success) {\n results.failed++;\n results.errors.push({\n index: i,\n error: `Validation failed: ${validation.error.issues[0].message}`,\n });\n logger.error(`Batch event ${i} validation failed`, {\n errors: validation.error.issues,\n });\n continue;\n }\n\n try {\n const result = await push(validation.data as WalkerOS.DeepPartialEvent);\n if (result?.event?.id) {\n results.ids.push(result.event.id);\n }\n results.successful++;\n } catch (error) {\n results.failed++;\n results.errors.push({\n index: i,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.error(`Batch event ${i} processing failed`, error);\n }\n }\n\n return results;\n}\n\nexport type * from './types';\nexport * as SourceFetch from './types';\nexport * from './utils';\nexport * as schemas from './schemas';\nexport * as examples from './examples';\n\nexport default sourceFetch;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","import type { CorsOptions } from './schemas';\n\nexport function createCorsHeaders(\n corsConfig: boolean | CorsOptions = true,\n requestOrigin?: string | null,\n): Headers {\n const headers = new Headers();\n\n if (corsConfig === false) return headers;\n\n if (corsConfig === true) {\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type');\n } else {\n if (corsConfig.origin) {\n let origin: string;\n if (Array.isArray(corsConfig.origin)) {\n origin =\n requestOrigin && corsConfig.origin.includes(requestOrigin)\n ? requestOrigin\n : corsConfig.origin[0];\n } else {\n origin = corsConfig.origin;\n }\n headers.set('Access-Control-Allow-Origin', origin);\n }\n\n if (corsConfig.methods) {\n headers.set(\n 'Access-Control-Allow-Methods',\n corsConfig.methods.join(', '),\n );\n }\n\n if (corsConfig.headers) {\n headers.set(\n 'Access-Control-Allow-Headers',\n corsConfig.headers.join(', '),\n );\n }\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', String(corsConfig.maxAge));\n }\n }\n\n return headers;\n}\n\nexport const TRANSPARENT_GIF_BASE64 =\n 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nexport function createPixelResponse(corsHeaders?: Headers): Response {\n const binaryString = atob(TRANSPARENT_GIF_BASE64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'image/gif');\n headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n return new Response(bytes, { status: 200, headers });\n}\n\nexport function createJsonResponse(\n body: unknown,\n status = 200,\n corsHeaders?: Headers,\n): Response {\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'application/json');\n\n return new Response(JSON.stringify(body), { status, headers });\n}\n\n/**\n * Match a request pathname against a route pattern.\n * Supports exact matches and wildcard patterns (e.g., /api/*).\n */\nexport function matchPath(requestPath: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return requestPath === prefix || requestPath.startsWith(prefix + '/');\n }\n return requestPath === pattern;\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n SettingsSchema,\n CorsOptionsSchema,\n RouteConfigSchema,\n} from './schemas';\nimport { z } from '@walkeros/core/dev';\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\nexport type RouteConfig = z.infer<typeof RouteConfigSchema>;\nexport type RouteMethod = 'GET' | 'POST';\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = (request: Request) => Response | Promise<Response>;\n\nexport interface Env extends CoreSource.Env {\n request?: Request;\n}\n\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\nexport interface FetchSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n timestamp?: number;\n error?: string;\n}\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n in: {\n method: 'GET',\n url: 'https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n"],"mappings":"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","names":["import_dev","import_dev","import_dev","settings","batch"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/utils.ts","../src/types.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { requestToData, isObject, isDefined } from '@walkeros/core';\nimport type { WalkerOS, Collector, Source } from '@walkeros/core';\nimport type { FetchSource, Types } from './types';\nimport { SettingsSchema, EventSchema } from './schemas';\nimport {\n createCorsHeaders,\n createPixelResponse,\n createJsonResponse,\n matchPath,\n} from './utils';\n\nexport const sourceFetch: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const parsed = SettingsSchema.parse(config.settings || {});\n const settings = {\n ...parsed,\n paths: parsed.paths ?? (parsed.path ? [parsed.path] : ['/collect']),\n };\n const { logger } = env;\n\n const push = async (request: Request): Promise<Response> => {\n const startTime = Date.now();\n\n try {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const origin = request.headers.get('Origin');\n const corsHeaders = createCorsHeaders(settings.cors, origin);\n\n // Resolve route configs\n const resolvedPaths = settings.paths.map((entry) =>\n typeof entry === 'string'\n ? { path: entry, methods: ['GET', 'POST'] as const }\n : {\n path: entry.path,\n methods: entry.methods || (['GET', 'POST'] as const),\n },\n );\n\n // Match request path against configured routes\n const matchedRoute = resolvedPaths.find((route) =>\n matchPath(url.pathname, route.path),\n );\n\n if (!matchedRoute) {\n return createJsonResponse(\n { success: false, error: 'Not found' },\n 404,\n corsHeaders,\n );\n }\n\n // OPTIONS (CORS preflight - no logging, routine)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n // Check method is allowed for this route\n if (!matchedRoute.methods.includes(method as 'GET' | 'POST')) {\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n }\n\n // Extract ingest metadata from request (if config.ingest is defined)\n await setIngest(request);\n\n // GET (pixel tracking - no logging, routine)\n if (method === 'GET') {\n const parsedData = requestToData(url.search);\n if (parsedData && isObject(parsedData)) {\n await env.push(parsedData);\n }\n return createPixelResponse(corsHeaders);\n }\n\n // POST\n if (method === 'POST') {\n // Check request size\n const contentLength = request.headers.get('Content-Length');\n if (contentLength) {\n const size = parseInt(contentLength, 10);\n if (size > settings.maxRequestSize) {\n logger.error('Request too large', {\n size,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n }\n\n let eventData: unknown;\n let bodyText: string;\n\n try {\n bodyText = await request.text();\n\n // Check actual body size\n if (bodyText.length > settings.maxRequestSize) {\n logger.error('Request body too large', {\n size: bodyText.length,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n\n eventData = JSON.parse(bodyText);\n } catch (error) {\n logger.error('Failed to parse JSON', error);\n return createJsonResponse(\n { success: false, error: 'Invalid JSON body' },\n 400,\n corsHeaders,\n );\n }\n\n if (!isDefined(eventData) || !isObject(eventData)) {\n logger.error('Invalid event body type');\n return createJsonResponse(\n { success: false, error: 'Invalid event: body must be an object' },\n 400,\n corsHeaders,\n );\n }\n\n // Check for batch\n const isBatch = 'batch' in eventData && Array.isArray(eventData.batch);\n\n if (isBatch) {\n const batch = eventData.batch as unknown[];\n\n if (batch.length > settings.maxBatchSize) {\n logger.error('Batch too large', {\n size: batch.length,\n limit: settings.maxBatchSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Batch too large. Maximum size: ${settings.maxBatchSize} events`,\n },\n 400,\n corsHeaders,\n );\n }\n\n const results = await processBatch(batch, env.push, logger);\n\n if (results.failed > 0) {\n return createJsonResponse(\n {\n success: false,\n processed: results.successful,\n failed: results.failed,\n errors: results.errors,\n },\n 207,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n {\n success: true,\n processed: results.successful,\n ids: results.ids,\n },\n 200,\n corsHeaders,\n );\n }\n\n // Single event - validate\n const validation = EventSchema.safeParse(eventData);\n if (!validation.success) {\n const errors = validation.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n logger.error('Event validation failed', { errors });\n\n return createJsonResponse(\n {\n success: false,\n error: 'Event validation failed',\n validationErrors: errors,\n },\n 400,\n corsHeaders,\n );\n }\n\n const result = await processEvent(\n validation.data as WalkerOS.DeepPartialEvent,\n env.push,\n );\n if (result.error) {\n logger.error('Event processing failed', { error: result.error });\n return createJsonResponse(\n { success: false, error: result.error },\n 400,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: true, id: result.id, timestamp: Date.now() },\n 200,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n } catch (error) {\n logger.error('Internal server error', error);\n const corsHeaders = createCorsHeaders(settings.cors);\n return createJsonResponse(\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n },\n 500,\n corsHeaders,\n );\n }\n };\n\n return { type: 'fetch', config: { ...config, settings }, push };\n};\n\nasync function processEvent(\n event: WalkerOS.DeepPartialEvent,\n push: Collector.PushFn,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push(event);\n return { id: result?.event?.id };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n\nasync function processBatch(\n events: unknown[],\n push: Collector.PushFn,\n logger: Types['env']['logger'],\n): Promise<{\n successful: number;\n failed: number;\n ids: string[];\n errors: Array<{ index: number; error: string }>;\n}> {\n const results = {\n successful: 0,\n failed: 0,\n ids: [] as string[],\n errors: [] as Array<{ index: number; error: string }>,\n };\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i];\n\n const validation = EventSchema.safeParse(event);\n if (!validation.success) {\n results.failed++;\n results.errors.push({\n index: i,\n error: `Validation failed: ${validation.error.issues[0].message}`,\n });\n logger.error(`Batch event ${i} validation failed`, {\n errors: validation.error.issues,\n });\n continue;\n }\n\n try {\n const result = await push(validation.data as WalkerOS.DeepPartialEvent);\n if (result?.event?.id) {\n results.ids.push(result.event.id);\n }\n results.successful++;\n } catch (error) {\n results.failed++;\n results.errors.push({\n index: i,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.error(`Batch event ${i} processing failed`, error);\n }\n }\n\n return results;\n}\n\nexport type * from './types';\nexport * as SourceFetch from './types';\nexport * from './utils';\nexport * as schemas from './schemas';\nexport * as examples from './examples';\n\nexport default sourceFetch;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","import type { CorsOptions } from './schemas';\n\nexport function createCorsHeaders(\n corsConfig: boolean | CorsOptions = true,\n requestOrigin?: string | null,\n): Headers {\n const headers = new Headers();\n\n if (corsConfig === false) return headers;\n\n if (corsConfig === true) {\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type');\n } else {\n if (corsConfig.origin) {\n let origin: string;\n if (Array.isArray(corsConfig.origin)) {\n origin =\n requestOrigin && corsConfig.origin.includes(requestOrigin)\n ? requestOrigin\n : corsConfig.origin[0];\n } else {\n origin = corsConfig.origin;\n }\n headers.set('Access-Control-Allow-Origin', origin);\n }\n\n if (corsConfig.methods) {\n headers.set(\n 'Access-Control-Allow-Methods',\n corsConfig.methods.join(', '),\n );\n }\n\n if (corsConfig.headers) {\n headers.set(\n 'Access-Control-Allow-Headers',\n corsConfig.headers.join(', '),\n );\n }\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', String(corsConfig.maxAge));\n }\n }\n\n return headers;\n}\n\nexport const TRANSPARENT_GIF_BASE64 =\n 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nexport function createPixelResponse(corsHeaders?: Headers): Response {\n const binaryString = atob(TRANSPARENT_GIF_BASE64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'image/gif');\n headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n return new Response(bytes, { status: 200, headers });\n}\n\nexport function createJsonResponse(\n body: unknown,\n status = 200,\n corsHeaders?: Headers,\n): Response {\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'application/json');\n\n return new Response(JSON.stringify(body), { status, headers });\n}\n\n/**\n * Match a request pathname against a route pattern.\n * Supports exact matches and wildcard patterns (e.g., /api/*).\n */\nexport function matchPath(requestPath: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return requestPath === prefix || requestPath.startsWith(prefix + '/');\n }\n return requestPath === pattern;\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n SettingsSchema,\n CorsOptionsSchema,\n RouteConfigSchema,\n} from './schemas';\nimport { z } from '@walkeros/core/dev';\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\nexport type RouteConfig = z.infer<typeof RouteConfigSchema>;\nexport type RouteMethod = 'GET' | 'POST';\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = (request: Request) => Response | Promise<Response>;\n\nexport interface Env extends CoreSource.Env {\n request?: Request;\n}\n\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\nexport interface FetchSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n timestamp?: number;\n error?: string;\n}\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n trigger: { type: 'GET' },\n in: {\n method: 'GET',\n url: 'http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n method: string;\n url: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nexport interface Result {\n status: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\nfunction findFetchSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'fetch') return source;\n }\n}\n\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findFetchSource(flow.collector);\n if (!source) throw new Error('Fetch source not found in collector');\n\n // Construct real Request from content\n const init: RequestInit = {\n method: content.method,\n headers: { 'Content-Type': 'application/json', ...content.headers },\n };\n if (content.method !== 'GET' && content.body !== undefined) {\n init.body = JSON.stringify(content.body);\n }\n const request = new Request(content.url, init);\n\n // Call source.push with the real Request\n const response = await (\n source as unknown as { push: (r: Request) => Promise<Response> }\n ).push(request);\n\n // Convert Response to serializable result\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((v, k) => {\n responseHeaders[k] = v;\n });\n\n const ct = response.headers.get('content-type') || '';\n const body = ct.includes('json')\n ? await response.json()\n : await response.text();\n\n return { status: response.status, body, headers: responseHeaders };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\nexport { createTrigger };\n"],"mappings":"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","names":["import_dev","import_dev","import_dev","settings","batch"]}
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,isObject,isDefined}from"@walkeros/core";var schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,EventSchema:()=>EventSchema,HttpMethod:()=>HttpMethod,RouteConfigSchema:()=>RouteConfigSchema,RouteMethod:()=>RouteMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});import{zodToSchema}from"@walkeros/core/dev";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.optional(),methods:z.array(HttpMethod).optional(),headers:z.array(z.string()).optional(),credentials:z.boolean().optional(),maxAge:z.number().int().positive().optional()}),RouteMethod=z.enum(["GET","POST"]),RouteConfigSchema=z.object({path:z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:z.array(RouteMethod).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),SettingsSchema=z2.object({path:z2.string().describe("Deprecated: use paths instead").optional(),paths:z2.array(z2.union([z2.string(),RouteConfigSchema])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:z2.union([z2.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:z2.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:z2.number().int().positive().describe("Maximum events per batch request").default(100)});import{z as z3}from"@walkeros/core/dev";var PropertiesSchema=z3.record(z3.string(),z3.union([z3.string(),z3.number(),z3.boolean(),z3.record(z3.string(),z3.any())])),OrderedPropertiesSchema=z3.record(z3.string(),z3.tuple([z3.union([z3.string(),z3.number(),z3.boolean(),z3.record(z3.string(),z3.any())]),z3.number()])),UserSchema=z3.object({id:z3.string().optional(),device:z3.string().optional(),session:z3.string().optional(),email:z3.string().optional(),hash:z3.string().optional()}).passthrough(),ConsentSchema=z3.record(z3.string(),z3.boolean()),EntitySchema=z3.lazy(()=>z3.object({entity:z3.string(),data:PropertiesSchema.optional(),nested:z3.array(EntitySchema).optional(),context:OrderedPropertiesSchema.optional()}).passthrough()),VersionSchema=z3.object({source:z3.string(),tagging:z3.number()}),SourceSchema=z3.object({type:z3.string(),id:z3.string(),previous_id:z3.string()}).passthrough(),EventSchema=z3.object({name:z3.string().min(1,"Event name is required"),data:PropertiesSchema.optional(),context:OrderedPropertiesSchema.optional(),globals:PropertiesSchema.optional(),custom:PropertiesSchema.optional(),user:UserSchema.optional(),nested:z3.array(EntitySchema).optional(),consent:ConsentSchema.optional(),id:z3.string().optional(),trigger:z3.string().optional(),entity:z3.string().optional(),action:z3.string().optional(),timestamp:z3.number().optional(),timing:z3.number().optional(),group:z3.string().optional(),count:z3.number().optional(),version:VersionSchema.optional(),source:SourceSchema.optional()}).passthrough(),settings=zodToSchema(SettingsSchema);function createCorsHeaders(corsConfig=!0,requestOrigin){const headers=new Headers;if(!1===corsConfig)return headers;if(!0===corsConfig)headers.set("Access-Control-Allow-Origin","*"),headers.set("Access-Control-Allow-Methods","GET, POST, OPTIONS"),headers.set("Access-Control-Allow-Headers","Content-Type");else{if(corsConfig.origin){let origin;origin=Array.isArray(corsConfig.origin)?requestOrigin&&corsConfig.origin.includes(requestOrigin)?requestOrigin:corsConfig.origin[0]:corsConfig.origin,headers.set("Access-Control-Allow-Origin",origin)}corsConfig.methods&&headers.set("Access-Control-Allow-Methods",corsConfig.methods.join(", ")),corsConfig.headers&&headers.set("Access-Control-Allow-Headers",corsConfig.headers.join(", ")),corsConfig.credentials&&headers.set("Access-Control-Allow-Credentials","true"),corsConfig.maxAge&&headers.set("Access-Control-Max-Age",String(corsConfig.maxAge))}return headers}var TRANSPARENT_GIF_BASE64="R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";function createPixelResponse(corsHeaders){const binaryString=atob("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);const headers=new Headers(corsHeaders);return headers.set("Content-Type","image/gif"),headers.set("Cache-Control","no-cache, no-store, must-revalidate"),new Response(bytes,{status:200,headers:headers})}function createJsonResponse(body,status=200,corsHeaders){const headers=new Headers(corsHeaders);return headers.set("Content-Type","application/json"),new Response(JSON.stringify(body),{status:status,headers:headers})}function matchPath(requestPath,pattern){if(pattern.endsWith("/*")){const prefix=pattern.slice(0,-2);return requestPath===prefix||requestPath.startsWith(prefix+"/")}return requestPath===pattern}var types_exports={},examples_exports={};__export(examples_exports,{inputs:()=>inputs_exports,requests:()=>requests_exports,step:()=>step_exports});var inputs_exports={};__export(inputs_exports,{batch:()=>batch,completeEvent:()=>completeEvent,minimal:()=>minimal,pageView:()=>pageView,productAdd:()=>productAdd});var pageView={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},productAdd={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},completeEvent={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},minimal={name:"ping"},batch=[pageView,productAdd,{name:"button click",data:{id:"cta"}}],requests_exports={};__export(requests_exports,{batchPostRequest:()=>batchPostRequest,healthCheckRequest:()=>healthCheckRequest,invalidJsonRequest:()=>invalidJsonRequest,optionsRequest:()=>optionsRequest,oversizedRequest:()=>oversizedRequest,pixelGetRequest:()=>pixelGetRequest,validPostRequest:()=>validPostRequest});var validPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},batchPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},pixelGetRequest={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},healthCheckRequest={method:"GET",url:"https://example.com/health"},optionsRequest={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},invalidJsonRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},oversizedRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},step_exports={};__export(step_exports,{batchRequest:()=>batchRequest,pixelGet:()=>pixelGet,postEvent:()=>postEvent});var postEvent={in:{method:"POST",url:"https://example.com/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},batchRequest={in:{method:"POST",url:"https://example.com/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},pixelGet={in:{method:"GET",url:"https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},sourceFetch=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,parsed=SettingsSchema.parse(config.settings||{}),settings2={...parsed,paths:parsed.paths??(parsed.path?[parsed.path]:["/collect"])},{logger:logger}=env;return{type:"fetch",config:{...config,settings:settings2},push:async request=>{Date.now();try{const url=new URL(request.url),method=request.method.toUpperCase(),origin=request.headers.get("Origin"),corsHeaders=createCorsHeaders(settings2.cors,origin),matchedRoute=settings2.paths.map(entry=>"string"==typeof entry?{path:entry,methods:["GET","POST"]}:{path:entry.path,methods:entry.methods||["GET","POST"]}).find(route=>matchPath(url.pathname,route.path));if(!matchedRoute)return createJsonResponse({success:!1,error:"Not found"},404,corsHeaders);if("OPTIONS"===method)return new Response(null,{status:204,headers:corsHeaders});if(!matchedRoute.methods.includes(method))return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders);if(await setIngest(request),"GET"===method){const parsedData=requestToData(url.search);return parsedData&&isObject(parsedData)&&await env.push(parsedData),createPixelResponse(corsHeaders)}if("POST"===method){const contentLength=request.headers.get("Content-Length");if(contentLength){const size=parseInt(contentLength,10);if(size>settings2.maxRequestSize)return logger.error("Request too large",{size:size,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders)}let eventData,bodyText;try{if(bodyText=await request.text(),bodyText.length>settings2.maxRequestSize)return logger.error("Request body too large",{size:bodyText.length,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders);eventData=JSON.parse(bodyText)}catch(error){return logger.error("Failed to parse JSON",error),createJsonResponse({success:!1,error:"Invalid JSON body"},400,corsHeaders)}if(!isDefined(eventData)||!isObject(eventData))return logger.error("Invalid event body type"),createJsonResponse({success:!1,error:"Invalid event: body must be an object"},400,corsHeaders);if("batch"in eventData&&Array.isArray(eventData.batch)){const batch2=eventData.batch;if(batch2.length>settings2.maxBatchSize)return logger.error("Batch too large",{size:batch2.length,limit:settings2.maxBatchSize}),createJsonResponse({success:!1,error:`Batch too large. Maximum size: ${settings2.maxBatchSize} events`},400,corsHeaders);const results=await async function(events,push,logger){const results={successful:0,failed:0,ids:[],errors:[]};for(let i=0;i<events.length;i++){const event=events[i],validation=EventSchema.safeParse(event);if(validation.success)try{const result=await push(validation.data);result?.event?.id&&results.ids.push(result.event.id),results.successful++}catch(error){results.failed++,results.errors.push({index:i,error:error instanceof Error?error.message:"Unknown error"}),logger.error(`Batch event ${i} processing failed`,error)}else results.failed++,results.errors.push({index:i,error:`Validation failed: ${validation.error.issues[0].message}`}),logger.error(`Batch event ${i} validation failed`,{errors:validation.error.issues})}return results}(batch2,env.push,logger);return results.failed>0?createJsonResponse({success:!1,processed:results.successful,failed:results.failed,errors:results.errors},207,corsHeaders):createJsonResponse({success:!0,processed:results.successful,ids:results.ids},200,corsHeaders)}const validation=EventSchema.safeParse(eventData);if(!validation.success){const errors=validation.error.issues.map(issue=>({path:issue.path.join("."),message:issue.message}));return logger.error("Event validation failed",{errors:errors}),createJsonResponse({success:!1,error:"Event validation failed",validationErrors:errors},400,corsHeaders)}const result=await async function(event,push){try{const result=await push(event);return{id:result?.event?.id}}catch(error){return{error:error instanceof Error?error.message:"Unknown error"}}}(validation.data,env.push);return result.error?(logger.error("Event processing failed",{error:result.error}),createJsonResponse({success:!1,error:result.error},400,corsHeaders)):createJsonResponse({success:!0,id:result.id,timestamp:Date.now()},200,corsHeaders)}return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders)}catch(error){logger.error("Internal server error",error);const corsHeaders=createCorsHeaders(settings2.cors);return createJsonResponse({success:!1,error:error instanceof Error?error.message:"Internal server error"},500,corsHeaders)}}}};var index_default=sourceFetch;export{types_exports as SourceFetch,TRANSPARENT_GIF_BASE64,createCorsHeaders,createJsonResponse,createPixelResponse,index_default as default,examples_exports as examples,matchPath,schemas_exports as schemas,sourceFetch};//# 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,isObject,isDefined}from"@walkeros/core";var schemas_exports={};__export(schemas_exports,{CorsOptionsSchema:()=>CorsOptionsSchema,CorsOrigin:()=>CorsOrigin,EventSchema:()=>EventSchema,HttpMethod:()=>HttpMethod,RouteConfigSchema:()=>RouteConfigSchema,RouteMethod:()=>RouteMethod,SettingsSchema:()=>SettingsSchema,settings:()=>settings});import{zodToSchema}from"@walkeros/core/dev";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.optional(),methods:z.array(HttpMethod).optional(),headers:z.array(z.string()).optional(),credentials:z.boolean().optional(),maxAge:z.number().int().positive().optional()}),RouteMethod=z.enum(["GET","POST"]),RouteConfigSchema=z.object({path:z.string().describe("URL path pattern (supports wildcards like /api/*)"),methods:z.array(RouteMethod).min(1).describe("HTTP methods to accept. OPTIONS always included for CORS.").optional()}),SettingsSchema=z2.object({path:z2.string().describe("Deprecated: use paths instead").optional(),paths:z2.array(z2.union([z2.string(),RouteConfigSchema])).min(1).describe("Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.").optional(),cors:z2.union([z2.boolean(),CorsOptionsSchema]).describe("CORS configuration: false = disabled, true = allow all (default), object = custom").default(!0),maxRequestSize:z2.number().int().positive().describe("Maximum request body size in bytes").default(102400),maxBatchSize:z2.number().int().positive().describe("Maximum events per batch request").default(100)});import{z as z3}from"@walkeros/core/dev";var PropertiesSchema=z3.record(z3.string(),z3.union([z3.string(),z3.number(),z3.boolean(),z3.record(z3.string(),z3.any())])),OrderedPropertiesSchema=z3.record(z3.string(),z3.tuple([z3.union([z3.string(),z3.number(),z3.boolean(),z3.record(z3.string(),z3.any())]),z3.number()])),UserSchema=z3.object({id:z3.string().optional(),device:z3.string().optional(),session:z3.string().optional(),email:z3.string().optional(),hash:z3.string().optional()}).passthrough(),ConsentSchema=z3.record(z3.string(),z3.boolean()),EntitySchema=z3.lazy(()=>z3.object({entity:z3.string(),data:PropertiesSchema.optional(),nested:z3.array(EntitySchema).optional(),context:OrderedPropertiesSchema.optional()}).passthrough()),VersionSchema=z3.object({source:z3.string(),tagging:z3.number()}),SourceSchema=z3.object({type:z3.string(),id:z3.string(),previous_id:z3.string()}).passthrough(),EventSchema=z3.object({name:z3.string().min(1,"Event name is required"),data:PropertiesSchema.optional(),context:OrderedPropertiesSchema.optional(),globals:PropertiesSchema.optional(),custom:PropertiesSchema.optional(),user:UserSchema.optional(),nested:z3.array(EntitySchema).optional(),consent:ConsentSchema.optional(),id:z3.string().optional(),trigger:z3.string().optional(),entity:z3.string().optional(),action:z3.string().optional(),timestamp:z3.number().optional(),timing:z3.number().optional(),group:z3.string().optional(),count:z3.number().optional(),version:VersionSchema.optional(),source:SourceSchema.optional()}).passthrough(),settings=zodToSchema(SettingsSchema);function createCorsHeaders(corsConfig=!0,requestOrigin){const headers=new Headers;if(!1===corsConfig)return headers;if(!0===corsConfig)headers.set("Access-Control-Allow-Origin","*"),headers.set("Access-Control-Allow-Methods","GET, POST, OPTIONS"),headers.set("Access-Control-Allow-Headers","Content-Type");else{if(corsConfig.origin){let origin;origin=Array.isArray(corsConfig.origin)?requestOrigin&&corsConfig.origin.includes(requestOrigin)?requestOrigin:corsConfig.origin[0]:corsConfig.origin,headers.set("Access-Control-Allow-Origin",origin)}corsConfig.methods&&headers.set("Access-Control-Allow-Methods",corsConfig.methods.join(", ")),corsConfig.headers&&headers.set("Access-Control-Allow-Headers",corsConfig.headers.join(", ")),corsConfig.credentials&&headers.set("Access-Control-Allow-Credentials","true"),corsConfig.maxAge&&headers.set("Access-Control-Max-Age",String(corsConfig.maxAge))}return headers}var TRANSPARENT_GIF_BASE64="R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";function createPixelResponse(corsHeaders){const binaryString=atob("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);const headers=new Headers(corsHeaders);return headers.set("Content-Type","image/gif"),headers.set("Cache-Control","no-cache, no-store, must-revalidate"),new Response(bytes,{status:200,headers:headers})}function createJsonResponse(body,status=200,corsHeaders){const headers=new Headers(corsHeaders);return headers.set("Content-Type","application/json"),new Response(JSON.stringify(body),{status:status,headers:headers})}function matchPath(requestPath,pattern){if(pattern.endsWith("/*")){const prefix=pattern.slice(0,-2);return requestPath===prefix||requestPath.startsWith(prefix+"/")}return requestPath===pattern}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,inputs:()=>inputs_exports,requests:()=>requests_exports,step:()=>step_exports});var inputs_exports={};__export(inputs_exports,{batch:()=>batch,completeEvent:()=>completeEvent,minimal:()=>minimal,pageView:()=>pageView,productAdd:()=>productAdd});var pageView={name:"page view",data:{title:"Home Page",path:"/",referrer:"https://google.com"},user:{id:"user-123",session:"session-456"},timestamp:17e11},productAdd={name:"product add",data:{id:"P-123",name:"Laptop",price:999.99,quantity:1},context:{stage:["shopping",1]},globals:{language:"en",currency:"USD"},user:{id:"user-123"},nested:[{entity:"category",data:{name:"Electronics",path:"/electronics"}}],consent:{functional:!0,marketing:!0}},completeEvent={name:"order complete",data:{id:"ORDER-123",total:999.99,currency:"USD"},context:{stage:["checkout",3],test:["variant-A",0]},globals:{language:"en",country:"US"},custom:{campaignId:"summer-sale",source:"email"},user:{id:"user-123",email:"user@example.com",session:"session-456"},nested:[{entity:"product",data:{id:"P-123",price:999.99}}],consent:{functional:!0,marketing:!0,analytics:!1},trigger:"click",group:"ecommerce"},minimal={name:"ping"},batch=[pageView,productAdd,{name:"button click",data:{id:"cta"}}],requests_exports={};__export(requests_exports,{batchPostRequest:()=>batchPostRequest,healthCheckRequest:()=>healthCheckRequest,invalidJsonRequest:()=>invalidJsonRequest,optionsRequest:()=>optionsRequest,oversizedRequest:()=>oversizedRequest,pixelGetRequest:()=>pixelGetRequest,validPostRequest:()=>validPostRequest});var validPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"page view",data:{title:"Home"}})},batchPostRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]})},pixelGetRequest={method:"GET",url:"https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123"},healthCheckRequest={method:"GET",url:"https://example.com/health"},optionsRequest={method:"OPTIONS",url:"https://example.com/collect",headers:{Origin:"https://example.com"}},invalidJsonRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:"invalid json{"},oversizedRequest={method:"POST",url:"https://example.com/collect",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:"test",data:{payload:"x".repeat(2e5)}})},step_exports={};__export(step_exports,{batchRequest:()=>batchRequest,pixelGet:()=>pixelGet,postEvent:()=>postEvent});var postEvent={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"}}},out:{name:"page view",data:{title:"Docs",url:"https://example.com/docs"},entity:"page",action:"view"}},batchRequest={trigger:{type:"POST"},in:{method:"POST",url:"http://localhost/collect",body:{batch:[{name:"page view",data:{title:"Home"}},{name:"button click",data:{id:"cta"}}]}},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},pixelGet={trigger:{type:"GET"},in:{method:"GET",url:"http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"},out:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{startFlow}from"@walkeros/collector";var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await startFlow(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("fetch"===source.type)return source}(flow.collector);if(!source)throw new Error("Fetch source not found in collector");const init={method:content.method,headers:{"Content-Type":"application/json",...content.headers}};"GET"!==content.method&&void 0!==content.body&&(init.body=JSON.stringify(content.body));const request=new Request(content.url,init),response=await source.push(request),responseHeaders={};response.headers.forEach((v,k)=>{responseHeaders[k]=v});const body=(response.headers.get("content-type")||"").includes("json")?await response.json():await response.text();return{status:response.status,body:body,headers:responseHeaders}}}},sourceFetch=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,parsed=SettingsSchema.parse(config.settings||{}),settings2={...parsed,paths:parsed.paths??(parsed.path?[parsed.path]:["/collect"])},{logger:logger}=env;return{type:"fetch",config:{...config,settings:settings2},push:async request=>{Date.now();try{const url=new URL(request.url),method=request.method.toUpperCase(),origin=request.headers.get("Origin"),corsHeaders=createCorsHeaders(settings2.cors,origin),matchedRoute=settings2.paths.map(entry=>"string"==typeof entry?{path:entry,methods:["GET","POST"]}:{path:entry.path,methods:entry.methods||["GET","POST"]}).find(route=>matchPath(url.pathname,route.path));if(!matchedRoute)return createJsonResponse({success:!1,error:"Not found"},404,corsHeaders);if("OPTIONS"===method)return new Response(null,{status:204,headers:corsHeaders});if(!matchedRoute.methods.includes(method))return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders);if(await setIngest(request),"GET"===method){const parsedData=requestToData(url.search);return parsedData&&isObject(parsedData)&&await env.push(parsedData),createPixelResponse(corsHeaders)}if("POST"===method){const contentLength=request.headers.get("Content-Length");if(contentLength){const size=parseInt(contentLength,10);if(size>settings2.maxRequestSize)return logger.error("Request too large",{size:size,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders)}let eventData,bodyText;try{if(bodyText=await request.text(),bodyText.length>settings2.maxRequestSize)return logger.error("Request body too large",{size:bodyText.length,limit:settings2.maxRequestSize}),createJsonResponse({success:!1,error:`Request too large. Maximum size: ${settings2.maxRequestSize} bytes`},413,corsHeaders);eventData=JSON.parse(bodyText)}catch(error){return logger.error("Failed to parse JSON",error),createJsonResponse({success:!1,error:"Invalid JSON body"},400,corsHeaders)}if(!isDefined(eventData)||!isObject(eventData))return logger.error("Invalid event body type"),createJsonResponse({success:!1,error:"Invalid event: body must be an object"},400,corsHeaders);if("batch"in eventData&&Array.isArray(eventData.batch)){const batch2=eventData.batch;if(batch2.length>settings2.maxBatchSize)return logger.error("Batch too large",{size:batch2.length,limit:settings2.maxBatchSize}),createJsonResponse({success:!1,error:`Batch too large. Maximum size: ${settings2.maxBatchSize} events`},400,corsHeaders);const results=await async function(events,push,logger){const results={successful:0,failed:0,ids:[],errors:[]};for(let i=0;i<events.length;i++){const event=events[i],validation=EventSchema.safeParse(event);if(validation.success)try{const result=await push(validation.data);result?.event?.id&&results.ids.push(result.event.id),results.successful++}catch(error){results.failed++,results.errors.push({index:i,error:error instanceof Error?error.message:"Unknown error"}),logger.error(`Batch event ${i} processing failed`,error)}else results.failed++,results.errors.push({index:i,error:`Validation failed: ${validation.error.issues[0].message}`}),logger.error(`Batch event ${i} validation failed`,{errors:validation.error.issues})}return results}(batch2,env.push,logger);return results.failed>0?createJsonResponse({success:!1,processed:results.successful,failed:results.failed,errors:results.errors},207,corsHeaders):createJsonResponse({success:!0,processed:results.successful,ids:results.ids},200,corsHeaders)}const validation=EventSchema.safeParse(eventData);if(!validation.success){const errors=validation.error.issues.map(issue=>({path:issue.path.join("."),message:issue.message}));return logger.error("Event validation failed",{errors:errors}),createJsonResponse({success:!1,error:"Event validation failed",validationErrors:errors},400,corsHeaders)}const result=await async function(event,push){try{const result=await push(event);return{id:result?.event?.id}}catch(error){return{error:error instanceof Error?error.message:"Unknown error"}}}(validation.data,env.push);return result.error?(logger.error("Event processing failed",{error:result.error}),createJsonResponse({success:!1,error:result.error},400,corsHeaders)):createJsonResponse({success:!0,id:result.id,timestamp:Date.now()},200,corsHeaders)}return createJsonResponse({success:!1,error:"Method not allowed"},405,corsHeaders)}catch(error){logger.error("Internal server error",error);const corsHeaders=createCorsHeaders(settings2.cors);return createJsonResponse({success:!1,error:error instanceof Error?error.message:"Internal server error"},500,corsHeaders)}}}};var index_default=sourceFetch;export{types_exports as SourceFetch,TRANSPARENT_GIF_BASE64,createCorsHeaders,createJsonResponse,createPixelResponse,index_default as default,examples_exports as examples,matchPath,schemas_exports as schemas,sourceFetch};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/utils.ts","../src/types.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts"],"sourcesContent":["import { requestToData, isObject, isDefined } from '@walkeros/core';\nimport type { WalkerOS, Collector, Source } from '@walkeros/core';\nimport type { FetchSource, Types } from './types';\nimport { SettingsSchema, EventSchema } from './schemas';\nimport {\n createCorsHeaders,\n createPixelResponse,\n createJsonResponse,\n matchPath,\n} from './utils';\n\nexport const sourceFetch: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const parsed = SettingsSchema.parse(config.settings || {});\n const settings = {\n ...parsed,\n paths: parsed.paths ?? (parsed.path ? [parsed.path] : ['/collect']),\n };\n const { logger } = env;\n\n const push = async (request: Request): Promise<Response> => {\n const startTime = Date.now();\n\n try {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const origin = request.headers.get('Origin');\n const corsHeaders = createCorsHeaders(settings.cors, origin);\n\n // Resolve route configs\n const resolvedPaths = settings.paths.map((entry) =>\n typeof entry === 'string'\n ? { path: entry, methods: ['GET', 'POST'] as const }\n : {\n path: entry.path,\n methods: entry.methods || (['GET', 'POST'] as const),\n },\n );\n\n // Match request path against configured routes\n const matchedRoute = resolvedPaths.find((route) =>\n matchPath(url.pathname, route.path),\n );\n\n if (!matchedRoute) {\n return createJsonResponse(\n { success: false, error: 'Not found' },\n 404,\n corsHeaders,\n );\n }\n\n // OPTIONS (CORS preflight - no logging, routine)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n // Check method is allowed for this route\n if (!matchedRoute.methods.includes(method as 'GET' | 'POST')) {\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n }\n\n // Extract ingest metadata from request (if config.ingest is defined)\n await setIngest(request);\n\n // GET (pixel tracking - no logging, routine)\n if (method === 'GET') {\n const parsedData = requestToData(url.search);\n if (parsedData && isObject(parsedData)) {\n await env.push(parsedData);\n }\n return createPixelResponse(corsHeaders);\n }\n\n // POST\n if (method === 'POST') {\n // Check request size\n const contentLength = request.headers.get('Content-Length');\n if (contentLength) {\n const size = parseInt(contentLength, 10);\n if (size > settings.maxRequestSize) {\n logger.error('Request too large', {\n size,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n }\n\n let eventData: unknown;\n let bodyText: string;\n\n try {\n bodyText = await request.text();\n\n // Check actual body size\n if (bodyText.length > settings.maxRequestSize) {\n logger.error('Request body too large', {\n size: bodyText.length,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n\n eventData = JSON.parse(bodyText);\n } catch (error) {\n logger.error('Failed to parse JSON', error);\n return createJsonResponse(\n { success: false, error: 'Invalid JSON body' },\n 400,\n corsHeaders,\n );\n }\n\n if (!isDefined(eventData) || !isObject(eventData)) {\n logger.error('Invalid event body type');\n return createJsonResponse(\n { success: false, error: 'Invalid event: body must be an object' },\n 400,\n corsHeaders,\n );\n }\n\n // Check for batch\n const isBatch = 'batch' in eventData && Array.isArray(eventData.batch);\n\n if (isBatch) {\n const batch = eventData.batch as unknown[];\n\n if (batch.length > settings.maxBatchSize) {\n logger.error('Batch too large', {\n size: batch.length,\n limit: settings.maxBatchSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Batch too large. Maximum size: ${settings.maxBatchSize} events`,\n },\n 400,\n corsHeaders,\n );\n }\n\n const results = await processBatch(batch, env.push, logger);\n\n if (results.failed > 0) {\n return createJsonResponse(\n {\n success: false,\n processed: results.successful,\n failed: results.failed,\n errors: results.errors,\n },\n 207,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n {\n success: true,\n processed: results.successful,\n ids: results.ids,\n },\n 200,\n corsHeaders,\n );\n }\n\n // Single event - validate\n const validation = EventSchema.safeParse(eventData);\n if (!validation.success) {\n const errors = validation.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n logger.error('Event validation failed', { errors });\n\n return createJsonResponse(\n {\n success: false,\n error: 'Event validation failed',\n validationErrors: errors,\n },\n 400,\n corsHeaders,\n );\n }\n\n const result = await processEvent(\n validation.data as WalkerOS.DeepPartialEvent,\n env.push,\n );\n if (result.error) {\n logger.error('Event processing failed', { error: result.error });\n return createJsonResponse(\n { success: false, error: result.error },\n 400,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: true, id: result.id, timestamp: Date.now() },\n 200,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n } catch (error) {\n logger.error('Internal server error', error);\n const corsHeaders = createCorsHeaders(settings.cors);\n return createJsonResponse(\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n },\n 500,\n corsHeaders,\n );\n }\n };\n\n return { type: 'fetch', config: { ...config, settings }, push };\n};\n\nasync function processEvent(\n event: WalkerOS.DeepPartialEvent,\n push: Collector.PushFn,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push(event);\n return { id: result?.event?.id };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n\nasync function processBatch(\n events: unknown[],\n push: Collector.PushFn,\n logger: Types['env']['logger'],\n): Promise<{\n successful: number;\n failed: number;\n ids: string[];\n errors: Array<{ index: number; error: string }>;\n}> {\n const results = {\n successful: 0,\n failed: 0,\n ids: [] as string[],\n errors: [] as Array<{ index: number; error: string }>,\n };\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i];\n\n const validation = EventSchema.safeParse(event);\n if (!validation.success) {\n results.failed++;\n results.errors.push({\n index: i,\n error: `Validation failed: ${validation.error.issues[0].message}`,\n });\n logger.error(`Batch event ${i} validation failed`, {\n errors: validation.error.issues,\n });\n continue;\n }\n\n try {\n const result = await push(validation.data as WalkerOS.DeepPartialEvent);\n if (result?.event?.id) {\n results.ids.push(result.event.id);\n }\n results.successful++;\n } catch (error) {\n results.failed++;\n results.errors.push({\n index: i,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.error(`Batch event ${i} processing failed`, error);\n }\n }\n\n return results;\n}\n\nexport type * from './types';\nexport * as SourceFetch from './types';\nexport * from './utils';\nexport * as schemas from './schemas';\nexport * as examples from './examples';\n\nexport default sourceFetch;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","import type { CorsOptions } from './schemas';\n\nexport function createCorsHeaders(\n corsConfig: boolean | CorsOptions = true,\n requestOrigin?: string | null,\n): Headers {\n const headers = new Headers();\n\n if (corsConfig === false) return headers;\n\n if (corsConfig === true) {\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type');\n } else {\n if (corsConfig.origin) {\n let origin: string;\n if (Array.isArray(corsConfig.origin)) {\n origin =\n requestOrigin && corsConfig.origin.includes(requestOrigin)\n ? requestOrigin\n : corsConfig.origin[0];\n } else {\n origin = corsConfig.origin;\n }\n headers.set('Access-Control-Allow-Origin', origin);\n }\n\n if (corsConfig.methods) {\n headers.set(\n 'Access-Control-Allow-Methods',\n corsConfig.methods.join(', '),\n );\n }\n\n if (corsConfig.headers) {\n headers.set(\n 'Access-Control-Allow-Headers',\n corsConfig.headers.join(', '),\n );\n }\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', String(corsConfig.maxAge));\n }\n }\n\n return headers;\n}\n\nexport const TRANSPARENT_GIF_BASE64 =\n 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nexport function createPixelResponse(corsHeaders?: Headers): Response {\n const binaryString = atob(TRANSPARENT_GIF_BASE64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'image/gif');\n headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n return new Response(bytes, { status: 200, headers });\n}\n\nexport function createJsonResponse(\n body: unknown,\n status = 200,\n corsHeaders?: Headers,\n): Response {\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'application/json');\n\n return new Response(JSON.stringify(body), { status, headers });\n}\n\n/**\n * Match a request pathname against a route pattern.\n * Supports exact matches and wildcard patterns (e.g., /api/*).\n */\nexport function matchPath(requestPath: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return requestPath === prefix || requestPath.startsWith(prefix + '/');\n }\n return requestPath === pattern;\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n SettingsSchema,\n CorsOptionsSchema,\n RouteConfigSchema,\n} from './schemas';\nimport { z } from '@walkeros/core/dev';\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\nexport type RouteConfig = z.infer<typeof RouteConfigSchema>;\nexport type RouteMethod = 'GET' | 'POST';\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = (request: Request) => Response | Promise<Response>;\n\nexport interface Env extends CoreSource.Env {\n request?: Request;\n}\n\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\nexport interface FetchSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n timestamp?: number;\n error?: string;\n}\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n in: {\n method: 'POST',\n url: 'https://example.com/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n in: {\n method: 'GET',\n url: 'https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n"],"mappings":"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","names":["z","z","z","settings","batch"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/schemas/event.ts","../src/utils.ts","../src/types.ts","../src/examples/index.ts","../src/examples/inputs.ts","../src/examples/requests.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { requestToData, isObject, isDefined } from '@walkeros/core';\nimport type { WalkerOS, Collector, Source } from '@walkeros/core';\nimport type { FetchSource, Types } from './types';\nimport { SettingsSchema, EventSchema } from './schemas';\nimport {\n createCorsHeaders,\n createPixelResponse,\n createJsonResponse,\n matchPath,\n} from './utils';\n\nexport const sourceFetch: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const parsed = SettingsSchema.parse(config.settings || {});\n const settings = {\n ...parsed,\n paths: parsed.paths ?? (parsed.path ? [parsed.path] : ['/collect']),\n };\n const { logger } = env;\n\n const push = async (request: Request): Promise<Response> => {\n const startTime = Date.now();\n\n try {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const origin = request.headers.get('Origin');\n const corsHeaders = createCorsHeaders(settings.cors, origin);\n\n // Resolve route configs\n const resolvedPaths = settings.paths.map((entry) =>\n typeof entry === 'string'\n ? { path: entry, methods: ['GET', 'POST'] as const }\n : {\n path: entry.path,\n methods: entry.methods || (['GET', 'POST'] as const),\n },\n );\n\n // Match request path against configured routes\n const matchedRoute = resolvedPaths.find((route) =>\n matchPath(url.pathname, route.path),\n );\n\n if (!matchedRoute) {\n return createJsonResponse(\n { success: false, error: 'Not found' },\n 404,\n corsHeaders,\n );\n }\n\n // OPTIONS (CORS preflight - no logging, routine)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n // Check method is allowed for this route\n if (!matchedRoute.methods.includes(method as 'GET' | 'POST')) {\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n }\n\n // Extract ingest metadata from request (if config.ingest is defined)\n await setIngest(request);\n\n // GET (pixel tracking - no logging, routine)\n if (method === 'GET') {\n const parsedData = requestToData(url.search);\n if (parsedData && isObject(parsedData)) {\n await env.push(parsedData);\n }\n return createPixelResponse(corsHeaders);\n }\n\n // POST\n if (method === 'POST') {\n // Check request size\n const contentLength = request.headers.get('Content-Length');\n if (contentLength) {\n const size = parseInt(contentLength, 10);\n if (size > settings.maxRequestSize) {\n logger.error('Request too large', {\n size,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n }\n\n let eventData: unknown;\n let bodyText: string;\n\n try {\n bodyText = await request.text();\n\n // Check actual body size\n if (bodyText.length > settings.maxRequestSize) {\n logger.error('Request body too large', {\n size: bodyText.length,\n limit: settings.maxRequestSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n },\n 413,\n corsHeaders,\n );\n }\n\n eventData = JSON.parse(bodyText);\n } catch (error) {\n logger.error('Failed to parse JSON', error);\n return createJsonResponse(\n { success: false, error: 'Invalid JSON body' },\n 400,\n corsHeaders,\n );\n }\n\n if (!isDefined(eventData) || !isObject(eventData)) {\n logger.error('Invalid event body type');\n return createJsonResponse(\n { success: false, error: 'Invalid event: body must be an object' },\n 400,\n corsHeaders,\n );\n }\n\n // Check for batch\n const isBatch = 'batch' in eventData && Array.isArray(eventData.batch);\n\n if (isBatch) {\n const batch = eventData.batch as unknown[];\n\n if (batch.length > settings.maxBatchSize) {\n logger.error('Batch too large', {\n size: batch.length,\n limit: settings.maxBatchSize,\n });\n return createJsonResponse(\n {\n success: false,\n error: `Batch too large. Maximum size: ${settings.maxBatchSize} events`,\n },\n 400,\n corsHeaders,\n );\n }\n\n const results = await processBatch(batch, env.push, logger);\n\n if (results.failed > 0) {\n return createJsonResponse(\n {\n success: false,\n processed: results.successful,\n failed: results.failed,\n errors: results.errors,\n },\n 207,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n {\n success: true,\n processed: results.successful,\n ids: results.ids,\n },\n 200,\n corsHeaders,\n );\n }\n\n // Single event - validate\n const validation = EventSchema.safeParse(eventData);\n if (!validation.success) {\n const errors = validation.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n logger.error('Event validation failed', { errors });\n\n return createJsonResponse(\n {\n success: false,\n error: 'Event validation failed',\n validationErrors: errors,\n },\n 400,\n corsHeaders,\n );\n }\n\n const result = await processEvent(\n validation.data as WalkerOS.DeepPartialEvent,\n env.push,\n );\n if (result.error) {\n logger.error('Event processing failed', { error: result.error });\n return createJsonResponse(\n { success: false, error: result.error },\n 400,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: true, id: result.id, timestamp: Date.now() },\n 200,\n corsHeaders,\n );\n }\n\n return createJsonResponse(\n { success: false, error: 'Method not allowed' },\n 405,\n corsHeaders,\n );\n } catch (error) {\n logger.error('Internal server error', error);\n const corsHeaders = createCorsHeaders(settings.cors);\n return createJsonResponse(\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n },\n 500,\n corsHeaders,\n );\n }\n };\n\n return { type: 'fetch', config: { ...config, settings }, push };\n};\n\nasync function processEvent(\n event: WalkerOS.DeepPartialEvent,\n push: Collector.PushFn,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push(event);\n return { id: result?.event?.id };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n\nasync function processBatch(\n events: unknown[],\n push: Collector.PushFn,\n logger: Types['env']['logger'],\n): Promise<{\n successful: number;\n failed: number;\n ids: string[];\n errors: Array<{ index: number; error: string }>;\n}> {\n const results = {\n successful: 0,\n failed: 0,\n ids: [] as string[],\n errors: [] as Array<{ index: number; error: string }>,\n };\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i];\n\n const validation = EventSchema.safeParse(event);\n if (!validation.success) {\n results.failed++;\n results.errors.push({\n index: i,\n error: `Validation failed: ${validation.error.issues[0].message}`,\n });\n logger.error(`Batch event ${i} validation failed`, {\n errors: validation.error.issues,\n });\n continue;\n }\n\n try {\n const result = await push(validation.data as WalkerOS.DeepPartialEvent);\n if (result?.event?.id) {\n results.ids.push(result.event.id);\n }\n results.successful++;\n } catch (error) {\n results.failed++;\n results.errors.push({\n index: i,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.error(`Batch event ${i} processing failed`, error);\n }\n }\n\n return results;\n}\n\nexport type * from './types';\nexport * as SourceFetch from './types';\nexport * from './utils';\nexport * as schemas from './schemas';\nexport * as examples from './examples';\n\nexport default sourceFetch;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport * from './primitives';\nexport { SettingsSchema, type Settings } from './settings';\nexport * from './event';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema, RouteConfigSchema } from './primitives';\n\n/**\n * Fetch source settings schema.\n */\nexport const SettingsSchema = z.object({\n /** @deprecated Use `paths` instead */\n path: z.string().describe('Deprecated: use paths instead').optional(),\n\n paths: z\n .array(z.union([z.string(), RouteConfigSchema]))\n .min(1)\n .describe(\n 'Route paths to handle. String shorthand accepts GET+POST. RouteConfig allows per-route method control.',\n )\n .optional(),\n\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all (default), object = custom',\n )\n .default(true),\n\n maxRequestSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum request body size in bytes')\n .default(1024 * 100), // 100KB\n\n maxBatchSize: z\n .number()\n .int()\n .positive()\n .describe('Maximum events per batch request')\n .default(100),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.optional(),\n methods: z.array(HttpMethod).optional(),\n headers: z.array(z.string()).optional(),\n credentials: z.boolean().optional(),\n maxAge: z.number().int().positive().optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n/**\n * HTTP methods supported for route configuration.\n * OPTIONS is always handled for CORS (not user-configurable per route).\n */\nexport const RouteMethod = z.enum(['GET', 'POST']);\n\n/**\n * Route configuration for multi-path support.\n */\nexport const RouteConfigSchema = z.object({\n path: z\n .string()\n .describe('URL path pattern (supports wildcards like /api/*)'),\n methods: z\n .array(RouteMethod)\n .min(1)\n .describe('HTTP methods to accept. OPTIONS always included for CORS.')\n .optional(),\n});\n","import { z } from '@walkeros/core/dev';\n\n// Properties schema - flexible key-value pairs\nconst PropertiesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.any())]),\n);\n\n// Ordered properties - [value, order] tuples\nconst OrderedPropertiesSchema = z.record(\n z.string(),\n z.tuple([\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), z.any()),\n ]),\n z.number(),\n ]),\n);\n\n// User schema with optional fields\nconst UserSchema = z\n .object({\n id: z.string().optional(),\n device: z.string().optional(),\n session: z.string().optional(),\n email: z.string().optional(),\n hash: z.string().optional(),\n })\n .passthrough();\n\n// Consent schema - boolean flags\nconst ConsentSchema = z.record(z.string(), z.boolean());\n\n// Entity schema (recursive for nested entities)\nconst EntitySchema: z.ZodTypeAny = z.lazy(() =>\n z\n .object({\n entity: z.string(),\n data: PropertiesSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n context: OrderedPropertiesSchema.optional(),\n })\n .passthrough(),\n);\n\n// Version schema\nconst VersionSchema = z.object({\n source: z.string(),\n tagging: z.number(),\n});\n\n// Source schema\nconst SourceSchema = z\n .object({\n type: z.string(),\n id: z.string(),\n previous_id: z.string(),\n })\n .passthrough();\n\n// Main event schema - validates incoming events\nexport const EventSchema = z\n .object({\n // Required\n name: z.string().min(1, 'Event name is required'),\n\n // Core properties\n data: PropertiesSchema.optional(),\n context: OrderedPropertiesSchema.optional(),\n globals: PropertiesSchema.optional(),\n custom: PropertiesSchema.optional(),\n user: UserSchema.optional(),\n nested: z.array(EntitySchema).optional(),\n consent: ConsentSchema.optional(),\n\n // System fields (optional for incoming events)\n id: z.string().optional(),\n trigger: z.string().optional(),\n entity: z.string().optional(),\n action: z.string().optional(),\n timestamp: z.number().optional(),\n timing: z.number().optional(),\n group: z.string().optional(),\n count: z.number().optional(),\n version: VersionSchema.optional(),\n source: SourceSchema.optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport type ValidatedEvent = z.infer<typeof EventSchema>;\n","import type { CorsOptions } from './schemas';\n\nexport function createCorsHeaders(\n corsConfig: boolean | CorsOptions = true,\n requestOrigin?: string | null,\n): Headers {\n const headers = new Headers();\n\n if (corsConfig === false) return headers;\n\n if (corsConfig === true) {\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type');\n } else {\n if (corsConfig.origin) {\n let origin: string;\n if (Array.isArray(corsConfig.origin)) {\n origin =\n requestOrigin && corsConfig.origin.includes(requestOrigin)\n ? requestOrigin\n : corsConfig.origin[0];\n } else {\n origin = corsConfig.origin;\n }\n headers.set('Access-Control-Allow-Origin', origin);\n }\n\n if (corsConfig.methods) {\n headers.set(\n 'Access-Control-Allow-Methods',\n corsConfig.methods.join(', '),\n );\n }\n\n if (corsConfig.headers) {\n headers.set(\n 'Access-Control-Allow-Headers',\n corsConfig.headers.join(', '),\n );\n }\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', String(corsConfig.maxAge));\n }\n }\n\n return headers;\n}\n\nexport const TRANSPARENT_GIF_BASE64 =\n 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nexport function createPixelResponse(corsHeaders?: Headers): Response {\n const binaryString = atob(TRANSPARENT_GIF_BASE64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'image/gif');\n headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n return new Response(bytes, { status: 200, headers });\n}\n\nexport function createJsonResponse(\n body: unknown,\n status = 200,\n corsHeaders?: Headers,\n): Response {\n const headers = new Headers(corsHeaders);\n headers.set('Content-Type', 'application/json');\n\n return new Response(JSON.stringify(body), { status, headers });\n}\n\n/**\n * Match a request pathname against a route pattern.\n * Supports exact matches and wildcard patterns (e.g., /api/*).\n */\nexport function matchPath(requestPath: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return requestPath === prefix || requestPath.startsWith(prefix + '/');\n }\n return requestPath === pattern;\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n SettingsSchema,\n CorsOptionsSchema,\n RouteConfigSchema,\n} from './schemas';\nimport { z } from '@walkeros/core/dev';\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\nexport type RouteConfig = z.infer<typeof RouteConfigSchema>;\nexport type RouteMethod = 'GET' | 'POST';\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = (request: Request) => Response | Promise<Response>;\n\nexport interface Env extends CoreSource.Env {\n request?: Request;\n}\n\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\nexport interface FetchSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n timestamp?: number;\n error?: string;\n}\n","export * as inputs from './inputs';\nexport * as requests from './requests';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Example walkerOS events that HTTP clients send to this source.\n * These are the CONTRACT - tests verify implementation handles these inputs.\n */\n\n// Simple page view event\nexport const pageView: WalkerOS.DeepPartialEvent = {\n name: 'page view',\n data: {\n title: 'Home Page',\n path: '/',\n referrer: 'https://google.com',\n },\n user: {\n id: 'user-123',\n session: 'session-456',\n },\n timestamp: 1700000000000,\n};\n\n// E-commerce event with nested entities\nexport const productAdd: WalkerOS.DeepPartialEvent = {\n name: 'product add',\n data: {\n id: 'P-123',\n name: 'Laptop',\n price: 999.99,\n quantity: 1,\n },\n context: {\n stage: ['shopping', 1],\n },\n globals: {\n language: 'en',\n currency: 'USD',\n },\n user: {\n id: 'user-123',\n },\n nested: [\n {\n entity: 'category',\n data: {\n name: 'Electronics',\n path: '/electronics',\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n },\n};\n\n// Complete event with all optional fields\nexport const completeEvent: WalkerOS.DeepPartialEvent = {\n name: 'order complete',\n data: {\n id: 'ORDER-123',\n total: 999.99,\n currency: 'USD',\n },\n context: {\n stage: ['checkout', 3],\n test: ['variant-A', 0],\n },\n globals: {\n language: 'en',\n country: 'US',\n },\n custom: {\n campaignId: 'summer-sale',\n source: 'email',\n },\n user: {\n id: 'user-123',\n email: 'user@example.com',\n session: 'session-456',\n },\n nested: [\n {\n entity: 'product',\n data: {\n id: 'P-123',\n price: 999.99,\n },\n },\n ],\n consent: {\n functional: true,\n marketing: true,\n analytics: false,\n },\n trigger: 'click',\n group: 'ecommerce',\n};\n\n// Minimal valid event\nexport const minimal: WalkerOS.DeepPartialEvent = {\n name: 'ping',\n};\n\n// Batch of events\nexport const batch: WalkerOS.DeepPartialEvent[] = [\n pageView,\n productAdd,\n { name: 'button click', data: { id: 'cta' } },\n];\n","/**\n * HTTP request examples for testing the fetch source.\n * Shows what external HTTP clients will send.\n */\n\nexport const validPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n }),\n};\n\nexport const batchPostRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n }),\n};\n\nexport const pixelGetRequest = {\n method: 'GET',\n url: 'https://example.com/collect?event=page%20view&data[title]=Home&user[id]=user123',\n};\n\nexport const healthCheckRequest = {\n method: 'GET',\n url: 'https://example.com/health',\n};\n\nexport const optionsRequest = {\n method: 'OPTIONS',\n url: 'https://example.com/collect',\n headers: { Origin: 'https://example.com' },\n};\n\nexport const invalidJsonRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: 'invalid json{',\n};\n\nexport const oversizedRequest = {\n method: 'POST',\n url: 'https://example.com/collect',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: 'test',\n data: { payload: 'x'.repeat(200000) }, // 200KB\n }),\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const postEvent: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Docs', url: 'https://example.com/docs' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const batchRequest: Flow.StepExample = {\n trigger: { type: 'POST' },\n in: {\n method: 'POST',\n url: 'http://localhost/collect',\n body: {\n batch: [\n { name: 'page view', data: { title: 'Home' } },\n { name: 'button click', data: { id: 'cta' } },\n ],\n },\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const pixelGet: Flow.StepExample = {\n trigger: { type: 'GET' },\n in: {\n method: 'GET',\n url: 'http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n },\n out: {\n name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n method: string;\n url: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nexport interface Result {\n status: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\nfunction findFetchSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'fetch') return source;\n }\n}\n\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findFetchSource(flow.collector);\n if (!source) throw new Error('Fetch source not found in collector');\n\n // Construct real Request from content\n const init: RequestInit = {\n method: content.method,\n headers: { 'Content-Type': 'application/json', ...content.headers },\n };\n if (content.method !== 'GET' && content.body !== undefined) {\n init.body = JSON.stringify(content.body);\n }\n const request = new Request(content.url, init);\n\n // Call source.push with the real Request\n const response = await (\n source as unknown as { push: (r: Request) => Promise<Response> }\n ).push(request);\n\n // Convert Response to serializable result\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((v, k) => {\n responseHeaders[k] = v;\n });\n\n const ct = response.headers.get('content-type') || '';\n const body = ct.includes('json')\n ? await response.json()\n : await response.text();\n\n return { status: response.status, body, headers: responseHeaders };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\nexport { createTrigger };\n"],"mappings":"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","names":["z","z","z","settings","batch"]}
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-source-fetch",
4
- "version": "3.0.1",
4
+ "version": "3.0.2",
5
5
  "type": "source",
6
- "platform": "server",
6
+ "platform": [
7
+ "server"
8
+ ],
7
9
  "docs": "https://www.walkeros.io/docs/sources/server/fetch",
8
10
  "source": "https://github.com/elbwalker/walkerOS/tree/main/packages/server/sources/fetch/src"
9
11
  },
@@ -138,6 +140,9 @@
138
140
  }
139
141
  },
140
142
  "examples": {
143
+ "createTrigger": {
144
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async o=>{if(!t){const o=await M(e);t={collector:o.collector,elb:o.elb}}const a=function(e){for(const t of Object.values(e.sources||{}))if(\"fetch\"===t.type)return t}(t.collector);if(!a)throw new Error(\"Fetch source not found in collector\");const n={method:o.method,headers:{\"Content-Type\":\"application/json\",...o.headers}};\"GET\"!==o.method&&void 0!==o.body&&(n.body=JSON.stringify(o.body));const i=new Request(o.url,n),r=await a.push(i),s={};r.headers.forEach((e,t)=>{s[t]=e});const l=(r.headers.get(\"content-type\")||\"\").includes(\"json\")?await r.json():await r.text();return{status:r.status,body:l,headers:s}}}}"
145
+ },
141
146
  "inputs": {
142
147
  "batch": [
143
148
  {
@@ -345,9 +350,12 @@
345
350
  },
346
351
  "step": {
347
352
  "batchRequest": {
353
+ "trigger": {
354
+ "type": "POST"
355
+ },
348
356
  "in": {
349
357
  "method": "POST",
350
- "url": "https://example.com/collect",
358
+ "url": "http://localhost/collect",
351
359
  "body": {
352
360
  "batch": [
353
361
  {
@@ -375,9 +383,12 @@
375
383
  }
376
384
  },
377
385
  "pixelGet": {
386
+ "trigger": {
387
+ "type": "GET"
388
+ },
378
389
  "in": {
379
390
  "method": "GET",
380
- "url": "https://example.com/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"
391
+ "url": "http://localhost/collect?e=page+view&d=%7B%22title%22%3A%22Home%22%7D"
381
392
  },
382
393
  "out": {
383
394
  "name": "page view",
@@ -389,9 +400,12 @@
389
400
  }
390
401
  },
391
402
  "postEvent": {
403
+ "trigger": {
404
+ "type": "POST"
405
+ },
392
406
  "in": {
393
407
  "method": "POST",
394
- "url": "https://example.com/collect",
408
+ "url": "http://localhost/collect",
395
409
  "body": {
396
410
  "name": "page view",
397
411
  "data": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-source-fetch",
3
3
  "description": "Web Standard Fetch API source for walkerOS (Cloudflare Workers, Vercel Edge, Deno, Bun)",
4
- "version": "3.0.2",
4
+ "version": "3.1.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -19,7 +19,8 @@
19
19
  "update": "npx npm-check-updates -u && npm update"
20
20
  },
21
21
  "dependencies": {
22
- "@walkeros/core": "^3.0.2"
22
+ "@walkeros/collector": "^3.1.0",
23
+ "@walkeros/core": "^3.1.0"
23
24
  },
24
25
  "devDependencies": {},
25
26
  "repository": {
@@ -33,7 +34,9 @@
33
34
  },
34
35
  "walkerOS": {
35
36
  "type": "source",
36
- "platform": "server",
37
+ "platform": [
38
+ "server"
39
+ ],
37
40
  "docs": "https://www.walkeros.io/docs/sources/server/fetch"
38
41
  },
39
42
  "keywords": [