@walkeros/server-destination-gcp 4.7.2-next-1791147139360 → 4.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,16 @@
1
1
  # @walkeros/server-destination-gcp
2
2
 
3
- ## 4.7.2-next-1791147139360
3
+ ## 4.7.2
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - Updated dependencies [98398fe]
8
+ - Updated dependencies [98398fe]
7
9
  - Updated dependencies [ff23953]
8
- - @walkeros/core@4.7.2-next-1791147139360
9
- - @walkeros/server-core@4.7.2-next-1791147139360
10
+ - Updated dependencies [98398fe]
11
+ - Updated dependencies [98398fe]
12
+ - @walkeros/core@4.7.2
13
+ - @walkeros/server-core@4.7.2
10
14
 
11
15
  ## 4.7.1
12
16
 
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,r)=>{for(var s in r)t(e,s,{get:r[s],enumerable:!0})},a={};o(a,{examples:()=>n,exportExamples:()=>ue,exportSchemas:()=>pe,hints:()=>ce,pubsubExamples:()=>D,schemas:()=>le}),module.exports=(e=a,((e,o,a,n)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let l of s(o))i.call(e,l)||l===a||t(e,l,{get:()=>o[l],enumerable:!(n=r(o,l))||n.enumerable});return e})(t({},"__esModule",{value:!0}),e));var n={};o(n,{env:()=>l,step:()=>k});var l={};o(l,{push:()=>S,simulation:()=>w});var c=require("events"),u=[],p=null,d=null,g=null,m=null,b=class extends c.EventEmitter{streamId;constructor(e){super(),this.streamId=e}getStreamId(){return this.streamId}onConnectionError(e){return u.push({method:"onConnectionError",args:[]}),this.on("error",e),{off:()=>{this.off("error",e)}}}__emitConnectionError(e){this.emit("error",e)}},h=[],y={convertStorageSchemaToProto2Descriptor:(e,t)=>(u.push({method:"adapt.convertStorageSchemaToProto2Descriptor",args:[e,t]}),{name:"root",field:[]})},v=class{constructor(e){u.push({method:"WriterClient.ctor",args:[e]})}async createStreamConnection(e,t){if("DEFAULT"!==e.streamId)throw new Error(`mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(e)}`);u.push({method:"createStreamConnection",args:[e,t]});const r=m;if(null!==r)throw m=null,r;const s=new b(`${e.destinationTable}/streams/_default`);return h.push(s),s}async getWriteStream(e,t){return u.push({method:"getWriteStream",args:[e,t]}),{tableSchema:{fields:[]}}}close(){u.push({method:"WriterClient.close",args:[]})}},f=class{constructor(e){u.push({method:"JSONWriter.ctor",args:[e]})}appendRows(e,t){u.push({method:"appendRows",args:[e,t]});const r=d;if(null!==r)throw d=null,r;const s=p;p=null;const i=g;return g=null,{getResult:async()=>{if(null!==i)throw i;return{appendResult:{offset:{value:"0"}},rowErrors:s??[],writeStream:"projects/p/datasets/d/tables/t/streams/_default"}}}}close(){u.push({method:"JSONWriter.close",args:[]})}};var S={get BigQuery(){return class{calls;options;constructor(e){this.options=e,this.calls=[]}dataset(e){return this.calls.push({method:"dataset",args:[e]}),this}table(e){return this.calls.push({method:"table",args:[e]}),this}async exists(){return this.calls.push({method:"exists",args:[]}),[!0]}async create(e){this.calls.push({method:"create",args:[e]})}async getMetadata(){return this.calls.push({method:"getMetadata",args:[]}),[{}]}}},get WriterClient(){return v},get JSONWriter(){return f},get adapt(){return y}},w=["call:JSONWriter.appendRows"],k={};o(k,{pageView:()=>A,purchase:()=>C});var j=require("@walkeros/core");function O(e){return null==e?null:"object"==typeof e?Array.isArray(e)&&0===e.length?null:Array.isArray(e)||0!==Object.keys(e).length?JSON.stringify(e):null:JSON.stringify(e)}function z(e){return function(e){return{name:e.name,data:O(e.data),context:O(e.context),globals:O(e.globals),custom:O(e.custom),user:O(e.user),nested:O(e.nested),consent:O(e.consent),id:e.id,trigger:e.trigger,entity:e.entity,action:e.action,timestamp:1e3*new Date(e.timestamp).getTime(),timing:e.timing,source:O(e.source)}}(e)}var P=(0,j.getEvent)("page view",{timestamp:1700001100,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server"}}),A={title:"Page view",description:"A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.",in:P,mapping:void 0,out:[["appendRows",[z(P)]]]},E=(0,j.getEvent)("order complete",{timestamp:1700001101,data:{id:"ORD-500",total:199.99,items:[{sku:"SKU-1",qty:2}]},source:{type:"express",platform:"server"}}),C={title:"Purchase",description:"An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().",in:E,mapping:void 0,out:[["appendRows",[z(E)]]]},D={};o(D,{env:()=>T,step:()=>R});var T={};o(T,{push:()=>I,simulation:()=>N});var x=class{constructor(e){this.name=e}name;publishMessage(e){return Promise.resolve("mock-message-id")}resumePublishing(e){}},I={PubSub:class{constructor(e){this.options=e}options;topic(e){return new x(e)}close(){return Promise.resolve()}}},N=["call:PubSub.topic.publishMessage"],R={};o(R,{defaultPush:()=>_,mappedAttributes:()=>K,mappedData:()=>U,mappedOrderingKey:()=>W,mappedTopic:()=>Q,pageView:()=>F});var M=require("@walkeros/core"),q=(0,M.getEvent)("order complete",{timestamp:1700001100,data:{id:"ORD-500",total:199.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server",trace:"1a2b3c4d5e6f70819a2b3c4d5e6f7081",count:1}}),J=(0,M.getEvent)("page view",{timestamp:1700001101,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server",trace:"9f8e7d6c5b4a39281706f5e4d3c2b1a0",count:1}});function B(e){const t=e.source.platform??"default",r={...e,source:{...e.source,release:{[t]:"4.7.2-next-1791147139360"}}};return Buffer.from(JSON.stringify(r))}var _={title:"Default publish",description:"An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.",in:q,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(q)}]]},Q={title:"Topic override",description:"A mapping rule overrides the destination default topic so order events are published to a dedicated topic.",in:q,mapping:{settings:{topic:"orders"}},out:[["topic","orders",{messageOrdering:!1}],["publishMessage","orders",{data:B(q)}]]},W={title:"Ordering key from user",description:"A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.",in:q,mapping:{settings:{orderingKey:"user.id"}},out:[["topic","events",{messageOrdering:!0}],["publishMessage","events",{data:B(q),orderingKey:"usr-789"}]]},K={title:"Mapped attributes",description:"A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.",in:q,mapping:{settings:{attributes:{entity:"entity",action:"action"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(q),attributes:{entity:"order",action:"complete"}}]]},U={title:"Mapped payload",description:"A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.",in:q,mapping:{data:{map:{order_id:"data.id",revenue:"data.total",currency:"data.currency"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:Buffer.from(JSON.stringify({order_id:"ORD-500",revenue:199.99,currency:"EUR"}))}]]},F={title:"Page view",description:"A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.",in:J,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(J)}]]},G=require("@walkeros/core/dev"),L=require("@walkeros/core/dev"),V=L.z.object({client:L.z.any().describe("Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))").optional(),projectId:L.z.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),datasetId:L.z.string().min(1).default("walkerOS").describe("BigQuery dataset ID where events will be stored (like walker_events)"),tableId:L.z.string().min(1).default("events").describe("BigQuery table ID for event storage (like events)"),location:L.z.string().default("EU").describe("Geographic location for the BigQuery dataset (like US)"),bigquery:L.z.any().describe('Additional BigQuery client configuration options (like { keyFilename: "path/to/key.json" })').optional()}),$=require("@walkeros/core/dev").z.object({}),X=(0,G.zodToSchema)(V),H=(0,G.zodToSchema)($),Y=require("@walkeros/core/dev"),Z=require("@walkeros/core/dev"),ee=Z.z.object({client:Z.z.any().describe("Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))").optional(),projectId:Z.z.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),topic:Z.z.string().min(1).describe("Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK."),credentials:Z.z.any().describe("Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)").optional(),apiEndpoint:Z.z.string().describe("Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).").optional(),orderingKey:Z.z.any().describe("Mapping value resolved per-event. Truthy enables per-key ordering for the publish.").optional(),attributes:Z.z.any().describe("Default per-event attribute map merged into every published message. Mapping.Map shape.").optional()}),te=require("@walkeros/core/dev"),re=te.z.object({topic:te.z.string().describe("Per-rule topic override. Falls back to settings.topic if absent.").optional(),orderingKey:te.z.any().describe("Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.").optional(),attributes:te.z.any().describe("Per-rule attribute Mapping.Map merged on top of settings.attributes.").optional()}),se=require("@walkeros/core/dev"),ie=se.z.object({messageStoragePolicy:se.z.object({allowedPersistenceRegions:se.z.array(se.z.string()).describe("Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).")}).describe("Topic-level message storage policy.").optional(),messageRetentionDuration:se.z.object({seconds:se.z.number().describe("Retention window in seconds. Default: project default.")}).describe("Topic-level retention configuration.").optional(),kmsKeyName:se.z.string().describe("Customer-managed encryption key (CMEK) resource name. Optional.").optional(),labels:se.z.record(se.z.string(),se.z.string()).describe("Topic labels for organization and billing.").optional()}),oe=(0,Y.zodToSchema)(ee),ae=(0,Y.zodToSchema)(re),ne=(0,Y.zodToSchema)(ie),le={};o(le,{mapping:()=>H,pubsubMapping:()=>ae,pubsubSettings:()=>oe,pubsubSetup:()=>ne,settings:()=>X});var ce={"auth-methods":{text:'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: "./sa.json" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',code:[{lang:"json",code:'{ "settings": { "projectId": "my-project", "bigquery": { "keyFilename": "./sa.json" } } }'},{lang:"json",code:'{ "settings": { "projectId": "my-project" } }'}]},"storage-format":{text:'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset "walkeros", table "events", location "EU" — all overridable via settings.'},"query-json-columns":{text:"Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.",code:[{lang:"sql",code:"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'"}]},"troubleshoot-empty-table":{text:"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK."}},ue={destinationBigQuery:n,destinationPubSub:D},pe={destinationBigQuery:{settings:X,mapping:H},destinationPubSub:{settings:oe,mapping:ae,setup:ne}};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,r)=>{for(var s in r)t(e,s,{get:r[s],enumerable:!0})},a={};o(a,{examples:()=>n,exportExamples:()=>ue,exportSchemas:()=>pe,hints:()=>ce,pubsubExamples:()=>D,schemas:()=>le}),module.exports=(e=a,((e,o,a,n)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let l of s(o))i.call(e,l)||l===a||t(e,l,{get:()=>o[l],enumerable:!(n=r(o,l))||n.enumerable});return e})(t({},"__esModule",{value:!0}),e));var n={};o(n,{env:()=>l,step:()=>k});var l={};o(l,{push:()=>S,simulation:()=>w});var c=require("events"),u=[],p=null,d=null,g=null,m=null,b=class extends c.EventEmitter{streamId;constructor(e){super(),this.streamId=e}getStreamId(){return this.streamId}onConnectionError(e){return u.push({method:"onConnectionError",args:[]}),this.on("error",e),{off:()=>{this.off("error",e)}}}__emitConnectionError(e){this.emit("error",e)}},h=[],y={convertStorageSchemaToProto2Descriptor:(e,t)=>(u.push({method:"adapt.convertStorageSchemaToProto2Descriptor",args:[e,t]}),{name:"root",field:[]})},v=class{constructor(e){u.push({method:"WriterClient.ctor",args:[e]})}async createStreamConnection(e,t){if("DEFAULT"!==e.streamId)throw new Error(`mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(e)}`);u.push({method:"createStreamConnection",args:[e,t]});const r=m;if(null!==r)throw m=null,r;const s=new b(`${e.destinationTable}/streams/_default`);return h.push(s),s}async getWriteStream(e,t){return u.push({method:"getWriteStream",args:[e,t]}),{tableSchema:{fields:[]}}}close(){u.push({method:"WriterClient.close",args:[]})}},f=class{constructor(e){u.push({method:"JSONWriter.ctor",args:[e]})}appendRows(e,t){u.push({method:"appendRows",args:[e,t]});const r=d;if(null!==r)throw d=null,r;const s=p;p=null;const i=g;return g=null,{getResult:async()=>{if(null!==i)throw i;return{appendResult:{offset:{value:"0"}},rowErrors:s??[],writeStream:"projects/p/datasets/d/tables/t/streams/_default"}}}}close(){u.push({method:"JSONWriter.close",args:[]})}};var S={get BigQuery(){return class{calls;options;constructor(e){this.options=e,this.calls=[]}dataset(e){return this.calls.push({method:"dataset",args:[e]}),this}table(e){return this.calls.push({method:"table",args:[e]}),this}async exists(){return this.calls.push({method:"exists",args:[]}),[!0]}async create(e){this.calls.push({method:"create",args:[e]})}async getMetadata(){return this.calls.push({method:"getMetadata",args:[]}),[{}]}}},get WriterClient(){return v},get JSONWriter(){return f},get adapt(){return y}},w=["call:JSONWriter.appendRows"],k={};o(k,{pageView:()=>A,purchase:()=>C});var j=require("@walkeros/core");function O(e){return null==e?null:"object"==typeof e?Array.isArray(e)&&0===e.length?null:Array.isArray(e)||0!==Object.keys(e).length?JSON.stringify(e):null:JSON.stringify(e)}function z(e){return function(e){return{name:e.name,data:O(e.data),context:O(e.context),globals:O(e.globals),custom:O(e.custom),user:O(e.user),nested:O(e.nested),consent:O(e.consent),id:e.id,trigger:e.trigger,entity:e.entity,action:e.action,timestamp:1e3*new Date(e.timestamp).getTime(),timing:e.timing,source:O(e.source)}}(e)}var P=(0,j.getEvent)("page view",{timestamp:1700001100,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server"}}),A={title:"Page view",description:"A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.",in:P,mapping:void 0,out:[["appendRows",[z(P)]]]},E=(0,j.getEvent)("order complete",{timestamp:1700001101,data:{id:"ORD-500",total:199.99,items:[{sku:"SKU-1",qty:2}]},source:{type:"express",platform:"server"}}),C={title:"Purchase",description:"An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().",in:E,mapping:void 0,out:[["appendRows",[z(E)]]]},D={};o(D,{env:()=>T,step:()=>R});var T={};o(T,{push:()=>x,simulation:()=>N});var I=class{constructor(e){this.name=e}name;publishMessage(e){return Promise.resolve("mock-message-id")}resumePublishing(e){}},x={PubSub:class{constructor(e){this.options=e}options;topic(e){return new I(e)}close(){return Promise.resolve()}}},N=["call:PubSub.topic.publishMessage"],R={};o(R,{defaultPush:()=>_,mappedAttributes:()=>K,mappedData:()=>U,mappedOrderingKey:()=>W,mappedTopic:()=>Q,pageView:()=>F});var M=require("@walkeros/core"),q=(0,M.getEvent)("order complete",{timestamp:1700001100,data:{id:"ORD-500",total:199.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server",trace:"1a2b3c4d5e6f70819a2b3c4d5e6f7081",count:1}}),J=(0,M.getEvent)("page view",{timestamp:1700001101,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server",trace:"9f8e7d6c5b4a39281706f5e4d3c2b1a0",count:1}});function B(e){const t=e.source.platform??"default",r={...e,source:{...e.source,release:{[t]:"4.7.2"}}};return Buffer.from(JSON.stringify(r))}var _={title:"Default publish",description:"An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.",in:q,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(q)}]]},Q={title:"Topic override",description:"A mapping rule overrides the destination default topic so order events are published to a dedicated topic.",in:q,mapping:{settings:{topic:"orders"}},out:[["topic","orders",{messageOrdering:!1}],["publishMessage","orders",{data:B(q)}]]},W={title:"Ordering key from user",description:"A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.",in:q,mapping:{settings:{orderingKey:"user.id"}},out:[["topic","events",{messageOrdering:!0}],["publishMessage","events",{data:B(q),orderingKey:"usr-789"}]]},K={title:"Mapped attributes",description:"A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.",in:q,mapping:{settings:{attributes:{entity:"entity",action:"action"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(q),attributes:{entity:"order",action:"complete"}}]]},U={title:"Mapped payload",description:"A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.",in:q,mapping:{data:{map:{order_id:"data.id",revenue:"data.total",currency:"data.currency"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:Buffer.from(JSON.stringify({order_id:"ORD-500",revenue:199.99,currency:"EUR"}))}]]},F={title:"Page view",description:"A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.",in:J,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:B(J)}]]},G=require("@walkeros/core/dev"),L=require("@walkeros/core/dev"),V=L.z.object({client:L.z.any().describe("Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))").optional(),projectId:L.z.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),datasetId:L.z.string().min(1).default("walkerOS").describe("BigQuery dataset ID where events will be stored (like walker_events)"),tableId:L.z.string().min(1).default("events").describe("BigQuery table ID for event storage (like events)"),location:L.z.string().default("EU").describe("Geographic location for the BigQuery dataset (like US)"),bigquery:L.z.any().describe('Additional BigQuery client configuration options (like { keyFilename: "path/to/key.json" })').optional()}),$=require("@walkeros/core/dev").z.object({}),X=(0,G.zodToSchema)(V),H=(0,G.zodToSchema)($),Y=require("@walkeros/core/dev"),Z=require("@walkeros/core/dev"),ee=Z.z.object({client:Z.z.any().describe("Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))").optional(),projectId:Z.z.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),topic:Z.z.string().min(1).describe("Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK."),credentials:Z.z.any().describe("Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)").optional(),apiEndpoint:Z.z.string().describe("Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).").optional(),orderingKey:Z.z.any().describe("Mapping value resolved per-event. Truthy enables per-key ordering for the publish.").optional(),attributes:Z.z.any().describe("Default per-event attribute map merged into every published message. Mapping.Map shape.").optional()}),te=require("@walkeros/core/dev"),re=te.z.object({topic:te.z.string().describe("Per-rule topic override. Falls back to settings.topic if absent.").optional(),orderingKey:te.z.any().describe("Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.").optional(),attributes:te.z.any().describe("Per-rule attribute Mapping.Map merged on top of settings.attributes.").optional()}),se=require("@walkeros/core/dev"),ie=se.z.object({messageStoragePolicy:se.z.object({allowedPersistenceRegions:se.z.array(se.z.string()).describe("Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).")}).describe("Topic-level message storage policy.").optional(),messageRetentionDuration:se.z.object({seconds:se.z.number().describe("Retention window in seconds. Default: project default.")}).describe("Topic-level retention configuration.").optional(),kmsKeyName:se.z.string().describe("Customer-managed encryption key (CMEK) resource name. Optional.").optional(),labels:se.z.record(se.z.string(),se.z.string()).describe("Topic labels for organization and billing.").optional()}),oe=(0,Y.zodToSchema)(ee),ae=(0,Y.zodToSchema)(re),ne=(0,Y.zodToSchema)(ie),le={};o(le,{mapping:()=>H,pubsubMapping:()=>ae,pubsubSettings:()=>oe,pubsubSetup:()=>ne,settings:()=>X});var ce={"auth-methods":{text:'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: "./sa.json" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',code:[{lang:"json",code:'{ "settings": { "projectId": "my-project", "bigquery": { "keyFilename": "./sa.json" } } }'},{lang:"json",code:'{ "settings": { "projectId": "my-project" } }'}]},"storage-format":{text:'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset "walkeros", table "events", location "EU" — all overridable via settings.'},"query-json-columns":{text:"Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.",code:[{lang:"sql",code:"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'"}]},"troubleshoot-empty-table":{text:"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK."}},ue={destinationBigQuery:n,destinationPubSub:D},pe={destinationBigQuery:{settings:X,mapping:H},destinationPubSub:{settings:oe,mapping:ae,setup:ne}};//# sourceMappingURL=dev.js.map
package/dist/dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev.ts","../src/bigquery/examples/index.ts","../src/bigquery/examples/env.ts","../src/bigquery/__mocks__/@google-cloud/bigquery-storage.ts","../src/bigquery/examples/step.ts","../src/bigquery/eventToRow.ts","../src/pubsub/examples/index.ts","../src/pubsub/examples/env.ts","../src/pubsub/examples/step.ts","../src/bigquery/schemas/index.ts","../src/bigquery/schemas/settings.ts","../src/bigquery/schemas/mapping.ts","../src/pubsub/schemas/index.ts","../src/pubsub/schemas/settings.ts","../src/pubsub/schemas/mapping.ts","../src/pubsub/schemas/setup.ts","../src/schemas.ts","../src/hints.ts"],"sourcesContent":["import * as bigqueryExamplesNs from './bigquery/examples';\nimport * as pubsubExamplesNs from './pubsub/examples';\nimport * as bigquerySchemasNs from './bigquery/schemas';\nimport * as pubsubSchemasNs from './pubsub/schemas';\n\nexport * as schemas from './schemas';\nexport * as examples from './bigquery/examples';\nexport * as pubsubExamples from './pubsub/examples';\nexport { hints } from './hints';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n destinationBigQuery: bigqueryExamplesNs,\n destinationPubSub: pubsubExamplesNs,\n};\n\n/** Schemas per export, keyed by the export names in package.json. */\nexport const exportSchemas = {\n destinationBigQuery: {\n settings: bigquerySchemasNs.settings,\n mapping: bigquerySchemasNs.mapping,\n },\n destinationPubSub: {\n settings: pubsubSchemasNs.settings,\n mapping: pubsubSchemasNs.mapping,\n setup: pubsubSchemasNs.setup,\n },\n};\n","export * as env from './env';\nexport * as step from './step';\n","import type { Env, QueryClient, TableMetadataShape } from '../types';\nimport {\n managedwriter as mockManagedwriter,\n adapt as mockAdapt,\n} from '../__mocks__/@google-cloud/bigquery-storage';\n\n/**\n * Example environment configurations for GCP BigQuery destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual BigQuery SDK dependencies.\n *\n * The Storage Write API mocks (WriterClient, JSONWriter, adapt) are\n * re-exported from the package-local __mocks__ folder so example/test\n * code shares a single source of truth with the jest auto-mock.\n */\n\n/**\n * Mock BigQuery query client: dataset and table provisioning calls resolve as\n * if both already exist.\n */\nfunction createMockBigQuery() {\n return class MockBigQuery implements QueryClient {\n calls: Array<{ method: string; args: unknown[] }>;\n options: unknown;\n\n constructor(options?: unknown) {\n this.options = options;\n this.calls = [];\n }\n\n dataset(datasetId: string) {\n this.calls.push({ method: 'dataset', args: [datasetId] });\n return this;\n }\n\n table(tableId: string) {\n this.calls.push({ method: 'table', args: [tableId] });\n return this;\n }\n\n async exists(): Promise<[boolean]> {\n this.calls.push({ method: 'exists', args: [] });\n return [true];\n }\n\n async create(options: unknown): Promise<void> {\n this.calls.push({ method: 'create', args: [options] });\n }\n\n async getMetadata(): Promise<[TableMetadataShape]> {\n this.calls.push({ method: 'getMetadata', args: [] });\n return [{}];\n }\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing BigQuery Storage Write appends without connecting\n * to actual GCP infrastructure.\n */\nexport const push: Env = {\n get BigQuery() {\n return createMockBigQuery();\n },\n get WriterClient() {\n return mockManagedwriter.WriterClient;\n },\n get JSONWriter() {\n return mockManagedwriter.JSONWriter;\n },\n get adapt() {\n return mockAdapt;\n },\n};\n\n/**\n * Every row goes through the writer's `appendRows`; the writer is built from\n * `JSONWriter` in init, so the path continues on the constructed instance.\n * Constructors are not recorded: their arguments carry credentials.\n */\nexport const simulation = ['call:JSONWriter.appendRows'];\n","import { EventEmitter } from 'events';\n\nconst calls: Array<{ method: string; args: unknown[] }> = [];\n\ninterface MockRowError {\n index: number;\n code: number;\n message: string;\n}\n\nlet nextAppendRowErrors: MockRowError[] | null = null;\nlet nextAppendThrow: unknown = null;\nlet nextGetResultReject: unknown = null;\nlet nextCreateStreamConnectionError: unknown = null;\n\n/**\n * Honest stand-in for the SDK's StreamConnection: a REAL Node EventEmitter so\n * `emit('error', …)` with no listener throws exactly like the real one (Node's\n * special-cased `'error'` event). `onConnectionError` mirrors the SDK surface:\n * it registers an `'error'` listener and returns an `{ off }` disposable.\n */\nclass MockStreamConnection extends EventEmitter {\n private readonly streamId: string;\n constructor(streamId: string) {\n super();\n this.streamId = streamId;\n }\n getStreamId(): string {\n return this.streamId;\n }\n onConnectionError(listener: (err: unknown) => void): { off: () => void } {\n calls.push({ method: 'onConnectionError', args: [] });\n this.on('error', listener);\n return {\n off: () => {\n this.off('error', listener);\n },\n };\n }\n /**\n * Test-only: literally `this.emit('error', err)` with NO internal\n * listener-count guard, so before a listener is attached this reproduces\n * Node's real \"throw if no 'error' listener\" behavior. A fake that silently\n * swallowed would mask the very crash this listener exists to contain.\n */\n __emitConnectionError(err: unknown): void {\n this.emit('error', err);\n }\n}\n\n// The most recently created connection, so tests can emit on it and assert the\n// listener was registered.\nlet lastConnection: MockStreamConnection | null = null;\n\n// Every connection ever created (this reset cycle), so tests can assert that a\n// concurrent re-open did not orphan a connection still carrying an 'error'\n// listener.\nconst allConnections: MockStreamConnection[] = [];\n\nclass MockJSONWriter {\n constructor(_args: { connection: unknown; protoDescriptor: unknown }) {\n calls.push({ method: 'JSONWriter.ctor', args: [_args] });\n }\n appendRows(rows: unknown[], offsetValue?: unknown) {\n calls.push({ method: 'appendRows', args: [rows, offsetValue] });\n const queuedThrow = nextAppendThrow;\n if (queuedThrow !== null) {\n nextAppendThrow = null;\n throw queuedThrow;\n }\n const queuedErrors = nextAppendRowErrors;\n nextAppendRowErrors = null;\n const queuedReject = nextGetResultReject;\n nextGetResultReject = null;\n return {\n getResult: async () => {\n // Models a gRPC deadline-exceeded (or any stream error): the append is\n // accepted but getResult() rejects when the stream's deadline fires.\n if (queuedReject !== null) throw queuedReject;\n return {\n appendResult: { offset: { value: '0' } },\n rowErrors: queuedErrors ?? [],\n writeStream: 'projects/p/datasets/d/tables/t/streams/_default',\n };\n },\n };\n }\n close(): void {\n calls.push({ method: 'JSONWriter.close', args: [] });\n }\n}\n\nclass MockWriterClient {\n constructor(args: {\n projectId?: string;\n keyFilename?: string;\n credentials?: unknown;\n scopes?: string | string[];\n }) {\n calls.push({ method: 'WriterClient.ctor', args: [args] });\n }\n async createStreamConnection(\n args: {\n destinationTable: string;\n streamId: string;\n },\n options?: unknown,\n ) {\n // Match the real SDK: callers must pass streamId=DefaultStream (not streamType)\n // for default-stream use. Passing streamType triggers a CreateWriteStream\n // call with type='DEFAULT', which BQ rejects as TYPE_UNSPECIFIED.\n if (args.streamId !== 'DEFAULT') {\n throw new Error(\n `mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(args)}`,\n );\n }\n // args[1] captures the gax CallOptions (e.g. { timeout }) so tests can\n // assert the request deadline is forwarded to the appendRows stream.\n calls.push({ method: 'createStreamConnection', args: [args, options] });\n const queuedError = nextCreateStreamConnectionError;\n if (queuedError !== null) {\n nextCreateStreamConnectionError = null;\n throw queuedError;\n }\n const connection = new MockStreamConnection(\n `${args.destinationTable}/streams/_default`,\n );\n lastConnection = connection;\n allConnections.push(connection);\n return connection;\n }\n async getWriteStream(\n args: { streamId: string; view?: number },\n options?: unknown,\n ) {\n // args[1] captures the gax CallOptions so tests can assert the deadline\n // is forwarded to the unary schema fetch.\n calls.push({ method: 'getWriteStream', args: [args, options] });\n // Minimal tableSchema shape consumed by adapt.convertStorageSchemaToProto2Descriptor\n return {\n tableSchema: { fields: [] },\n };\n }\n close(): void {\n calls.push({ method: 'WriterClient.close', args: [] });\n }\n}\n\nconst adapt = {\n convertStorageSchemaToProto2Descriptor: (_schema: unknown, _root: string) => {\n calls.push({\n method: 'adapt.convertStorageSchemaToProto2Descriptor',\n args: [_schema, _root],\n });\n return { name: 'root', field: [] };\n },\n};\n\nconst managedwriter = {\n WriterClient: MockWriterClient,\n JSONWriter: MockJSONWriter,\n DefaultStream: 'DEFAULT',\n};\n\nconst protos = {\n google: {\n cloud: {\n bigquery: {\n storage: {\n v1: {\n WriteStreamView: {\n WRITE_STREAM_VIEW_UNSPECIFIED: 0,\n BASIC: 1,\n FULL: 2,\n },\n },\n },\n },\n },\n },\n};\n\n// Test-only helper. Not part of the real SDK.\nfunction __getMockCalls() {\n return calls;\n}\n\nfunction __resetMockCalls() {\n calls.length = 0;\n nextAppendRowErrors = null;\n nextAppendThrow = null;\n nextGetResultReject = null;\n nextCreateStreamConnectionError = null;\n lastConnection = null;\n allConnections.length = 0;\n}\n\n/**\n * Test-only: the most recently created StreamConnection, so a test can emit an\n * out-of-band `'error'` on it (via `__emitConnectionError`) and assert the\n * destination attached a listener.\n */\nfunction __getLastConnection(): MockStreamConnection {\n if (!lastConnection) throw new Error('mock: no StreamConnection created yet');\n return lastConnection;\n}\n\n/**\n * Test-only: every StreamConnection created since the last reset, so a test can\n * assert that a concurrent re-open did not orphan a connection that still\n * carries an 'error' listener (a leak).\n */\nfunction __getAllConnections(): MockStreamConnection[] {\n return allConnections.slice();\n}\n\n/**\n * Test-only: queue rowErrors for the next appendRows().getResult() call.\n * Auto-resets after one use.\n */\nfunction __setNextAppendRowErrors(errors: MockRowError[]): void {\n nextAppendRowErrors = errors;\n}\n\n/**\n * Test-only: make the next appendRows() throw synchronously, simulating a\n * Storage Write API call failure. Auto-resets after one use.\n */\nfunction __setNextAppendThrow(err: unknown): void {\n nextAppendThrow = err;\n}\n\n/**\n * Test-only: make the next appendRows().getResult() reject, simulating a gRPC\n * deadline-exceeded (or any stream error) surfacing through the pending write.\n * Auto-resets after one use.\n */\nfunction __setNextGetResultReject(err: unknown): void {\n nextGetResultReject = err;\n}\n\n/**\n * Test-only: queue an error for the next createStreamConnection() call so\n * tests can simulate openWriter failures (NotFound, INVALID_ARGUMENT, etc.).\n * Auto-resets after one use.\n */\nfunction __setNextOpenWriterError(err: unknown): void {\n nextCreateStreamConnectionError = err;\n}\n\nexport {\n managedwriter,\n adapt,\n protos,\n MockStreamConnection,\n __getMockCalls,\n __resetMockCalls,\n __getLastConnection,\n __getAllConnections,\n __setNextAppendRowErrors,\n __setNextAppendThrow,\n __setNextGetResultReject,\n __setNextOpenWriterError,\n};\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { eventToRow } from '../eventToRow';\n\n/**\n * Mirror of push.ts via eventToRow() -- produces a flat 15-column row\n * with nested object/array values JSON-stringified. Imported directly\n * from the runtime helper so the step examples stay in sync with what\n * push.ts actually emits to JSONWriter.appendRows.\n */\nfunction expectedRow(event: WalkerOS.Event) {\n return eventToRow(event);\n}\n\n/**\n * Page view -- one row appended through JSONWriter.appendRows([row]).\n * Captured as a single intent-level call: ['appendRows', [row]].\n */\nconst pageViewEvent = getEvent('page view', {\n timestamp: 1700001100,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.',\n in: pageViewEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(pageViewEvent)]]],\n};\n\n/**\n * Purchase -- nested array in data.items is JSON.stringified into the\n * data column of the appended row.\n */\nconst purchaseEvent = getEvent('order complete', {\n timestamp: 1700001101,\n data: {\n id: 'ORD-500',\n total: 199.99,\n items: [{ sku: 'SKU-1', qty: 2 }],\n },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const purchase: Flow.StepExample = {\n title: 'Purchase',\n description:\n 'An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().',\n in: purchaseEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(purchaseEvent)]]],\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/** Row shape passed to JSONWriter.appendRows. Values are JSON-serializable scalars or strings. */\nexport interface BigQueryRow {\n [key: string]: string | number | null;\n name: string;\n data: string | null;\n context: string | null;\n globals: string | null;\n custom: string | null;\n user: string | null;\n nested: string | null;\n consent: string | null;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: string | null;\n}\n\nfunction jsonOrNull(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === 'object') {\n if (Array.isArray(value) && value.length === 0) return null;\n if (!Array.isArray(value) && Object.keys(value).length === 0) return null;\n return JSON.stringify(value);\n }\n return JSON.stringify(value);\n}\n\n/** Convert a walkerOS Event v4 into a 15-column BigQuery row in canonical order.\n *\n * Note: BQ Storage Write API encodes TIMESTAMP fields as INT64 microseconds\n * since epoch (the SDK calls Long.fromString on the value). ISO strings fail\n * with \"interior hyphen\" because Long.fromString sees the date hyphens as\n * non-numeric. Pass microseconds directly.\n */\nexport function eventToRow(event: WalkerOS.Event): BigQueryRow {\n return {\n name: event.name,\n data: jsonOrNull(event.data),\n context: jsonOrNull(event.context),\n globals: jsonOrNull(event.globals),\n custom: jsonOrNull(event.custom),\n user: jsonOrNull(event.user),\n nested: jsonOrNull(event.nested),\n consent: jsonOrNull(event.consent),\n id: event.id,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n timestamp: new Date(event.timestamp).getTime() * 1000, // microseconds since epoch\n timing: event.timing,\n source: jsonOrNull(event.source),\n };\n}\n","export * as env from './env';\nexport * as step from './step';\n","import type {\n Env,\n PubSubPublisher,\n PublishMessage,\n TopicPublisher,\n} from '../types';\n\n/**\n * Example environment for the GCP Pub/Sub destination.\n *\n * `push` is the mock env simulate injects: `PubSub` builds a client whose\n * topics answer `publishMessage` locally, so nothing reaches GCP. Unit tests\n * still substitute the SDK module-wide via `jest.mock('@google-cloud/pubsub')`.\n */\n\nclass MockTopic implements TopicPublisher {\n constructor(public name: string) {}\n publishMessage(_message: PublishMessage): Promise<string> {\n return Promise.resolve('mock-message-id');\n }\n resumePublishing(_orderingKey: string): void {}\n}\n\nclass MockPubSub implements PubSubPublisher {\n constructor(public options?: object) {}\n topic(name: string): TopicPublisher {\n return new MockTopic(name);\n }\n close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const push: Env = {\n PubSub: MockPubSub,\n};\n\n/** The publish carries the request; `args[0]` is the message. */\nexport const simulation = ['call:PubSub.topic.publishMessage'];\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\n// Build-time version define. The upstream collector stamps source.release with\n// this on push, so the expected payload must mirror it rather than a literal,\n// else it breaks whenever the fixed version group is bumped (release).\ndeclare const __VERSION__: string;\n\n/**\n * Pub/Sub step examples. Each example's `out` is the array of recorded mock\n * calls produced by `push()`. The recording shape is:\n * ['topic', topicName, topicOptions] // implicit topic-handle creation\n * ['publishMessage', topicName, messageOptions]\n * ['resumePublishing', topicName, orderingKey] // only on publish failure\n */\n\n// Events reaching a server destination arrive already enriched by the upstream\n// collector, so they carry the run trace and per-run count. The collector\n// preserves these (stamp-if-absent), keeping the example deterministic.\nconst orderEvent = getEvent('order complete', {\n timestamp: 1700001100,\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n user: { id: 'usr-789' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '1a2b3c4d5e6f70819a2b3c4d5e6f7081',\n count: 1,\n },\n});\n\nconst pageEvent = getEvent('page view', {\n timestamp: 1700001101,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '9f8e7d6c5b4a39281706f5e4d3c2b1a0',\n count: 1,\n },\n});\n\nfunction expectedPayload(event: WalkerOS.Event): Buffer {\n // The harness pushes the event through an unconfigured collector, which stamps\n // source.release = { [name ?? platform ?? 'default']: __VERSION__ }. With no\n // collector name, the key is the event's platform. Mirror that here so the\n // expected message body matches the published (post-collector) event.\n const releaseKey = event.source.platform ?? 'default';\n const stamped = {\n ...event,\n source: { ...event.source, release: { [releaseKey]: __VERSION__ } },\n };\n return Buffer.from(JSON.stringify(stamped));\n}\n\n/**\n * Default publish, no mapping. Settings.topic = 'events'. The destination\n * constructs a topic handle inline with messageOrdering=false (no ordering\n * key resolved) and publishes the full event JSON as the message body.\n */\nexport const defaultPush: Flow.StepExample = {\n title: 'Default publish',\n description:\n 'An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.',\n in: orderEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule topic override. Mapping carries `settings.topic = 'orders'`\n * which routes this rule to a dedicated topic.\n */\nexport const mappedTopic: Flow.StepExample = {\n title: 'Topic override',\n description:\n 'A mapping rule overrides the destination default topic so order events are published to a dedicated topic.',\n in: orderEvent,\n mapping: {\n settings: {\n topic: 'orders',\n },\n },\n out: [\n ['topic', 'orders', { messageOrdering: false }],\n ['publishMessage', 'orders', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule ordering key resolved from the event. `mapping.orderingKey =\n * 'user.id'` is a Mapping.Value that resolves to the event's user.id. The\n * topic handle is constructed with messageOrdering=true and the publish\n * carries the resolved orderingKey.\n */\nexport const mappedOrderingKey: Flow.StepExample = {\n title: 'Ordering key from user',\n description:\n 'A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.',\n in: orderEvent,\n mapping: {\n settings: {\n orderingKey: 'user.id',\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: true }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n orderingKey: 'usr-789',\n },\n ],\n ],\n};\n\n/**\n * Per-rule attributes. `mapping.attributes = { entity: 'entity', action:\n * 'action' }` is a Mapping.Map resolved per event. Each value is a path\n * resolved against the event.\n */\nexport const mappedAttributes: Flow.StepExample = {\n title: 'Mapped attributes',\n description:\n 'A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.',\n in: orderEvent,\n mapping: {\n settings: {\n attributes: {\n entity: 'entity',\n action: 'action',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n attributes: { entity: 'order', action: 'complete' },\n },\n ],\n ],\n};\n\n/**\n * Mapped data. `mapping.data` rewrites the publish body. The rewritten\n * object replaces the event as the message data.\n */\nexport const mappedData: Flow.StepExample = {\n title: 'Mapped payload',\n description:\n 'A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.',\n in: orderEvent,\n mapping: {\n data: {\n map: {\n order_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n // Mapped-data publish: the body is the mapping result (no event\n // envelope, so no source.release), emitted verbatim.\n data: Buffer.from(\n JSON.stringify({\n order_id: 'ORD-500',\n revenue: 199.99,\n currency: 'EUR',\n }),\n ),\n },\n ],\n ],\n};\n\n/**\n * Page view, no rule. Verifies free-form publish on a non-ordered topic\n * for an event with no special mapping.\n */\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.',\n in: pageEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(pageEvent) }],\n ],\n};\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n datasetId: z\n .string()\n .min(1)\n .default('walkerOS')\n .describe(\n 'BigQuery dataset ID where events will be stored (like walker_events)',\n ),\n tableId: z\n .string()\n .min(1)\n .default('events')\n .describe('BigQuery table ID for event storage (like events)'),\n location: z\n .string()\n .default('EU')\n .describe('Geographic location for the BigQuery dataset (like US)'),\n bigquery: z\n .any()\n .describe(\n 'Additional BigQuery client configuration options (like { keyFilename: \"path/to/key.json\" })',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP BigQuery Mapping Schema\n * BigQuery has no event-level mapping configuration\n */\nexport const MappingSchema = z.object({});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n topic: z\n .string()\n .min(1)\n .describe(\n 'Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK.',\n ),\n credentials: z\n .any()\n .describe(\n 'Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)',\n )\n .optional(),\n apiEndpoint: z\n .string()\n .describe(\n 'Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Mapping value resolved per-event. Truthy enables per-key ordering for the publish.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Default per-event attribute map merged into every published message. Mapping.Map shape.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Mapping Schema\n *\n * Per-rule overrides for topic, orderingKey, and attributes.\n */\nexport const MappingSchema = z.object({\n topic: z\n .string()\n .describe(\n 'Per-rule topic override. Falls back to settings.topic if absent.',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Per-rule attribute Mapping.Map merged on top of settings.attributes.',\n )\n .optional(),\n});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Setup Schema\n *\n * Provisioning options for `walkeros setup destination.<id>`. Idempotent topic\n * creation. Subscription provisioning is owned by the source side.\n */\nexport const SetupSchema = z.object({\n messageStoragePolicy: z\n .object({\n allowedPersistenceRegions: z\n .array(z.string())\n .describe(\n 'Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).',\n ),\n })\n .describe('Topic-level message storage policy.')\n .optional(),\n messageRetentionDuration: z\n .object({\n seconds: z\n .number()\n .describe('Retention window in seconds. Default: project default.'),\n })\n .describe('Topic-level retention configuration.')\n .optional(),\n kmsKeyName: z\n .string()\n .describe('Customer-managed encryption key (CMEK) resource name. Optional.')\n .optional(),\n labels: z\n .record(z.string(), z.string())\n .describe('Topic labels for organization and billing.')\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","// Browser-safe schema-only exports\n// This file exports ONLY schemas without any Node.js dependencies\nexport { settings, mapping } from './bigquery/schemas';\nexport {\n settings as pubsubSettings,\n mapping as pubsubMapping,\n setup as pubsubSetup,\n} from './pubsub/schemas';\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'auth-methods': {\n text: 'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: \"./sa.json\" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\", \"bigquery\": { \"keyFilename\": \"./sa.json\" } } }',\n },\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\" } }',\n },\n ],\n },\n 'storage-format': {\n text: 'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset \"walkeros\", table \"events\", location \"EU\" — all overridable via settings.',\n },\n 'query-json-columns': {\n text: 'Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.',\n code: [\n {\n lang: 'sql',\n code: \"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'\",\n },\n ],\n },\n 'troubleshoot-empty-table': {\n text: \"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK.\",\n },\n};\n"],"mappings":"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","names":["examples_exports","examples_exports","env_exports","step_exports","env_exports","push","simulation","step_exports","pageView","import_core","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","MappingSchema","import_dev","settings","SettingsSchema","mapping","MappingSchema","mapping","settings","examples_exports","settings","mapping"]}
1
+ {"version":3,"sources":["../src/dev.ts","../src/bigquery/examples/index.ts","../src/bigquery/examples/env.ts","../src/bigquery/__mocks__/@google-cloud/bigquery-storage.ts","../src/bigquery/examples/step.ts","../src/bigquery/eventToRow.ts","../src/pubsub/examples/index.ts","../src/pubsub/examples/env.ts","../src/pubsub/examples/step.ts","../src/bigquery/schemas/index.ts","../src/bigquery/schemas/settings.ts","../src/bigquery/schemas/mapping.ts","../src/pubsub/schemas/index.ts","../src/pubsub/schemas/settings.ts","../src/pubsub/schemas/mapping.ts","../src/pubsub/schemas/setup.ts","../src/schemas.ts","../src/hints.ts"],"sourcesContent":["import * as bigqueryExamplesNs from './bigquery/examples';\nimport * as pubsubExamplesNs from './pubsub/examples';\nimport * as bigquerySchemasNs from './bigquery/schemas';\nimport * as pubsubSchemasNs from './pubsub/schemas';\n\nexport * as schemas from './schemas';\nexport * as examples from './bigquery/examples';\nexport * as pubsubExamples from './pubsub/examples';\nexport { hints } from './hints';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n destinationBigQuery: bigqueryExamplesNs,\n destinationPubSub: pubsubExamplesNs,\n};\n\n/** Schemas per export, keyed by the export names in package.json. */\nexport const exportSchemas = {\n destinationBigQuery: {\n settings: bigquerySchemasNs.settings,\n mapping: bigquerySchemasNs.mapping,\n },\n destinationPubSub: {\n settings: pubsubSchemasNs.settings,\n mapping: pubsubSchemasNs.mapping,\n setup: pubsubSchemasNs.setup,\n },\n};\n","export * as env from './env';\nexport * as step from './step';\n","import type { Env, QueryClient, TableMetadataShape } from '../types';\nimport {\n managedwriter as mockManagedwriter,\n adapt as mockAdapt,\n} from '../__mocks__/@google-cloud/bigquery-storage';\n\n/**\n * Example environment configurations for GCP BigQuery destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual BigQuery SDK dependencies.\n *\n * The Storage Write API mocks (WriterClient, JSONWriter, adapt) are\n * re-exported from the package-local __mocks__ folder so example/test\n * code shares a single source of truth with the jest auto-mock.\n */\n\n/**\n * Mock BigQuery query client: dataset and table provisioning calls resolve as\n * if both already exist.\n */\nfunction createMockBigQuery() {\n return class MockBigQuery implements QueryClient {\n calls: Array<{ method: string; args: unknown[] }>;\n options: unknown;\n\n constructor(options?: unknown) {\n this.options = options;\n this.calls = [];\n }\n\n dataset(datasetId: string) {\n this.calls.push({ method: 'dataset', args: [datasetId] });\n return this;\n }\n\n table(tableId: string) {\n this.calls.push({ method: 'table', args: [tableId] });\n return this;\n }\n\n async exists(): Promise<[boolean]> {\n this.calls.push({ method: 'exists', args: [] });\n return [true];\n }\n\n async create(options: unknown): Promise<void> {\n this.calls.push({ method: 'create', args: [options] });\n }\n\n async getMetadata(): Promise<[TableMetadataShape]> {\n this.calls.push({ method: 'getMetadata', args: [] });\n return [{}];\n }\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing BigQuery Storage Write appends without connecting\n * to actual GCP infrastructure.\n */\nexport const push: Env = {\n get BigQuery() {\n return createMockBigQuery();\n },\n get WriterClient() {\n return mockManagedwriter.WriterClient;\n },\n get JSONWriter() {\n return mockManagedwriter.JSONWriter;\n },\n get adapt() {\n return mockAdapt;\n },\n};\n\n/**\n * Every row goes through the writer's `appendRows`; the writer is built from\n * `JSONWriter` in init, so the path continues on the constructed instance.\n * Constructors are not recorded: their arguments carry credentials.\n */\nexport const simulation = ['call:JSONWriter.appendRows'];\n","import { EventEmitter } from 'events';\n\nconst calls: Array<{ method: string; args: unknown[] }> = [];\n\ninterface MockRowError {\n index: number;\n code: number;\n message: string;\n}\n\nlet nextAppendRowErrors: MockRowError[] | null = null;\nlet nextAppendThrow: unknown = null;\nlet nextGetResultReject: unknown = null;\nlet nextCreateStreamConnectionError: unknown = null;\n\n/**\n * Honest stand-in for the SDK's StreamConnection: a REAL Node EventEmitter so\n * `emit('error', …)` with no listener throws exactly like the real one (Node's\n * special-cased `'error'` event). `onConnectionError` mirrors the SDK surface:\n * it registers an `'error'` listener and returns an `{ off }` disposable.\n */\nclass MockStreamConnection extends EventEmitter {\n private readonly streamId: string;\n constructor(streamId: string) {\n super();\n this.streamId = streamId;\n }\n getStreamId(): string {\n return this.streamId;\n }\n onConnectionError(listener: (err: unknown) => void): { off: () => void } {\n calls.push({ method: 'onConnectionError', args: [] });\n this.on('error', listener);\n return {\n off: () => {\n this.off('error', listener);\n },\n };\n }\n /**\n * Test-only: literally `this.emit('error', err)` with NO internal\n * listener-count guard, so before a listener is attached this reproduces\n * Node's real \"throw if no 'error' listener\" behavior. A fake that silently\n * swallowed would mask the very crash this listener exists to contain.\n */\n __emitConnectionError(err: unknown): void {\n this.emit('error', err);\n }\n}\n\n// The most recently created connection, so tests can emit on it and assert the\n// listener was registered.\nlet lastConnection: MockStreamConnection | null = null;\n\n// Every connection ever created (this reset cycle), so tests can assert that a\n// concurrent re-open did not orphan a connection still carrying an 'error'\n// listener.\nconst allConnections: MockStreamConnection[] = [];\n\nclass MockJSONWriter {\n constructor(_args: { connection: unknown; protoDescriptor: unknown }) {\n calls.push({ method: 'JSONWriter.ctor', args: [_args] });\n }\n appendRows(rows: unknown[], offsetValue?: unknown) {\n calls.push({ method: 'appendRows', args: [rows, offsetValue] });\n const queuedThrow = nextAppendThrow;\n if (queuedThrow !== null) {\n nextAppendThrow = null;\n throw queuedThrow;\n }\n const queuedErrors = nextAppendRowErrors;\n nextAppendRowErrors = null;\n const queuedReject = nextGetResultReject;\n nextGetResultReject = null;\n return {\n getResult: async () => {\n // Models a gRPC deadline-exceeded (or any stream error): the append is\n // accepted but getResult() rejects when the stream's deadline fires.\n if (queuedReject !== null) throw queuedReject;\n return {\n appendResult: { offset: { value: '0' } },\n rowErrors: queuedErrors ?? [],\n writeStream: 'projects/p/datasets/d/tables/t/streams/_default',\n };\n },\n };\n }\n close(): void {\n calls.push({ method: 'JSONWriter.close', args: [] });\n }\n}\n\nclass MockWriterClient {\n constructor(args: {\n projectId?: string;\n keyFilename?: string;\n credentials?: unknown;\n scopes?: string | string[];\n }) {\n calls.push({ method: 'WriterClient.ctor', args: [args] });\n }\n async createStreamConnection(\n args: {\n destinationTable: string;\n streamId: string;\n },\n options?: unknown,\n ) {\n // Match the real SDK: callers must pass streamId=DefaultStream (not streamType)\n // for default-stream use. Passing streamType triggers a CreateWriteStream\n // call with type='DEFAULT', which BQ rejects as TYPE_UNSPECIFIED.\n if (args.streamId !== 'DEFAULT') {\n throw new Error(\n `mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(args)}`,\n );\n }\n // args[1] captures the gax CallOptions (e.g. { timeout }) so tests can\n // assert the request deadline is forwarded to the appendRows stream.\n calls.push({ method: 'createStreamConnection', args: [args, options] });\n const queuedError = nextCreateStreamConnectionError;\n if (queuedError !== null) {\n nextCreateStreamConnectionError = null;\n throw queuedError;\n }\n const connection = new MockStreamConnection(\n `${args.destinationTable}/streams/_default`,\n );\n lastConnection = connection;\n allConnections.push(connection);\n return connection;\n }\n async getWriteStream(\n args: { streamId: string; view?: number },\n options?: unknown,\n ) {\n // args[1] captures the gax CallOptions so tests can assert the deadline\n // is forwarded to the unary schema fetch.\n calls.push({ method: 'getWriteStream', args: [args, options] });\n // Minimal tableSchema shape consumed by adapt.convertStorageSchemaToProto2Descriptor\n return {\n tableSchema: { fields: [] },\n };\n }\n close(): void {\n calls.push({ method: 'WriterClient.close', args: [] });\n }\n}\n\nconst adapt = {\n convertStorageSchemaToProto2Descriptor: (_schema: unknown, _root: string) => {\n calls.push({\n method: 'adapt.convertStorageSchemaToProto2Descriptor',\n args: [_schema, _root],\n });\n return { name: 'root', field: [] };\n },\n};\n\nconst managedwriter = {\n WriterClient: MockWriterClient,\n JSONWriter: MockJSONWriter,\n DefaultStream: 'DEFAULT',\n};\n\nconst protos = {\n google: {\n cloud: {\n bigquery: {\n storage: {\n v1: {\n WriteStreamView: {\n WRITE_STREAM_VIEW_UNSPECIFIED: 0,\n BASIC: 1,\n FULL: 2,\n },\n },\n },\n },\n },\n },\n};\n\n// Test-only helper. Not part of the real SDK.\nfunction __getMockCalls() {\n return calls;\n}\n\nfunction __resetMockCalls() {\n calls.length = 0;\n nextAppendRowErrors = null;\n nextAppendThrow = null;\n nextGetResultReject = null;\n nextCreateStreamConnectionError = null;\n lastConnection = null;\n allConnections.length = 0;\n}\n\n/**\n * Test-only: the most recently created StreamConnection, so a test can emit an\n * out-of-band `'error'` on it (via `__emitConnectionError`) and assert the\n * destination attached a listener.\n */\nfunction __getLastConnection(): MockStreamConnection {\n if (!lastConnection) throw new Error('mock: no StreamConnection created yet');\n return lastConnection;\n}\n\n/**\n * Test-only: every StreamConnection created since the last reset, so a test can\n * assert that a concurrent re-open did not orphan a connection that still\n * carries an 'error' listener (a leak).\n */\nfunction __getAllConnections(): MockStreamConnection[] {\n return allConnections.slice();\n}\n\n/**\n * Test-only: queue rowErrors for the next appendRows().getResult() call.\n * Auto-resets after one use.\n */\nfunction __setNextAppendRowErrors(errors: MockRowError[]): void {\n nextAppendRowErrors = errors;\n}\n\n/**\n * Test-only: make the next appendRows() throw synchronously, simulating a\n * Storage Write API call failure. Auto-resets after one use.\n */\nfunction __setNextAppendThrow(err: unknown): void {\n nextAppendThrow = err;\n}\n\n/**\n * Test-only: make the next appendRows().getResult() reject, simulating a gRPC\n * deadline-exceeded (or any stream error) surfacing through the pending write.\n * Auto-resets after one use.\n */\nfunction __setNextGetResultReject(err: unknown): void {\n nextGetResultReject = err;\n}\n\n/**\n * Test-only: queue an error for the next createStreamConnection() call so\n * tests can simulate openWriter failures (NotFound, INVALID_ARGUMENT, etc.).\n * Auto-resets after one use.\n */\nfunction __setNextOpenWriterError(err: unknown): void {\n nextCreateStreamConnectionError = err;\n}\n\nexport {\n managedwriter,\n adapt,\n protos,\n MockStreamConnection,\n __getMockCalls,\n __resetMockCalls,\n __getLastConnection,\n __getAllConnections,\n __setNextAppendRowErrors,\n __setNextAppendThrow,\n __setNextGetResultReject,\n __setNextOpenWriterError,\n};\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { eventToRow } from '../eventToRow';\n\n/**\n * Mirror of push.ts via eventToRow() -- produces a flat 15-column row\n * with nested object/array values JSON-stringified. Imported directly\n * from the runtime helper so the step examples stay in sync with what\n * push.ts actually emits to JSONWriter.appendRows.\n */\nfunction expectedRow(event: WalkerOS.Event) {\n return eventToRow(event);\n}\n\n/**\n * Page view -- one row appended through JSONWriter.appendRows([row]).\n * Captured as a single intent-level call: ['appendRows', [row]].\n */\nconst pageViewEvent = getEvent('page view', {\n timestamp: 1700001100,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.',\n in: pageViewEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(pageViewEvent)]]],\n};\n\n/**\n * Purchase -- nested array in data.items is JSON.stringified into the\n * data column of the appended row.\n */\nconst purchaseEvent = getEvent('order complete', {\n timestamp: 1700001101,\n data: {\n id: 'ORD-500',\n total: 199.99,\n items: [{ sku: 'SKU-1', qty: 2 }],\n },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const purchase: Flow.StepExample = {\n title: 'Purchase',\n description:\n 'An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().',\n in: purchaseEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(purchaseEvent)]]],\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/** Row shape passed to JSONWriter.appendRows. Values are JSON-serializable scalars or strings. */\nexport interface BigQueryRow {\n [key: string]: string | number | null;\n name: string;\n data: string | null;\n context: string | null;\n globals: string | null;\n custom: string | null;\n user: string | null;\n nested: string | null;\n consent: string | null;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: string | null;\n}\n\nfunction jsonOrNull(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === 'object') {\n if (Array.isArray(value) && value.length === 0) return null;\n if (!Array.isArray(value) && Object.keys(value).length === 0) return null;\n return JSON.stringify(value);\n }\n return JSON.stringify(value);\n}\n\n/** Convert a walkerOS Event v4 into a 15-column BigQuery row in canonical order.\n *\n * Note: BQ Storage Write API encodes TIMESTAMP fields as INT64 microseconds\n * since epoch (the SDK calls Long.fromString on the value). ISO strings fail\n * with \"interior hyphen\" because Long.fromString sees the date hyphens as\n * non-numeric. Pass microseconds directly.\n */\nexport function eventToRow(event: WalkerOS.Event): BigQueryRow {\n return {\n name: event.name,\n data: jsonOrNull(event.data),\n context: jsonOrNull(event.context),\n globals: jsonOrNull(event.globals),\n custom: jsonOrNull(event.custom),\n user: jsonOrNull(event.user),\n nested: jsonOrNull(event.nested),\n consent: jsonOrNull(event.consent),\n id: event.id,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n timestamp: new Date(event.timestamp).getTime() * 1000, // microseconds since epoch\n timing: event.timing,\n source: jsonOrNull(event.source),\n };\n}\n","export * as env from './env';\nexport * as step from './step';\n","import type {\n Env,\n PubSubPublisher,\n PublishMessage,\n TopicPublisher,\n} from '../types';\n\n/**\n * Example environment for the GCP Pub/Sub destination.\n *\n * `push` is the mock env simulate injects: `PubSub` builds a client whose\n * topics answer `publishMessage` locally, so nothing reaches GCP. Unit tests\n * still substitute the SDK module-wide via `jest.mock('@google-cloud/pubsub')`.\n */\n\nclass MockTopic implements TopicPublisher {\n constructor(public name: string) {}\n publishMessage(_message: PublishMessage): Promise<string> {\n return Promise.resolve('mock-message-id');\n }\n resumePublishing(_orderingKey: string): void {}\n}\n\nclass MockPubSub implements PubSubPublisher {\n constructor(public options?: object) {}\n topic(name: string): TopicPublisher {\n return new MockTopic(name);\n }\n close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const push: Env = {\n PubSub: MockPubSub,\n};\n\n/** The publish carries the request; `args[0]` is the message. */\nexport const simulation = ['call:PubSub.topic.publishMessage'];\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\n// Build-time version define. The upstream collector stamps source.release with\n// this on push, so the expected payload must mirror it rather than a literal,\n// else it breaks whenever the fixed version group is bumped (release).\ndeclare const __VERSION__: string;\n\n/**\n * Pub/Sub step examples. Each example's `out` is the array of recorded mock\n * calls produced by `push()`. The recording shape is:\n * ['topic', topicName, topicOptions] // implicit topic-handle creation\n * ['publishMessage', topicName, messageOptions]\n * ['resumePublishing', topicName, orderingKey] // only on publish failure\n */\n\n// Events reaching a server destination arrive already enriched by the upstream\n// collector, so they carry the run trace and per-run count. The collector\n// preserves these (stamp-if-absent), keeping the example deterministic.\nconst orderEvent = getEvent('order complete', {\n timestamp: 1700001100,\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n user: { id: 'usr-789' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '1a2b3c4d5e6f70819a2b3c4d5e6f7081',\n count: 1,\n },\n});\n\nconst pageEvent = getEvent('page view', {\n timestamp: 1700001101,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '9f8e7d6c5b4a39281706f5e4d3c2b1a0',\n count: 1,\n },\n});\n\nfunction expectedPayload(event: WalkerOS.Event): Buffer {\n // The harness pushes the event through an unconfigured collector, which stamps\n // source.release = { [name ?? platform ?? 'default']: __VERSION__ }. With no\n // collector name, the key is the event's platform. Mirror that here so the\n // expected message body matches the published (post-collector) event.\n const releaseKey = event.source.platform ?? 'default';\n const stamped = {\n ...event,\n source: { ...event.source, release: { [releaseKey]: __VERSION__ } },\n };\n return Buffer.from(JSON.stringify(stamped));\n}\n\n/**\n * Default publish, no mapping. Settings.topic = 'events'. The destination\n * constructs a topic handle inline with messageOrdering=false (no ordering\n * key resolved) and publishes the full event JSON as the message body.\n */\nexport const defaultPush: Flow.StepExample = {\n title: 'Default publish',\n description:\n 'An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.',\n in: orderEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule topic override. Mapping carries `settings.topic = 'orders'`\n * which routes this rule to a dedicated topic.\n */\nexport const mappedTopic: Flow.StepExample = {\n title: 'Topic override',\n description:\n 'A mapping rule overrides the destination default topic so order events are published to a dedicated topic.',\n in: orderEvent,\n mapping: {\n settings: {\n topic: 'orders',\n },\n },\n out: [\n ['topic', 'orders', { messageOrdering: false }],\n ['publishMessage', 'orders', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule ordering key resolved from the event. `mapping.orderingKey =\n * 'user.id'` is a Mapping.Value that resolves to the event's user.id. The\n * topic handle is constructed with messageOrdering=true and the publish\n * carries the resolved orderingKey.\n */\nexport const mappedOrderingKey: Flow.StepExample = {\n title: 'Ordering key from user',\n description:\n 'A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.',\n in: orderEvent,\n mapping: {\n settings: {\n orderingKey: 'user.id',\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: true }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n orderingKey: 'usr-789',\n },\n ],\n ],\n};\n\n/**\n * Per-rule attributes. `mapping.attributes = { entity: 'entity', action:\n * 'action' }` is a Mapping.Map resolved per event. Each value is a path\n * resolved against the event.\n */\nexport const mappedAttributes: Flow.StepExample = {\n title: 'Mapped attributes',\n description:\n 'A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.',\n in: orderEvent,\n mapping: {\n settings: {\n attributes: {\n entity: 'entity',\n action: 'action',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n attributes: { entity: 'order', action: 'complete' },\n },\n ],\n ],\n};\n\n/**\n * Mapped data. `mapping.data` rewrites the publish body. The rewritten\n * object replaces the event as the message data.\n */\nexport const mappedData: Flow.StepExample = {\n title: 'Mapped payload',\n description:\n 'A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.',\n in: orderEvent,\n mapping: {\n data: {\n map: {\n order_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n // Mapped-data publish: the body is the mapping result (no event\n // envelope, so no source.release), emitted verbatim.\n data: Buffer.from(\n JSON.stringify({\n order_id: 'ORD-500',\n revenue: 199.99,\n currency: 'EUR',\n }),\n ),\n },\n ],\n ],\n};\n\n/**\n * Page view, no rule. Verifies free-form publish on a non-ordered topic\n * for an event with no special mapping.\n */\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.',\n in: pageEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(pageEvent) }],\n ],\n};\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n datasetId: z\n .string()\n .min(1)\n .default('walkerOS')\n .describe(\n 'BigQuery dataset ID where events will be stored (like walker_events)',\n ),\n tableId: z\n .string()\n .min(1)\n .default('events')\n .describe('BigQuery table ID for event storage (like events)'),\n location: z\n .string()\n .default('EU')\n .describe('Geographic location for the BigQuery dataset (like US)'),\n bigquery: z\n .any()\n .describe(\n 'Additional BigQuery client configuration options (like { keyFilename: \"path/to/key.json\" })',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP BigQuery Mapping Schema\n * BigQuery has no event-level mapping configuration\n */\nexport const MappingSchema = z.object({});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n topic: z\n .string()\n .min(1)\n .describe(\n 'Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK.',\n ),\n credentials: z\n .any()\n .describe(\n 'Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)',\n )\n .optional(),\n apiEndpoint: z\n .string()\n .describe(\n 'Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Mapping value resolved per-event. Truthy enables per-key ordering for the publish.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Default per-event attribute map merged into every published message. Mapping.Map shape.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Mapping Schema\n *\n * Per-rule overrides for topic, orderingKey, and attributes.\n */\nexport const MappingSchema = z.object({\n topic: z\n .string()\n .describe(\n 'Per-rule topic override. Falls back to settings.topic if absent.',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Per-rule attribute Mapping.Map merged on top of settings.attributes.',\n )\n .optional(),\n});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Setup Schema\n *\n * Provisioning options for `walkeros setup destination.<id>`. Idempotent topic\n * creation. Subscription provisioning is owned by the source side.\n */\nexport const SetupSchema = z.object({\n messageStoragePolicy: z\n .object({\n allowedPersistenceRegions: z\n .array(z.string())\n .describe(\n 'Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).',\n ),\n })\n .describe('Topic-level message storage policy.')\n .optional(),\n messageRetentionDuration: z\n .object({\n seconds: z\n .number()\n .describe('Retention window in seconds. Default: project default.'),\n })\n .describe('Topic-level retention configuration.')\n .optional(),\n kmsKeyName: z\n .string()\n .describe('Customer-managed encryption key (CMEK) resource name. Optional.')\n .optional(),\n labels: z\n .record(z.string(), z.string())\n .describe('Topic labels for organization and billing.')\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","// Browser-safe schema-only exports\n// This file exports ONLY schemas without any Node.js dependencies\nexport { settings, mapping } from './bigquery/schemas';\nexport {\n settings as pubsubSettings,\n mapping as pubsubMapping,\n setup as pubsubSetup,\n} from './pubsub/schemas';\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'auth-methods': {\n text: 'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: \"./sa.json\" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\", \"bigquery\": { \"keyFilename\": \"./sa.json\" } } }',\n },\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\" } }',\n },\n ],\n },\n 'storage-format': {\n text: 'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset \"walkeros\", table \"events\", location \"EU\" — all overridable via settings.',\n },\n 'query-json-columns': {\n text: 'Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.',\n code: [\n {\n lang: 'sql',\n code: \"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'\",\n },\n ],\n },\n 'troubleshoot-empty-table': {\n text: \"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK.\",\n },\n};\n"],"mappings":"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","names":["examples_exports","examples_exports","env_exports","step_exports","env_exports","push","simulation","step_exports","pageView","import_core","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","MappingSchema","import_dev","settings","SettingsSchema","mapping","MappingSchema","mapping","settings","examples_exports","settings","mapping"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,r)=>{for(var s in r)e(t,s,{get:r[s],enumerable:!0})},r={};t(r,{env:()=>s,step:()=>y});var s={};t(s,{push:()=>b,simulation:()=>h});import{EventEmitter as i}from"events";var o=[],a=null,n=null,l=null,c=null,p=class extends i{streamId;constructor(e){super(),this.streamId=e}getStreamId(){return this.streamId}onConnectionError(e){return o.push({method:"onConnectionError",args:[]}),this.on("error",e),{off:()=>{this.off("error",e)}}}__emitConnectionError(e){this.emit("error",e)}},d=[],u={convertStorageSchemaToProto2Descriptor:(e,t)=>(o.push({method:"adapt.convertStorageSchemaToProto2Descriptor",args:[e,t]}),{name:"root",field:[]})},g=class{constructor(e){o.push({method:"WriterClient.ctor",args:[e]})}async createStreamConnection(e,t){if("DEFAULT"!==e.streamId)throw new Error(`mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(e)}`);o.push({method:"createStreamConnection",args:[e,t]});const r=c;if(null!==r)throw c=null,r;const s=new p(`${e.destinationTable}/streams/_default`);return d.push(s),s}async getWriteStream(e,t){return o.push({method:"getWriteStream",args:[e,t]}),{tableSchema:{fields:[]}}}close(){o.push({method:"WriterClient.close",args:[]})}},m=class{constructor(e){o.push({method:"JSONWriter.ctor",args:[e]})}appendRows(e,t){o.push({method:"appendRows",args:[e,t]});const r=n;if(null!==r)throw n=null,r;const s=a;a=null;const i=l;return l=null,{getResult:async()=>{if(null!==i)throw i;return{appendResult:{offset:{value:"0"}},rowErrors:s??[],writeStream:"projects/p/datasets/d/tables/t/streams/_default"}}}}close(){o.push({method:"JSONWriter.close",args:[]})}};var b={get BigQuery(){return class{calls;options;constructor(e){this.options=e,this.calls=[]}dataset(e){return this.calls.push({method:"dataset",args:[e]}),this}table(e){return this.calls.push({method:"table",args:[e]}),this}async exists(){return this.calls.push({method:"exists",args:[]}),[!0]}async create(e){this.calls.push({method:"create",args:[e]})}async getMetadata(){return this.calls.push({method:"getMetadata",args:[]}),[{}]}}},get WriterClient(){return g},get JSONWriter(){return m},get adapt(){return u}},h=["call:JSONWriter.appendRows"],y={};t(y,{pageView:()=>k,purchase:()=>O});import{getEvent as f}from"@walkeros/core";function v(e){return null==e?null:"object"==typeof e?Array.isArray(e)&&0===e.length?null:Array.isArray(e)||0!==Object.keys(e).length?JSON.stringify(e):null:JSON.stringify(e)}function S(e){return function(e){return{name:e.name,data:v(e.data),context:v(e.context),globals:v(e.globals),custom:v(e.custom),user:v(e.user),nested:v(e.nested),consent:v(e.consent),id:e.id,trigger:e.trigger,entity:e.entity,action:e.action,timestamp:1e3*new Date(e.timestamp).getTime(),timing:e.timing,source:v(e.source)}}(e)}var w=f("page view",{timestamp:1700001100,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server"}}),k={title:"Page view",description:"A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.",in:w,mapping:void 0,out:[["appendRows",[S(w)]]]},j=f("order complete",{timestamp:1700001101,data:{id:"ORD-500",total:199.99,items:[{sku:"SKU-1",qty:2}]},source:{type:"express",platform:"server"}}),O={title:"Purchase",description:"An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().",in:j,mapping:void 0,out:[["appendRows",[S(j)]]]},P={};t(P,{env:()=>A,step:()=>E});var A={};t(A,{push:()=>D,simulation:()=>I});var C=class{constructor(e){this.name=e}name;publishMessage(e){return Promise.resolve("mock-message-id")}resumePublishing(e){}},D={PubSub:class{constructor(e){this.options=e}options;topic(e){return new C(e)}close(){return Promise.resolve()}}},I=["call:PubSub.topic.publishMessage"],E={};t(E,{defaultPush:()=>M,mappedAttributes:()=>Q,mappedData:()=>W,mappedOrderingKey:()=>B,mappedTopic:()=>J,pageView:()=>_});import{getEvent as R}from"@walkeros/core";var T=R("order complete",{timestamp:1700001100,data:{id:"ORD-500",total:199.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server",trace:"1a2b3c4d5e6f70819a2b3c4d5e6f7081",count:1}}),x=R("page view",{timestamp:1700001101,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server",trace:"9f8e7d6c5b4a39281706f5e4d3c2b1a0",count:1}});function N(e){const t=e.source.platform??"default",r={...e,source:{...e.source,release:{[t]:"4.7.2-next-1791147139360"}}};return Buffer.from(JSON.stringify(r))}var M={title:"Default publish",description:"An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.",in:T,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:N(T)}]]},J={title:"Topic override",description:"A mapping rule overrides the destination default topic so order events are published to a dedicated topic.",in:T,mapping:{settings:{topic:"orders"}},out:[["topic","orders",{messageOrdering:!1}],["publishMessage","orders",{data:N(T)}]]},B={title:"Ordering key from user",description:"A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.",in:T,mapping:{settings:{orderingKey:"user.id"}},out:[["topic","events",{messageOrdering:!0}],["publishMessage","events",{data:N(T),orderingKey:"usr-789"}]]},Q={title:"Mapped attributes",description:"A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.",in:T,mapping:{settings:{attributes:{entity:"entity",action:"action"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:N(T),attributes:{entity:"order",action:"complete"}}]]},W={title:"Mapped payload",description:"A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.",in:T,mapping:{data:{map:{order_id:"data.id",revenue:"data.total",currency:"data.currency"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:Buffer.from(JSON.stringify({order_id:"ORD-500",revenue:199.99,currency:"EUR"}))}]]},_={title:"Page view",description:"A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.",in:x,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:N(x)}]]};import{zodToSchema as K}from"@walkeros/core/dev";import{z as U}from"@walkeros/core/dev";var q=U.object({client:U.any().describe("Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))").optional(),projectId:U.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),datasetId:U.string().min(1).default("walkerOS").describe("BigQuery dataset ID where events will be stored (like walker_events)"),tableId:U.string().min(1).default("events").describe("BigQuery table ID for event storage (like events)"),location:U.string().default("EU").describe("Geographic location for the BigQuery dataset (like US)"),bigquery:U.any().describe('Additional BigQuery client configuration options (like { keyFilename: "path/to/key.json" })').optional()});import{z as F}from"@walkeros/core/dev";var G=F.object({}),z=K(q),L=K(G);import{zodToSchema as V}from"@walkeros/core/dev";import{z as $}from"@walkeros/core/dev";var X=$.object({client:$.any().describe("Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))").optional(),projectId:$.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),topic:$.string().min(1).describe("Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK."),credentials:$.any().describe("Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)").optional(),apiEndpoint:$.string().describe("Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).").optional(),orderingKey:$.any().describe("Mapping value resolved per-event. Truthy enables per-key ordering for the publish.").optional(),attributes:$.any().describe("Default per-event attribute map merged into every published message. Mapping.Map shape.").optional()});import{z as H}from"@walkeros/core/dev";var Y=H.object({topic:H.string().describe("Per-rule topic override. Falls back to settings.topic if absent.").optional(),orderingKey:H.any().describe("Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.").optional(),attributes:H.any().describe("Per-rule attribute Mapping.Map merged on top of settings.attributes.").optional()});import{z as Z}from"@walkeros/core/dev";var ee=Z.object({messageStoragePolicy:Z.object({allowedPersistenceRegions:Z.array(Z.string()).describe("Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).")}).describe("Topic-level message storage policy.").optional(),messageRetentionDuration:Z.object({seconds:Z.number().describe("Retention window in seconds. Default: project default.")}).describe("Topic-level retention configuration.").optional(),kmsKeyName:Z.string().describe("Customer-managed encryption key (CMEK) resource name. Optional.").optional(),labels:Z.record(Z.string(),Z.string()).describe("Topic labels for organization and billing.").optional()}),te=V(X),re=V(Y),se=V(ee),ie={};t(ie,{mapping:()=>L,pubsubMapping:()=>re,pubsubSettings:()=>te,pubsubSetup:()=>se,settings:()=>z});var oe={"auth-methods":{text:'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: "./sa.json" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',code:[{lang:"json",code:'{ "settings": { "projectId": "my-project", "bigquery": { "keyFilename": "./sa.json" } } }'},{lang:"json",code:'{ "settings": { "projectId": "my-project" } }'}]},"storage-format":{text:'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset "walkeros", table "events", location "EU" — all overridable via settings.'},"query-json-columns":{text:"Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.",code:[{lang:"sql",code:"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'"}]},"troubleshoot-empty-table":{text:"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK."}},ae={destinationBigQuery:r,destinationPubSub:P},ne={destinationBigQuery:{settings:z,mapping:L},destinationPubSub:{settings:te,mapping:re,setup:se}};export{r as examples,ae as exportExamples,ne as exportSchemas,oe as hints,P as pubsubExamples,ie as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,r)=>{for(var s in r)e(t,s,{get:r[s],enumerable:!0})},r={};t(r,{env:()=>s,step:()=>y});var s={};t(s,{push:()=>b,simulation:()=>h});import{EventEmitter as i}from"events";var o=[],a=null,n=null,l=null,c=null,p=class extends i{streamId;constructor(e){super(),this.streamId=e}getStreamId(){return this.streamId}onConnectionError(e){return o.push({method:"onConnectionError",args:[]}),this.on("error",e),{off:()=>{this.off("error",e)}}}__emitConnectionError(e){this.emit("error",e)}},d=[],u={convertStorageSchemaToProto2Descriptor:(e,t)=>(o.push({method:"adapt.convertStorageSchemaToProto2Descriptor",args:[e,t]}),{name:"root",field:[]})},g=class{constructor(e){o.push({method:"WriterClient.ctor",args:[e]})}async createStreamConnection(e,t){if("DEFAULT"!==e.streamId)throw new Error(`mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(e)}`);o.push({method:"createStreamConnection",args:[e,t]});const r=c;if(null!==r)throw c=null,r;const s=new p(`${e.destinationTable}/streams/_default`);return d.push(s),s}async getWriteStream(e,t){return o.push({method:"getWriteStream",args:[e,t]}),{tableSchema:{fields:[]}}}close(){o.push({method:"WriterClient.close",args:[]})}},m=class{constructor(e){o.push({method:"JSONWriter.ctor",args:[e]})}appendRows(e,t){o.push({method:"appendRows",args:[e,t]});const r=n;if(null!==r)throw n=null,r;const s=a;a=null;const i=l;return l=null,{getResult:async()=>{if(null!==i)throw i;return{appendResult:{offset:{value:"0"}},rowErrors:s??[],writeStream:"projects/p/datasets/d/tables/t/streams/_default"}}}}close(){o.push({method:"JSONWriter.close",args:[]})}};var b={get BigQuery(){return class{calls;options;constructor(e){this.options=e,this.calls=[]}dataset(e){return this.calls.push({method:"dataset",args:[e]}),this}table(e){return this.calls.push({method:"table",args:[e]}),this}async exists(){return this.calls.push({method:"exists",args:[]}),[!0]}async create(e){this.calls.push({method:"create",args:[e]})}async getMetadata(){return this.calls.push({method:"getMetadata",args:[]}),[{}]}}},get WriterClient(){return g},get JSONWriter(){return m},get adapt(){return u}},h=["call:JSONWriter.appendRows"],y={};t(y,{pageView:()=>k,purchase:()=>O});import{getEvent as f}from"@walkeros/core";function v(e){return null==e?null:"object"==typeof e?Array.isArray(e)&&0===e.length?null:Array.isArray(e)||0!==Object.keys(e).length?JSON.stringify(e):null:JSON.stringify(e)}function S(e){return function(e){return{name:e.name,data:v(e.data),context:v(e.context),globals:v(e.globals),custom:v(e.custom),user:v(e.user),nested:v(e.nested),consent:v(e.consent),id:e.id,trigger:e.trigger,entity:e.entity,action:e.action,timestamp:1e3*new Date(e.timestamp).getTime(),timing:e.timing,source:v(e.source)}}(e)}var w=f("page view",{timestamp:1700001100,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server"}}),k={title:"Page view",description:"A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.",in:w,mapping:void 0,out:[["appendRows",[S(w)]]]},j=f("order complete",{timestamp:1700001101,data:{id:"ORD-500",total:199.99,items:[{sku:"SKU-1",qty:2}]},source:{type:"express",platform:"server"}}),O={title:"Purchase",description:"An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().",in:j,mapping:void 0,out:[["appendRows",[S(j)]]]},P={};t(P,{env:()=>A,step:()=>E});var A={};t(A,{push:()=>D,simulation:()=>I});var C=class{constructor(e){this.name=e}name;publishMessage(e){return Promise.resolve("mock-message-id")}resumePublishing(e){}},D={PubSub:class{constructor(e){this.options=e}options;topic(e){return new C(e)}close(){return Promise.resolve()}}},I=["call:PubSub.topic.publishMessage"],E={};t(E,{defaultPush:()=>M,mappedAttributes:()=>Q,mappedData:()=>W,mappedOrderingKey:()=>B,mappedTopic:()=>J,pageView:()=>_});import{getEvent as R}from"@walkeros/core";var T=R("order complete",{timestamp:1700001100,data:{id:"ORD-500",total:199.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server",trace:"1a2b3c4d5e6f70819a2b3c4d5e6f7081",count:1}}),N=R("page view",{timestamp:1700001101,data:{title:"Documentation",url:"https://example.com/docs"},source:{type:"express",platform:"server",trace:"9f8e7d6c5b4a39281706f5e4d3c2b1a0",count:1}});function x(e){const t=e.source.platform??"default",r={...e,source:{...e.source,release:{[t]:"4.7.2"}}};return Buffer.from(JSON.stringify(r))}var M={title:"Default publish",description:"An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.",in:T,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:x(T)}]]},J={title:"Topic override",description:"A mapping rule overrides the destination default topic so order events are published to a dedicated topic.",in:T,mapping:{settings:{topic:"orders"}},out:[["topic","orders",{messageOrdering:!1}],["publishMessage","orders",{data:x(T)}]]},B={title:"Ordering key from user",description:"A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.",in:T,mapping:{settings:{orderingKey:"user.id"}},out:[["topic","events",{messageOrdering:!0}],["publishMessage","events",{data:x(T),orderingKey:"usr-789"}]]},Q={title:"Mapped attributes",description:"A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.",in:T,mapping:{settings:{attributes:{entity:"entity",action:"action"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:x(T),attributes:{entity:"order",action:"complete"}}]]},W={title:"Mapped payload",description:"A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.",in:T,mapping:{data:{map:{order_id:"data.id",revenue:"data.total",currency:"data.currency"}}},out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:Buffer.from(JSON.stringify({order_id:"ORD-500",revenue:199.99,currency:"EUR"}))}]]},_={title:"Page view",description:"A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.",in:N,out:[["topic","events",{messageOrdering:!1}],["publishMessage","events",{data:x(N)}]]};import{zodToSchema as K}from"@walkeros/core/dev";import{z as U}from"@walkeros/core/dev";var q=U.object({client:U.any().describe("Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))").optional(),projectId:U.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),datasetId:U.string().min(1).default("walkerOS").describe("BigQuery dataset ID where events will be stored (like walker_events)"),tableId:U.string().min(1).default("events").describe("BigQuery table ID for event storage (like events)"),location:U.string().default("EU").describe("Geographic location for the BigQuery dataset (like US)"),bigquery:U.any().describe('Additional BigQuery client configuration options (like { keyFilename: "path/to/key.json" })').optional()});import{z as F}from"@walkeros/core/dev";var G=F.object({}),z=K(q),L=K(G);import{zodToSchema as V}from"@walkeros/core/dev";import{z as $}from"@walkeros/core/dev";var X=$.object({client:$.any().describe("Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))").optional(),projectId:$.string().min(1).describe("Google Cloud Project ID (like my-gcp-project)"),topic:$.string().min(1).describe("Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK."),credentials:$.any().describe("Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)").optional(),apiEndpoint:$.string().describe("Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).").optional(),orderingKey:$.any().describe("Mapping value resolved per-event. Truthy enables per-key ordering for the publish.").optional(),attributes:$.any().describe("Default per-event attribute map merged into every published message. Mapping.Map shape.").optional()});import{z as H}from"@walkeros/core/dev";var Y=H.object({topic:H.string().describe("Per-rule topic override. Falls back to settings.topic if absent.").optional(),orderingKey:H.any().describe("Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.").optional(),attributes:H.any().describe("Per-rule attribute Mapping.Map merged on top of settings.attributes.").optional()});import{z as Z}from"@walkeros/core/dev";var ee=Z.object({messageStoragePolicy:Z.object({allowedPersistenceRegions:Z.array(Z.string()).describe("Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).")}).describe("Topic-level message storage policy.").optional(),messageRetentionDuration:Z.object({seconds:Z.number().describe("Retention window in seconds. Default: project default.")}).describe("Topic-level retention configuration.").optional(),kmsKeyName:Z.string().describe("Customer-managed encryption key (CMEK) resource name. Optional.").optional(),labels:Z.record(Z.string(),Z.string()).describe("Topic labels for organization and billing.").optional()}),te=V(X),re=V(Y),se=V(ee),ie={};t(ie,{mapping:()=>L,pubsubMapping:()=>re,pubsubSettings:()=>te,pubsubSetup:()=>se,settings:()=>z});var oe={"auth-methods":{text:'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: "./sa.json" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',code:[{lang:"json",code:'{ "settings": { "projectId": "my-project", "bigquery": { "keyFilename": "./sa.json" } } }'},{lang:"json",code:'{ "settings": { "projectId": "my-project" } }'}]},"storage-format":{text:'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset "walkeros", table "events", location "EU" — all overridable via settings.'},"query-json-columns":{text:"Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.",code:[{lang:"sql",code:"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'"}]},"troubleshoot-empty-table":{text:"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK."}},ae={destinationBigQuery:r,destinationPubSub:P},ne={destinationBigQuery:{settings:z,mapping:L},destinationPubSub:{settings:te,mapping:re,setup:se}};export{r as examples,ae as exportExamples,ne as exportSchemas,oe as hints,P as pubsubExamples,ie as schemas};//# sourceMappingURL=dev.mjs.map
package/dist/dev.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bigquery/examples/index.ts","../src/bigquery/examples/env.ts","../src/bigquery/__mocks__/@google-cloud/bigquery-storage.ts","../src/bigquery/examples/step.ts","../src/bigquery/eventToRow.ts","../src/pubsub/examples/index.ts","../src/pubsub/examples/env.ts","../src/pubsub/examples/step.ts","../src/bigquery/schemas/index.ts","../src/bigquery/schemas/settings.ts","../src/bigquery/schemas/mapping.ts","../src/pubsub/schemas/index.ts","../src/pubsub/schemas/settings.ts","../src/pubsub/schemas/mapping.ts","../src/pubsub/schemas/setup.ts","../src/schemas.ts","../src/hints.ts","../src/dev.ts"],"sourcesContent":["export * as env from './env';\nexport * as step from './step';\n","import type { Env, QueryClient, TableMetadataShape } from '../types';\nimport {\n managedwriter as mockManagedwriter,\n adapt as mockAdapt,\n} from '../__mocks__/@google-cloud/bigquery-storage';\n\n/**\n * Example environment configurations for GCP BigQuery destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual BigQuery SDK dependencies.\n *\n * The Storage Write API mocks (WriterClient, JSONWriter, adapt) are\n * re-exported from the package-local __mocks__ folder so example/test\n * code shares a single source of truth with the jest auto-mock.\n */\n\n/**\n * Mock BigQuery query client: dataset and table provisioning calls resolve as\n * if both already exist.\n */\nfunction createMockBigQuery() {\n return class MockBigQuery implements QueryClient {\n calls: Array<{ method: string; args: unknown[] }>;\n options: unknown;\n\n constructor(options?: unknown) {\n this.options = options;\n this.calls = [];\n }\n\n dataset(datasetId: string) {\n this.calls.push({ method: 'dataset', args: [datasetId] });\n return this;\n }\n\n table(tableId: string) {\n this.calls.push({ method: 'table', args: [tableId] });\n return this;\n }\n\n async exists(): Promise<[boolean]> {\n this.calls.push({ method: 'exists', args: [] });\n return [true];\n }\n\n async create(options: unknown): Promise<void> {\n this.calls.push({ method: 'create', args: [options] });\n }\n\n async getMetadata(): Promise<[TableMetadataShape]> {\n this.calls.push({ method: 'getMetadata', args: [] });\n return [{}];\n }\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing BigQuery Storage Write appends without connecting\n * to actual GCP infrastructure.\n */\nexport const push: Env = {\n get BigQuery() {\n return createMockBigQuery();\n },\n get WriterClient() {\n return mockManagedwriter.WriterClient;\n },\n get JSONWriter() {\n return mockManagedwriter.JSONWriter;\n },\n get adapt() {\n return mockAdapt;\n },\n};\n\n/**\n * Every row goes through the writer's `appendRows`; the writer is built from\n * `JSONWriter` in init, so the path continues on the constructed instance.\n * Constructors are not recorded: their arguments carry credentials.\n */\nexport const simulation = ['call:JSONWriter.appendRows'];\n","import { EventEmitter } from 'events';\n\nconst calls: Array<{ method: string; args: unknown[] }> = [];\n\ninterface MockRowError {\n index: number;\n code: number;\n message: string;\n}\n\nlet nextAppendRowErrors: MockRowError[] | null = null;\nlet nextAppendThrow: unknown = null;\nlet nextGetResultReject: unknown = null;\nlet nextCreateStreamConnectionError: unknown = null;\n\n/**\n * Honest stand-in for the SDK's StreamConnection: a REAL Node EventEmitter so\n * `emit('error', …)` with no listener throws exactly like the real one (Node's\n * special-cased `'error'` event). `onConnectionError` mirrors the SDK surface:\n * it registers an `'error'` listener and returns an `{ off }` disposable.\n */\nclass MockStreamConnection extends EventEmitter {\n private readonly streamId: string;\n constructor(streamId: string) {\n super();\n this.streamId = streamId;\n }\n getStreamId(): string {\n return this.streamId;\n }\n onConnectionError(listener: (err: unknown) => void): { off: () => void } {\n calls.push({ method: 'onConnectionError', args: [] });\n this.on('error', listener);\n return {\n off: () => {\n this.off('error', listener);\n },\n };\n }\n /**\n * Test-only: literally `this.emit('error', err)` with NO internal\n * listener-count guard, so before a listener is attached this reproduces\n * Node's real \"throw if no 'error' listener\" behavior. A fake that silently\n * swallowed would mask the very crash this listener exists to contain.\n */\n __emitConnectionError(err: unknown): void {\n this.emit('error', err);\n }\n}\n\n// The most recently created connection, so tests can emit on it and assert the\n// listener was registered.\nlet lastConnection: MockStreamConnection | null = null;\n\n// Every connection ever created (this reset cycle), so tests can assert that a\n// concurrent re-open did not orphan a connection still carrying an 'error'\n// listener.\nconst allConnections: MockStreamConnection[] = [];\n\nclass MockJSONWriter {\n constructor(_args: { connection: unknown; protoDescriptor: unknown }) {\n calls.push({ method: 'JSONWriter.ctor', args: [_args] });\n }\n appendRows(rows: unknown[], offsetValue?: unknown) {\n calls.push({ method: 'appendRows', args: [rows, offsetValue] });\n const queuedThrow = nextAppendThrow;\n if (queuedThrow !== null) {\n nextAppendThrow = null;\n throw queuedThrow;\n }\n const queuedErrors = nextAppendRowErrors;\n nextAppendRowErrors = null;\n const queuedReject = nextGetResultReject;\n nextGetResultReject = null;\n return {\n getResult: async () => {\n // Models a gRPC deadline-exceeded (or any stream error): the append is\n // accepted but getResult() rejects when the stream's deadline fires.\n if (queuedReject !== null) throw queuedReject;\n return {\n appendResult: { offset: { value: '0' } },\n rowErrors: queuedErrors ?? [],\n writeStream: 'projects/p/datasets/d/tables/t/streams/_default',\n };\n },\n };\n }\n close(): void {\n calls.push({ method: 'JSONWriter.close', args: [] });\n }\n}\n\nclass MockWriterClient {\n constructor(args: {\n projectId?: string;\n keyFilename?: string;\n credentials?: unknown;\n scopes?: string | string[];\n }) {\n calls.push({ method: 'WriterClient.ctor', args: [args] });\n }\n async createStreamConnection(\n args: {\n destinationTable: string;\n streamId: string;\n },\n options?: unknown,\n ) {\n // Match the real SDK: callers must pass streamId=DefaultStream (not streamType)\n // for default-stream use. Passing streamType triggers a CreateWriteStream\n // call with type='DEFAULT', which BQ rejects as TYPE_UNSPECIFIED.\n if (args.streamId !== 'DEFAULT') {\n throw new Error(\n `mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(args)}`,\n );\n }\n // args[1] captures the gax CallOptions (e.g. { timeout }) so tests can\n // assert the request deadline is forwarded to the appendRows stream.\n calls.push({ method: 'createStreamConnection', args: [args, options] });\n const queuedError = nextCreateStreamConnectionError;\n if (queuedError !== null) {\n nextCreateStreamConnectionError = null;\n throw queuedError;\n }\n const connection = new MockStreamConnection(\n `${args.destinationTable}/streams/_default`,\n );\n lastConnection = connection;\n allConnections.push(connection);\n return connection;\n }\n async getWriteStream(\n args: { streamId: string; view?: number },\n options?: unknown,\n ) {\n // args[1] captures the gax CallOptions so tests can assert the deadline\n // is forwarded to the unary schema fetch.\n calls.push({ method: 'getWriteStream', args: [args, options] });\n // Minimal tableSchema shape consumed by adapt.convertStorageSchemaToProto2Descriptor\n return {\n tableSchema: { fields: [] },\n };\n }\n close(): void {\n calls.push({ method: 'WriterClient.close', args: [] });\n }\n}\n\nconst adapt = {\n convertStorageSchemaToProto2Descriptor: (_schema: unknown, _root: string) => {\n calls.push({\n method: 'adapt.convertStorageSchemaToProto2Descriptor',\n args: [_schema, _root],\n });\n return { name: 'root', field: [] };\n },\n};\n\nconst managedwriter = {\n WriterClient: MockWriterClient,\n JSONWriter: MockJSONWriter,\n DefaultStream: 'DEFAULT',\n};\n\nconst protos = {\n google: {\n cloud: {\n bigquery: {\n storage: {\n v1: {\n WriteStreamView: {\n WRITE_STREAM_VIEW_UNSPECIFIED: 0,\n BASIC: 1,\n FULL: 2,\n },\n },\n },\n },\n },\n },\n};\n\n// Test-only helper. Not part of the real SDK.\nfunction __getMockCalls() {\n return calls;\n}\n\nfunction __resetMockCalls() {\n calls.length = 0;\n nextAppendRowErrors = null;\n nextAppendThrow = null;\n nextGetResultReject = null;\n nextCreateStreamConnectionError = null;\n lastConnection = null;\n allConnections.length = 0;\n}\n\n/**\n * Test-only: the most recently created StreamConnection, so a test can emit an\n * out-of-band `'error'` on it (via `__emitConnectionError`) and assert the\n * destination attached a listener.\n */\nfunction __getLastConnection(): MockStreamConnection {\n if (!lastConnection) throw new Error('mock: no StreamConnection created yet');\n return lastConnection;\n}\n\n/**\n * Test-only: every StreamConnection created since the last reset, so a test can\n * assert that a concurrent re-open did not orphan a connection that still\n * carries an 'error' listener (a leak).\n */\nfunction __getAllConnections(): MockStreamConnection[] {\n return allConnections.slice();\n}\n\n/**\n * Test-only: queue rowErrors for the next appendRows().getResult() call.\n * Auto-resets after one use.\n */\nfunction __setNextAppendRowErrors(errors: MockRowError[]): void {\n nextAppendRowErrors = errors;\n}\n\n/**\n * Test-only: make the next appendRows() throw synchronously, simulating a\n * Storage Write API call failure. Auto-resets after one use.\n */\nfunction __setNextAppendThrow(err: unknown): void {\n nextAppendThrow = err;\n}\n\n/**\n * Test-only: make the next appendRows().getResult() reject, simulating a gRPC\n * deadline-exceeded (or any stream error) surfacing through the pending write.\n * Auto-resets after one use.\n */\nfunction __setNextGetResultReject(err: unknown): void {\n nextGetResultReject = err;\n}\n\n/**\n * Test-only: queue an error for the next createStreamConnection() call so\n * tests can simulate openWriter failures (NotFound, INVALID_ARGUMENT, etc.).\n * Auto-resets after one use.\n */\nfunction __setNextOpenWriterError(err: unknown): void {\n nextCreateStreamConnectionError = err;\n}\n\nexport {\n managedwriter,\n adapt,\n protos,\n MockStreamConnection,\n __getMockCalls,\n __resetMockCalls,\n __getLastConnection,\n __getAllConnections,\n __setNextAppendRowErrors,\n __setNextAppendThrow,\n __setNextGetResultReject,\n __setNextOpenWriterError,\n};\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { eventToRow } from '../eventToRow';\n\n/**\n * Mirror of push.ts via eventToRow() -- produces a flat 15-column row\n * with nested object/array values JSON-stringified. Imported directly\n * from the runtime helper so the step examples stay in sync with what\n * push.ts actually emits to JSONWriter.appendRows.\n */\nfunction expectedRow(event: WalkerOS.Event) {\n return eventToRow(event);\n}\n\n/**\n * Page view -- one row appended through JSONWriter.appendRows([row]).\n * Captured as a single intent-level call: ['appendRows', [row]].\n */\nconst pageViewEvent = getEvent('page view', {\n timestamp: 1700001100,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.',\n in: pageViewEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(pageViewEvent)]]],\n};\n\n/**\n * Purchase -- nested array in data.items is JSON.stringified into the\n * data column of the appended row.\n */\nconst purchaseEvent = getEvent('order complete', {\n timestamp: 1700001101,\n data: {\n id: 'ORD-500',\n total: 199.99,\n items: [{ sku: 'SKU-1', qty: 2 }],\n },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const purchase: Flow.StepExample = {\n title: 'Purchase',\n description:\n 'An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().',\n in: purchaseEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(purchaseEvent)]]],\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/** Row shape passed to JSONWriter.appendRows. Values are JSON-serializable scalars or strings. */\nexport interface BigQueryRow {\n [key: string]: string | number | null;\n name: string;\n data: string | null;\n context: string | null;\n globals: string | null;\n custom: string | null;\n user: string | null;\n nested: string | null;\n consent: string | null;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: string | null;\n}\n\nfunction jsonOrNull(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === 'object') {\n if (Array.isArray(value) && value.length === 0) return null;\n if (!Array.isArray(value) && Object.keys(value).length === 0) return null;\n return JSON.stringify(value);\n }\n return JSON.stringify(value);\n}\n\n/** Convert a walkerOS Event v4 into a 15-column BigQuery row in canonical order.\n *\n * Note: BQ Storage Write API encodes TIMESTAMP fields as INT64 microseconds\n * since epoch (the SDK calls Long.fromString on the value). ISO strings fail\n * with \"interior hyphen\" because Long.fromString sees the date hyphens as\n * non-numeric. Pass microseconds directly.\n */\nexport function eventToRow(event: WalkerOS.Event): BigQueryRow {\n return {\n name: event.name,\n data: jsonOrNull(event.data),\n context: jsonOrNull(event.context),\n globals: jsonOrNull(event.globals),\n custom: jsonOrNull(event.custom),\n user: jsonOrNull(event.user),\n nested: jsonOrNull(event.nested),\n consent: jsonOrNull(event.consent),\n id: event.id,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n timestamp: new Date(event.timestamp).getTime() * 1000, // microseconds since epoch\n timing: event.timing,\n source: jsonOrNull(event.source),\n };\n}\n","export * as env from './env';\nexport * as step from './step';\n","import type {\n Env,\n PubSubPublisher,\n PublishMessage,\n TopicPublisher,\n} from '../types';\n\n/**\n * Example environment for the GCP Pub/Sub destination.\n *\n * `push` is the mock env simulate injects: `PubSub` builds a client whose\n * topics answer `publishMessage` locally, so nothing reaches GCP. Unit tests\n * still substitute the SDK module-wide via `jest.mock('@google-cloud/pubsub')`.\n */\n\nclass MockTopic implements TopicPublisher {\n constructor(public name: string) {}\n publishMessage(_message: PublishMessage): Promise<string> {\n return Promise.resolve('mock-message-id');\n }\n resumePublishing(_orderingKey: string): void {}\n}\n\nclass MockPubSub implements PubSubPublisher {\n constructor(public options?: object) {}\n topic(name: string): TopicPublisher {\n return new MockTopic(name);\n }\n close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const push: Env = {\n PubSub: MockPubSub,\n};\n\n/** The publish carries the request; `args[0]` is the message. */\nexport const simulation = ['call:PubSub.topic.publishMessage'];\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\n// Build-time version define. The upstream collector stamps source.release with\n// this on push, so the expected payload must mirror it rather than a literal,\n// else it breaks whenever the fixed version group is bumped (release).\ndeclare const __VERSION__: string;\n\n/**\n * Pub/Sub step examples. Each example's `out` is the array of recorded mock\n * calls produced by `push()`. The recording shape is:\n * ['topic', topicName, topicOptions] // implicit topic-handle creation\n * ['publishMessage', topicName, messageOptions]\n * ['resumePublishing', topicName, orderingKey] // only on publish failure\n */\n\n// Events reaching a server destination arrive already enriched by the upstream\n// collector, so they carry the run trace and per-run count. The collector\n// preserves these (stamp-if-absent), keeping the example deterministic.\nconst orderEvent = getEvent('order complete', {\n timestamp: 1700001100,\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n user: { id: 'usr-789' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '1a2b3c4d5e6f70819a2b3c4d5e6f7081',\n count: 1,\n },\n});\n\nconst pageEvent = getEvent('page view', {\n timestamp: 1700001101,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '9f8e7d6c5b4a39281706f5e4d3c2b1a0',\n count: 1,\n },\n});\n\nfunction expectedPayload(event: WalkerOS.Event): Buffer {\n // The harness pushes the event through an unconfigured collector, which stamps\n // source.release = { [name ?? platform ?? 'default']: __VERSION__ }. With no\n // collector name, the key is the event's platform. Mirror that here so the\n // expected message body matches the published (post-collector) event.\n const releaseKey = event.source.platform ?? 'default';\n const stamped = {\n ...event,\n source: { ...event.source, release: { [releaseKey]: __VERSION__ } },\n };\n return Buffer.from(JSON.stringify(stamped));\n}\n\n/**\n * Default publish, no mapping. Settings.topic = 'events'. The destination\n * constructs a topic handle inline with messageOrdering=false (no ordering\n * key resolved) and publishes the full event JSON as the message body.\n */\nexport const defaultPush: Flow.StepExample = {\n title: 'Default publish',\n description:\n 'An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.',\n in: orderEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule topic override. Mapping carries `settings.topic = 'orders'`\n * which routes this rule to a dedicated topic.\n */\nexport const mappedTopic: Flow.StepExample = {\n title: 'Topic override',\n description:\n 'A mapping rule overrides the destination default topic so order events are published to a dedicated topic.',\n in: orderEvent,\n mapping: {\n settings: {\n topic: 'orders',\n },\n },\n out: [\n ['topic', 'orders', { messageOrdering: false }],\n ['publishMessage', 'orders', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule ordering key resolved from the event. `mapping.orderingKey =\n * 'user.id'` is a Mapping.Value that resolves to the event's user.id. The\n * topic handle is constructed with messageOrdering=true and the publish\n * carries the resolved orderingKey.\n */\nexport const mappedOrderingKey: Flow.StepExample = {\n title: 'Ordering key from user',\n description:\n 'A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.',\n in: orderEvent,\n mapping: {\n settings: {\n orderingKey: 'user.id',\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: true }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n orderingKey: 'usr-789',\n },\n ],\n ],\n};\n\n/**\n * Per-rule attributes. `mapping.attributes = { entity: 'entity', action:\n * 'action' }` is a Mapping.Map resolved per event. Each value is a path\n * resolved against the event.\n */\nexport const mappedAttributes: Flow.StepExample = {\n title: 'Mapped attributes',\n description:\n 'A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.',\n in: orderEvent,\n mapping: {\n settings: {\n attributes: {\n entity: 'entity',\n action: 'action',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n attributes: { entity: 'order', action: 'complete' },\n },\n ],\n ],\n};\n\n/**\n * Mapped data. `mapping.data` rewrites the publish body. The rewritten\n * object replaces the event as the message data.\n */\nexport const mappedData: Flow.StepExample = {\n title: 'Mapped payload',\n description:\n 'A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.',\n in: orderEvent,\n mapping: {\n data: {\n map: {\n order_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n // Mapped-data publish: the body is the mapping result (no event\n // envelope, so no source.release), emitted verbatim.\n data: Buffer.from(\n JSON.stringify({\n order_id: 'ORD-500',\n revenue: 199.99,\n currency: 'EUR',\n }),\n ),\n },\n ],\n ],\n};\n\n/**\n * Page view, no rule. Verifies free-form publish on a non-ordered topic\n * for an event with no special mapping.\n */\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.',\n in: pageEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(pageEvent) }],\n ],\n};\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n datasetId: z\n .string()\n .min(1)\n .default('walkerOS')\n .describe(\n 'BigQuery dataset ID where events will be stored (like walker_events)',\n ),\n tableId: z\n .string()\n .min(1)\n .default('events')\n .describe('BigQuery table ID for event storage (like events)'),\n location: z\n .string()\n .default('EU')\n .describe('Geographic location for the BigQuery dataset (like US)'),\n bigquery: z\n .any()\n .describe(\n 'Additional BigQuery client configuration options (like { keyFilename: \"path/to/key.json\" })',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP BigQuery Mapping Schema\n * BigQuery has no event-level mapping configuration\n */\nexport const MappingSchema = z.object({});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n topic: z\n .string()\n .min(1)\n .describe(\n 'Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK.',\n ),\n credentials: z\n .any()\n .describe(\n 'Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)',\n )\n .optional(),\n apiEndpoint: z\n .string()\n .describe(\n 'Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Mapping value resolved per-event. Truthy enables per-key ordering for the publish.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Default per-event attribute map merged into every published message. Mapping.Map shape.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Mapping Schema\n *\n * Per-rule overrides for topic, orderingKey, and attributes.\n */\nexport const MappingSchema = z.object({\n topic: z\n .string()\n .describe(\n 'Per-rule topic override. Falls back to settings.topic if absent.',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Per-rule attribute Mapping.Map merged on top of settings.attributes.',\n )\n .optional(),\n});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Setup Schema\n *\n * Provisioning options for `walkeros setup destination.<id>`. Idempotent topic\n * creation. Subscription provisioning is owned by the source side.\n */\nexport const SetupSchema = z.object({\n messageStoragePolicy: z\n .object({\n allowedPersistenceRegions: z\n .array(z.string())\n .describe(\n 'Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).',\n ),\n })\n .describe('Topic-level message storage policy.')\n .optional(),\n messageRetentionDuration: z\n .object({\n seconds: z\n .number()\n .describe('Retention window in seconds. Default: project default.'),\n })\n .describe('Topic-level retention configuration.')\n .optional(),\n kmsKeyName: z\n .string()\n .describe('Customer-managed encryption key (CMEK) resource name. Optional.')\n .optional(),\n labels: z\n .record(z.string(), z.string())\n .describe('Topic labels for organization and billing.')\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","// Browser-safe schema-only exports\n// This file exports ONLY schemas without any Node.js dependencies\nexport { settings, mapping } from './bigquery/schemas';\nexport {\n settings as pubsubSettings,\n mapping as pubsubMapping,\n setup as pubsubSetup,\n} from './pubsub/schemas';\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'auth-methods': {\n text: 'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: \"./sa.json\" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\", \"bigquery\": { \"keyFilename\": \"./sa.json\" } } }',\n },\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\" } }',\n },\n ],\n },\n 'storage-format': {\n text: 'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset \"walkeros\", table \"events\", location \"EU\" — all overridable via settings.',\n },\n 'query-json-columns': {\n text: 'Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.',\n code: [\n {\n lang: 'sql',\n code: \"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'\",\n },\n ],\n },\n 'troubleshoot-empty-table': {\n text: \"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK.\",\n },\n};\n","import * as bigqueryExamplesNs from './bigquery/examples';\nimport * as pubsubExamplesNs from './pubsub/examples';\nimport * as bigquerySchemasNs from './bigquery/schemas';\nimport * as pubsubSchemasNs from './pubsub/schemas';\n\nexport * as schemas from './schemas';\nexport * as examples from './bigquery/examples';\nexport * as pubsubExamples from './pubsub/examples';\nexport { hints } from './hints';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n destinationBigQuery: bigqueryExamplesNs,\n destinationPubSub: pubsubExamplesNs,\n};\n\n/** Schemas per export, keyed by the export names in package.json. */\nexport const exportSchemas = {\n destinationBigQuery: {\n settings: bigquerySchemasNs.settings,\n mapping: bigquerySchemasNs.mapping,\n },\n destinationPubSub: {\n settings: pubsubSchemasNs.settings,\n mapping: pubsubSchemasNs.mapping,\n setup: pubsubSchemasNs.setup,\n },\n};\n"],"mappings":"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","names":["examples_exports","env_exports","step_exports","env_exports","push","simulation","step_exports","pageView","getEvent","z","zodToSchema","z","SettingsSchema","z","MappingSchema","z","settings","zodToSchema","SettingsSchema","mapping","MappingSchema","mapping","settings","examples_exports","settings","mapping"]}
1
+ {"version":3,"sources":["../src/bigquery/examples/index.ts","../src/bigquery/examples/env.ts","../src/bigquery/__mocks__/@google-cloud/bigquery-storage.ts","../src/bigquery/examples/step.ts","../src/bigquery/eventToRow.ts","../src/pubsub/examples/index.ts","../src/pubsub/examples/env.ts","../src/pubsub/examples/step.ts","../src/bigquery/schemas/index.ts","../src/bigquery/schemas/settings.ts","../src/bigquery/schemas/mapping.ts","../src/pubsub/schemas/index.ts","../src/pubsub/schemas/settings.ts","../src/pubsub/schemas/mapping.ts","../src/pubsub/schemas/setup.ts","../src/schemas.ts","../src/hints.ts","../src/dev.ts"],"sourcesContent":["export * as env from './env';\nexport * as step from './step';\n","import type { Env, QueryClient, TableMetadataShape } from '../types';\nimport {\n managedwriter as mockManagedwriter,\n adapt as mockAdapt,\n} from '../__mocks__/@google-cloud/bigquery-storage';\n\n/**\n * Example environment configurations for GCP BigQuery destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual BigQuery SDK dependencies.\n *\n * The Storage Write API mocks (WriterClient, JSONWriter, adapt) are\n * re-exported from the package-local __mocks__ folder so example/test\n * code shares a single source of truth with the jest auto-mock.\n */\n\n/**\n * Mock BigQuery query client: dataset and table provisioning calls resolve as\n * if both already exist.\n */\nfunction createMockBigQuery() {\n return class MockBigQuery implements QueryClient {\n calls: Array<{ method: string; args: unknown[] }>;\n options: unknown;\n\n constructor(options?: unknown) {\n this.options = options;\n this.calls = [];\n }\n\n dataset(datasetId: string) {\n this.calls.push({ method: 'dataset', args: [datasetId] });\n return this;\n }\n\n table(tableId: string) {\n this.calls.push({ method: 'table', args: [tableId] });\n return this;\n }\n\n async exists(): Promise<[boolean]> {\n this.calls.push({ method: 'exists', args: [] });\n return [true];\n }\n\n async create(options: unknown): Promise<void> {\n this.calls.push({ method: 'create', args: [options] });\n }\n\n async getMetadata(): Promise<[TableMetadataShape]> {\n this.calls.push({ method: 'getMetadata', args: [] });\n return [{}];\n }\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing BigQuery Storage Write appends without connecting\n * to actual GCP infrastructure.\n */\nexport const push: Env = {\n get BigQuery() {\n return createMockBigQuery();\n },\n get WriterClient() {\n return mockManagedwriter.WriterClient;\n },\n get JSONWriter() {\n return mockManagedwriter.JSONWriter;\n },\n get adapt() {\n return mockAdapt;\n },\n};\n\n/**\n * Every row goes through the writer's `appendRows`; the writer is built from\n * `JSONWriter` in init, so the path continues on the constructed instance.\n * Constructors are not recorded: their arguments carry credentials.\n */\nexport const simulation = ['call:JSONWriter.appendRows'];\n","import { EventEmitter } from 'events';\n\nconst calls: Array<{ method: string; args: unknown[] }> = [];\n\ninterface MockRowError {\n index: number;\n code: number;\n message: string;\n}\n\nlet nextAppendRowErrors: MockRowError[] | null = null;\nlet nextAppendThrow: unknown = null;\nlet nextGetResultReject: unknown = null;\nlet nextCreateStreamConnectionError: unknown = null;\n\n/**\n * Honest stand-in for the SDK's StreamConnection: a REAL Node EventEmitter so\n * `emit('error', …)` with no listener throws exactly like the real one (Node's\n * special-cased `'error'` event). `onConnectionError` mirrors the SDK surface:\n * it registers an `'error'` listener and returns an `{ off }` disposable.\n */\nclass MockStreamConnection extends EventEmitter {\n private readonly streamId: string;\n constructor(streamId: string) {\n super();\n this.streamId = streamId;\n }\n getStreamId(): string {\n return this.streamId;\n }\n onConnectionError(listener: (err: unknown) => void): { off: () => void } {\n calls.push({ method: 'onConnectionError', args: [] });\n this.on('error', listener);\n return {\n off: () => {\n this.off('error', listener);\n },\n };\n }\n /**\n * Test-only: literally `this.emit('error', err)` with NO internal\n * listener-count guard, so before a listener is attached this reproduces\n * Node's real \"throw if no 'error' listener\" behavior. A fake that silently\n * swallowed would mask the very crash this listener exists to contain.\n */\n __emitConnectionError(err: unknown): void {\n this.emit('error', err);\n }\n}\n\n// The most recently created connection, so tests can emit on it and assert the\n// listener was registered.\nlet lastConnection: MockStreamConnection | null = null;\n\n// Every connection ever created (this reset cycle), so tests can assert that a\n// concurrent re-open did not orphan a connection still carrying an 'error'\n// listener.\nconst allConnections: MockStreamConnection[] = [];\n\nclass MockJSONWriter {\n constructor(_args: { connection: unknown; protoDescriptor: unknown }) {\n calls.push({ method: 'JSONWriter.ctor', args: [_args] });\n }\n appendRows(rows: unknown[], offsetValue?: unknown) {\n calls.push({ method: 'appendRows', args: [rows, offsetValue] });\n const queuedThrow = nextAppendThrow;\n if (queuedThrow !== null) {\n nextAppendThrow = null;\n throw queuedThrow;\n }\n const queuedErrors = nextAppendRowErrors;\n nextAppendRowErrors = null;\n const queuedReject = nextGetResultReject;\n nextGetResultReject = null;\n return {\n getResult: async () => {\n // Models a gRPC deadline-exceeded (or any stream error): the append is\n // accepted but getResult() rejects when the stream's deadline fires.\n if (queuedReject !== null) throw queuedReject;\n return {\n appendResult: { offset: { value: '0' } },\n rowErrors: queuedErrors ?? [],\n writeStream: 'projects/p/datasets/d/tables/t/streams/_default',\n };\n },\n };\n }\n close(): void {\n calls.push({ method: 'JSONWriter.close', args: [] });\n }\n}\n\nclass MockWriterClient {\n constructor(args: {\n projectId?: string;\n keyFilename?: string;\n credentials?: unknown;\n scopes?: string | string[];\n }) {\n calls.push({ method: 'WriterClient.ctor', args: [args] });\n }\n async createStreamConnection(\n args: {\n destinationTable: string;\n streamId: string;\n },\n options?: unknown,\n ) {\n // Match the real SDK: callers must pass streamId=DefaultStream (not streamType)\n // for default-stream use. Passing streamType triggers a CreateWriteStream\n // call with type='DEFAULT', which BQ rejects as TYPE_UNSPECIFIED.\n if (args.streamId !== 'DEFAULT') {\n throw new Error(\n `mock createStreamConnection: expected streamId='DEFAULT', got ${JSON.stringify(args)}`,\n );\n }\n // args[1] captures the gax CallOptions (e.g. { timeout }) so tests can\n // assert the request deadline is forwarded to the appendRows stream.\n calls.push({ method: 'createStreamConnection', args: [args, options] });\n const queuedError = nextCreateStreamConnectionError;\n if (queuedError !== null) {\n nextCreateStreamConnectionError = null;\n throw queuedError;\n }\n const connection = new MockStreamConnection(\n `${args.destinationTable}/streams/_default`,\n );\n lastConnection = connection;\n allConnections.push(connection);\n return connection;\n }\n async getWriteStream(\n args: { streamId: string; view?: number },\n options?: unknown,\n ) {\n // args[1] captures the gax CallOptions so tests can assert the deadline\n // is forwarded to the unary schema fetch.\n calls.push({ method: 'getWriteStream', args: [args, options] });\n // Minimal tableSchema shape consumed by adapt.convertStorageSchemaToProto2Descriptor\n return {\n tableSchema: { fields: [] },\n };\n }\n close(): void {\n calls.push({ method: 'WriterClient.close', args: [] });\n }\n}\n\nconst adapt = {\n convertStorageSchemaToProto2Descriptor: (_schema: unknown, _root: string) => {\n calls.push({\n method: 'adapt.convertStorageSchemaToProto2Descriptor',\n args: [_schema, _root],\n });\n return { name: 'root', field: [] };\n },\n};\n\nconst managedwriter = {\n WriterClient: MockWriterClient,\n JSONWriter: MockJSONWriter,\n DefaultStream: 'DEFAULT',\n};\n\nconst protos = {\n google: {\n cloud: {\n bigquery: {\n storage: {\n v1: {\n WriteStreamView: {\n WRITE_STREAM_VIEW_UNSPECIFIED: 0,\n BASIC: 1,\n FULL: 2,\n },\n },\n },\n },\n },\n },\n};\n\n// Test-only helper. Not part of the real SDK.\nfunction __getMockCalls() {\n return calls;\n}\n\nfunction __resetMockCalls() {\n calls.length = 0;\n nextAppendRowErrors = null;\n nextAppendThrow = null;\n nextGetResultReject = null;\n nextCreateStreamConnectionError = null;\n lastConnection = null;\n allConnections.length = 0;\n}\n\n/**\n * Test-only: the most recently created StreamConnection, so a test can emit an\n * out-of-band `'error'` on it (via `__emitConnectionError`) and assert the\n * destination attached a listener.\n */\nfunction __getLastConnection(): MockStreamConnection {\n if (!lastConnection) throw new Error('mock: no StreamConnection created yet');\n return lastConnection;\n}\n\n/**\n * Test-only: every StreamConnection created since the last reset, so a test can\n * assert that a concurrent re-open did not orphan a connection that still\n * carries an 'error' listener (a leak).\n */\nfunction __getAllConnections(): MockStreamConnection[] {\n return allConnections.slice();\n}\n\n/**\n * Test-only: queue rowErrors for the next appendRows().getResult() call.\n * Auto-resets after one use.\n */\nfunction __setNextAppendRowErrors(errors: MockRowError[]): void {\n nextAppendRowErrors = errors;\n}\n\n/**\n * Test-only: make the next appendRows() throw synchronously, simulating a\n * Storage Write API call failure. Auto-resets after one use.\n */\nfunction __setNextAppendThrow(err: unknown): void {\n nextAppendThrow = err;\n}\n\n/**\n * Test-only: make the next appendRows().getResult() reject, simulating a gRPC\n * deadline-exceeded (or any stream error) surfacing through the pending write.\n * Auto-resets after one use.\n */\nfunction __setNextGetResultReject(err: unknown): void {\n nextGetResultReject = err;\n}\n\n/**\n * Test-only: queue an error for the next createStreamConnection() call so\n * tests can simulate openWriter failures (NotFound, INVALID_ARGUMENT, etc.).\n * Auto-resets after one use.\n */\nfunction __setNextOpenWriterError(err: unknown): void {\n nextCreateStreamConnectionError = err;\n}\n\nexport {\n managedwriter,\n adapt,\n protos,\n MockStreamConnection,\n __getMockCalls,\n __resetMockCalls,\n __getLastConnection,\n __getAllConnections,\n __setNextAppendRowErrors,\n __setNextAppendThrow,\n __setNextGetResultReject,\n __setNextOpenWriterError,\n};\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { eventToRow } from '../eventToRow';\n\n/**\n * Mirror of push.ts via eventToRow() -- produces a flat 15-column row\n * with nested object/array values JSON-stringified. Imported directly\n * from the runtime helper so the step examples stay in sync with what\n * push.ts actually emits to JSONWriter.appendRows.\n */\nfunction expectedRow(event: WalkerOS.Event) {\n return eventToRow(event);\n}\n\n/**\n * Page view -- one row appended through JSONWriter.appendRows([row]).\n * Captured as a single intent-level call: ['appendRows', [row]].\n */\nconst pageViewEvent = getEvent('page view', {\n timestamp: 1700001100,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is appended as one row through the BigQuery Storage Write API JSONWriter. Nested objects/arrays in data, source, etc. are JSON-stringified by eventToRow.',\n in: pageViewEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(pageViewEvent)]]],\n};\n\n/**\n * Purchase -- nested array in data.items is JSON.stringified into the\n * data column of the appended row.\n */\nconst purchaseEvent = getEvent('order complete', {\n timestamp: 1700001101,\n data: {\n id: 'ORD-500',\n total: 199.99,\n items: [{ sku: 'SKU-1', qty: 2 }],\n },\n source: { type: 'express', platform: 'server' },\n});\n\nexport const purchase: Flow.StepExample = {\n title: 'Purchase',\n description:\n 'An order event is appended as a single row through JSONWriter.appendRows. The entire nested data object (including arrays like items) is JSON-stringified into the data column via eventToRow().',\n in: purchaseEvent,\n mapping: undefined,\n out: [['appendRows', [expectedRow(purchaseEvent)]]],\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/** Row shape passed to JSONWriter.appendRows. Values are JSON-serializable scalars or strings. */\nexport interface BigQueryRow {\n [key: string]: string | number | null;\n name: string;\n data: string | null;\n context: string | null;\n globals: string | null;\n custom: string | null;\n user: string | null;\n nested: string | null;\n consent: string | null;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: string | null;\n}\n\nfunction jsonOrNull(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === 'object') {\n if (Array.isArray(value) && value.length === 0) return null;\n if (!Array.isArray(value) && Object.keys(value).length === 0) return null;\n return JSON.stringify(value);\n }\n return JSON.stringify(value);\n}\n\n/** Convert a walkerOS Event v4 into a 15-column BigQuery row in canonical order.\n *\n * Note: BQ Storage Write API encodes TIMESTAMP fields as INT64 microseconds\n * since epoch (the SDK calls Long.fromString on the value). ISO strings fail\n * with \"interior hyphen\" because Long.fromString sees the date hyphens as\n * non-numeric. Pass microseconds directly.\n */\nexport function eventToRow(event: WalkerOS.Event): BigQueryRow {\n return {\n name: event.name,\n data: jsonOrNull(event.data),\n context: jsonOrNull(event.context),\n globals: jsonOrNull(event.globals),\n custom: jsonOrNull(event.custom),\n user: jsonOrNull(event.user),\n nested: jsonOrNull(event.nested),\n consent: jsonOrNull(event.consent),\n id: event.id,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n timestamp: new Date(event.timestamp).getTime() * 1000, // microseconds since epoch\n timing: event.timing,\n source: jsonOrNull(event.source),\n };\n}\n","export * as env from './env';\nexport * as step from './step';\n","import type {\n Env,\n PubSubPublisher,\n PublishMessage,\n TopicPublisher,\n} from '../types';\n\n/**\n * Example environment for the GCP Pub/Sub destination.\n *\n * `push` is the mock env simulate injects: `PubSub` builds a client whose\n * topics answer `publishMessage` locally, so nothing reaches GCP. Unit tests\n * still substitute the SDK module-wide via `jest.mock('@google-cloud/pubsub')`.\n */\n\nclass MockTopic implements TopicPublisher {\n constructor(public name: string) {}\n publishMessage(_message: PublishMessage): Promise<string> {\n return Promise.resolve('mock-message-id');\n }\n resumePublishing(_orderingKey: string): void {}\n}\n\nclass MockPubSub implements PubSubPublisher {\n constructor(public options?: object) {}\n topic(name: string): TopicPublisher {\n return new MockTopic(name);\n }\n close(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport const push: Env = {\n PubSub: MockPubSub,\n};\n\n/** The publish carries the request; `args[0]` is the message. */\nexport const simulation = ['call:PubSub.topic.publishMessage'];\n","import type { Flow, WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\n// Build-time version define. The upstream collector stamps source.release with\n// this on push, so the expected payload must mirror it rather than a literal,\n// else it breaks whenever the fixed version group is bumped (release).\ndeclare const __VERSION__: string;\n\n/**\n * Pub/Sub step examples. Each example's `out` is the array of recorded mock\n * calls produced by `push()`. The recording shape is:\n * ['topic', topicName, topicOptions] // implicit topic-handle creation\n * ['publishMessage', topicName, messageOptions]\n * ['resumePublishing', topicName, orderingKey] // only on publish failure\n */\n\n// Events reaching a server destination arrive already enriched by the upstream\n// collector, so they carry the run trace and per-run count. The collector\n// preserves these (stamp-if-absent), keeping the example deterministic.\nconst orderEvent = getEvent('order complete', {\n timestamp: 1700001100,\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n user: { id: 'usr-789' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '1a2b3c4d5e6f70819a2b3c4d5e6f7081',\n count: 1,\n },\n});\n\nconst pageEvent = getEvent('page view', {\n timestamp: 1700001101,\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n source: {\n type: 'express',\n platform: 'server',\n trace: '9f8e7d6c5b4a39281706f5e4d3c2b1a0',\n count: 1,\n },\n});\n\nfunction expectedPayload(event: WalkerOS.Event): Buffer {\n // The harness pushes the event through an unconfigured collector, which stamps\n // source.release = { [name ?? platform ?? 'default']: __VERSION__ }. With no\n // collector name, the key is the event's platform. Mirror that here so the\n // expected message body matches the published (post-collector) event.\n const releaseKey = event.source.platform ?? 'default';\n const stamped = {\n ...event,\n source: { ...event.source, release: { [releaseKey]: __VERSION__ } },\n };\n return Buffer.from(JSON.stringify(stamped));\n}\n\n/**\n * Default publish, no mapping. Settings.topic = 'events'. The destination\n * constructs a topic handle inline with messageOrdering=false (no ordering\n * key resolved) and publishes the full event JSON as the message body.\n */\nexport const defaultPush: Flow.StepExample = {\n title: 'Default publish',\n description:\n 'An event is published to the configured Pub/Sub topic with the full JSON event as the message body and no ordering key.',\n in: orderEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule topic override. Mapping carries `settings.topic = 'orders'`\n * which routes this rule to a dedicated topic.\n */\nexport const mappedTopic: Flow.StepExample = {\n title: 'Topic override',\n description:\n 'A mapping rule overrides the destination default topic so order events are published to a dedicated topic.',\n in: orderEvent,\n mapping: {\n settings: {\n topic: 'orders',\n },\n },\n out: [\n ['topic', 'orders', { messageOrdering: false }],\n ['publishMessage', 'orders', { data: expectedPayload(orderEvent) }],\n ],\n};\n\n/**\n * Per-rule ordering key resolved from the event. `mapping.orderingKey =\n * 'user.id'` is a Mapping.Value that resolves to the event's user.id. The\n * topic handle is constructed with messageOrdering=true and the publish\n * carries the resolved orderingKey.\n */\nexport const mappedOrderingKey: Flow.StepExample = {\n title: 'Ordering key from user',\n description:\n 'A mapping resolves the ordering key from event.user.id, enabling per-user ordering for this publish.',\n in: orderEvent,\n mapping: {\n settings: {\n orderingKey: 'user.id',\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: true }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n orderingKey: 'usr-789',\n },\n ],\n ],\n};\n\n/**\n * Per-rule attributes. `mapping.attributes = { entity: 'entity', action:\n * 'action' }` is a Mapping.Map resolved per event. Each value is a path\n * resolved against the event.\n */\nexport const mappedAttributes: Flow.StepExample = {\n title: 'Mapped attributes',\n description:\n 'A mapping resolves a per-event attribute map, here exposing entity and action as Pub/Sub attributes for routing in subscribers.',\n in: orderEvent,\n mapping: {\n settings: {\n attributes: {\n entity: 'entity',\n action: 'action',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n data: expectedPayload(orderEvent),\n attributes: { entity: 'order', action: 'complete' },\n },\n ],\n ],\n};\n\n/**\n * Mapped data. `mapping.data` rewrites the publish body. The rewritten\n * object replaces the event as the message data.\n */\nexport const mappedData: Flow.StepExample = {\n title: 'Mapped payload',\n description:\n 'A data mapping transforms the event payload before publish. The rewritten object becomes the Pub/Sub message body.',\n in: orderEvent,\n mapping: {\n data: {\n map: {\n order_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n ['topic', 'events', { messageOrdering: false }],\n [\n 'publishMessage',\n 'events',\n {\n // Mapped-data publish: the body is the mapping result (no event\n // envelope, so no source.release), emitted verbatim.\n data: Buffer.from(\n JSON.stringify({\n order_id: 'ORD-500',\n revenue: 199.99,\n currency: 'EUR',\n }),\n ),\n },\n ],\n ],\n};\n\n/**\n * Page view, no rule. Verifies free-form publish on a non-ordered topic\n * for an event with no special mapping.\n */\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view is published to the default topic with no ordering key, demonstrating the simplest publish path.',\n in: pageEvent,\n out: [\n ['topic', 'events', { messageOrdering: false }],\n ['publishMessage', 'events', { data: expectedPayload(pageEvent) }],\n ],\n};\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud BigQuery client instance (like new BigQuery({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n datasetId: z\n .string()\n .min(1)\n .default('walkerOS')\n .describe(\n 'BigQuery dataset ID where events will be stored (like walker_events)',\n ),\n tableId: z\n .string()\n .min(1)\n .default('events')\n .describe('BigQuery table ID for event storage (like events)'),\n location: z\n .string()\n .default('EU')\n .describe('Geographic location for the BigQuery dataset (like US)'),\n bigquery: z\n .any()\n .describe(\n 'Additional BigQuery client configuration options (like { keyFilename: \"path/to/key.json\" })',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP BigQuery Mapping Schema\n * BigQuery has no event-level mapping configuration\n */\nexport const MappingSchema = z.object({});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n client: z\n .any()\n .describe(\n 'Google Cloud Pub/Sub client instance (like new PubSub({ projectId, keyFilename }))',\n )\n .optional(),\n projectId: z\n .string()\n .min(1)\n .describe('Google Cloud Project ID (like my-gcp-project)'),\n topic: z\n .string()\n .min(1)\n .describe(\n 'Pub/Sub topic short name (like events). The full resource name projects/<projectId>/topics/<topic> is built by the SDK.',\n ),\n credentials: z\n .any()\n .describe(\n 'Service account credentials as a JSON string or an object with client_email and private_key. Default: Application Default Credentials (ADC). (deprecated: use config.credentials)',\n )\n .optional(),\n apiEndpoint: z\n .string()\n .describe(\n 'Override Pub/Sub API endpoint. Useful for the local emulator (like localhost:8085).',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Mapping value resolved per-event. Truthy enables per-key ordering for the publish.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Default per-event attribute map merged into every published message. Mapping.Map shape.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Mapping Schema\n *\n * Per-rule overrides for topic, orderingKey, and attributes.\n */\nexport const MappingSchema = z.object({\n topic: z\n .string()\n .describe(\n 'Per-rule topic override. Falls back to settings.topic if absent.',\n )\n .optional(),\n orderingKey: z\n .any()\n .describe(\n 'Per-rule ordering-key Mapping.Value. Overrides settings.orderingKey when set.',\n )\n .optional(),\n attributes: z\n .any()\n .describe(\n 'Per-rule attribute Mapping.Map merged on top of settings.attributes.',\n )\n .optional(),\n});\n\n/**\n * Type inference from MappingSchema\n */\nexport type Mapping = z.infer<typeof MappingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * GCP Pub/Sub Setup Schema\n *\n * Provisioning options for `walkeros setup destination.<id>`. Idempotent topic\n * creation. Subscription provisioning is owned by the source side.\n */\nexport const SetupSchema = z.object({\n messageStoragePolicy: z\n .object({\n allowedPersistenceRegions: z\n .array(z.string())\n .describe(\n 'Geographic regions for at-rest message storage. Default: EU multi-region (eu-west1, eu-west3, eu-west4).',\n ),\n })\n .describe('Topic-level message storage policy.')\n .optional(),\n messageRetentionDuration: z\n .object({\n seconds: z\n .number()\n .describe('Retention window in seconds. Default: project default.'),\n })\n .describe('Topic-level retention configuration.')\n .optional(),\n kmsKeyName: z\n .string()\n .describe('Customer-managed encryption key (CMEK) resource name. Optional.')\n .optional(),\n labels: z\n .record(z.string(), z.string())\n .describe('Topic labels for organization and billing.')\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","// Browser-safe schema-only exports\n// This file exports ONLY schemas without any Node.js dependencies\nexport { settings, mapping } from './bigquery/schemas';\nexport {\n settings as pubsubSettings,\n mapping as pubsubMapping,\n setup as pubsubSetup,\n} from './pubsub/schemas';\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'auth-methods': {\n text: 'Supports three auth methods: SA key file via bigquery options ({ bigquery: { keyFilename: \"./sa.json\" } }), Application Default Credentials (automatic on GCP infrastructure — just provide projectId), or a pre-configured BigQuery client instance (client option). See settings schema for all options.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\", \"bigquery\": { \"keyFilename\": \"./sa.json\" } } }',\n },\n {\n lang: 'json',\n code: '{ \"settings\": { \"projectId\": \"my-project\" } }',\n },\n ],\n },\n 'storage-format': {\n text: 'All events are stored in a single table. Scalar fields (strings, numbers, booleans) are stored as-is. Nested objects and arrays are JSON-stringified automatically. Defaults: dataset \"walkeros\", table \"events\", location \"EU\" — all overridable via settings.',\n },\n 'query-json-columns': {\n text: 'Nested event fields (data, context, globals, user) are stored as JSON strings. Use BigQuery JSON_EXTRACT_SCALAR to query them. Field paths follow the walkerOS event structure.',\n code: [\n {\n lang: 'sql',\n code: \"SELECT JSON_EXTRACT_SCALAR(data, '$.total') AS total FROM `project.walkeros.events` WHERE entity = 'order'\",\n },\n ],\n },\n 'troubleshoot-empty-table': {\n text: \"Events not appearing? Common causes: projectId doesn't match GCP project, dataset doesn't exist yet (create via BigQuery console or bq CLI before first push), or SA key lacks bigquery.dataEditor role. The destination validates client/datasetId/tableId at push time but GCP permission errors surface from the BigQuery SDK.\",\n },\n};\n","import * as bigqueryExamplesNs from './bigquery/examples';\nimport * as pubsubExamplesNs from './pubsub/examples';\nimport * as bigquerySchemasNs from './bigquery/schemas';\nimport * as pubsubSchemasNs from './pubsub/schemas';\n\nexport * as schemas from './schemas';\nexport * as examples from './bigquery/examples';\nexport * as pubsubExamples from './pubsub/examples';\nexport { hints } from './hints';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n destinationBigQuery: bigqueryExamplesNs,\n destinationPubSub: pubsubExamplesNs,\n};\n\n/** Schemas per export, keyed by the export names in package.json. */\nexport const exportSchemas = {\n destinationBigQuery: {\n settings: bigquerySchemasNs.settings,\n mapping: bigquerySchemasNs.mapping,\n },\n destinationPubSub: {\n settings: pubsubSchemasNs.settings,\n mapping: pubsubSchemasNs.mapping,\n setup: pubsubSchemasNs.setup,\n },\n};\n"],"mappings":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,oBAAoB;AAE7B,IAAM,QAAoD,CAAC;AAQ3D,IAAI,sBAA6C;AACjD,IAAI,kBAA2B;AAC/B,IAAI,sBAA+B;AACnC,IAAI,kCAA2C;AAQ/C,IAAM,uBAAN,cAAmC,aAAa;AAAA,EAC7B;AAAA,EACjB,YAAY,UAAkB;AAC5B,UAAM;AACN,SAAK,WAAW;AAAA,EAClB;AAAA,EACA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,kBAAkB,UAAuD;AACvE,UAAM,KAAK,EAAE,QAAQ,qBAAqB,MAAM,CAAC,EAAE,CAAC;AACpD,SAAK,GAAG,SAAS,QAAQ;AACzB,WAAO;AAAA,MACL,KAAK,MAAM;AACT,aAAK,IAAI,SAAS,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,KAAoB;AACxC,SAAK,KAAK,SAAS,GAAG;AAAA,EACxB;AACF;AAIA,IAAI,iBAA8C;AAKlD,IAAM,iBAAyC,CAAC;AAEhD,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAY,OAA0D;AACpE,UAAM,KAAK,EAAE,QAAQ,mBAAmB,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,EACzD;AAAA,EACA,WAAW,MAAiB,aAAuB;AACjD,UAAM,KAAK,EAAE,QAAQ,cAAc,MAAM,CAAC,MAAM,WAAW,EAAE,CAAC;AAC9D,UAAM,cAAc;AACpB,QAAI,gBAAgB,MAAM;AACxB,wBAAkB;AAClB,YAAM;AAAA,IACR;AACA,UAAM,eAAe;AACrB,0BAAsB;AACtB,UAAM,eAAe;AACrB,0BAAsB;AACtB,WAAO;AAAA,MACL,WAAW,YAAY;AAGrB,YAAI,iBAAiB,KAAM,OAAM;AACjC,eAAO;AAAA,UACL,cAAc,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE;AAAA,UACvC,WAAW,gBAAgB,CAAC;AAAA,UAC5B,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAc;AACZ,UAAM,KAAK,EAAE,QAAQ,oBAAoB,MAAM,CAAC,EAAE,CAAC;AAAA,EACrD;AACF;AAEA,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAAY,MAKT;AACD,UAAM,KAAK,EAAE,QAAQ,qBAAqB,MAAM,CAAC,IAAI,EAAE,CAAC;AAAA,EAC1D;AAAA,EACA,MAAM,uBACJ,MAIA,SACA;AAIA,QAAI,KAAK,aAAa,WAAW;AAC/B,YAAM,IAAI;AAAA,QACR,iEAAiE,KAAK,UAAU,IAAI,CAAC;AAAA,MACvF;AAAA,IACF;AAGA,UAAM,KAAK,EAAE,QAAQ,0BAA0B,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC;AACtE,UAAM,cAAc;AACpB,QAAI,gBAAgB,MAAM;AACxB,wCAAkC;AAClC,YAAM;AAAA,IACR;AACA,UAAM,aAAa,IAAI;AAAA,MACrB,GAAG,KAAK,gBAAgB;AAAA,IAC1B;AACA,qBAAiB;AACjB,mBAAe,KAAK,UAAU;AAC9B,WAAO;AAAA,EACT;AAAA,EACA,MAAM,eACJ,MACA,SACA;AAGA,UAAM,KAAK,EAAE,QAAQ,kBAAkB,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC;AAE9D,WAAO;AAAA,MACL,aAAa,EAAE,QAAQ,CAAC,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,QAAc;AACZ,UAAM,KAAK,EAAE,QAAQ,sBAAsB,MAAM,CAAC,EAAE,CAAC;AAAA,EACvD;AACF;AAEA,IAAM,QAAQ;AAAA,EACZ,wCAAwC,CAAC,SAAkB,UAAkB;AAC3E,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,MAAM,CAAC,SAAS,KAAK;AAAA,IACvB,CAAC;AACD,WAAO,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE;AAAA,EACnC;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AACjB;;;AD7IA,SAAS,qBAAqB;AAC5B,SAAO,MAAM,aAAoC;AAAA,IAC/C;AAAA,IACA;AAAA,IAEA,YAAY,SAAmB;AAC7B,WAAK,UAAU;AACf,WAAK,QAAQ,CAAC;AAAA,IAChB;AAAA,IAEA,QAAQ,WAAmB;AACzB,WAAK,MAAM,KAAK,EAAE,QAAQ,WAAW,MAAM,CAAC,SAAS,EAAE,CAAC;AACxD,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,SAAiB;AACrB,WAAK,MAAM,KAAK,EAAE,QAAQ,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC;AACpD,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,SAA6B;AACjC,WAAK,MAAM,KAAK,EAAE,QAAQ,UAAU,MAAM,CAAC,EAAE,CAAC;AAC9C,aAAO,CAAC,IAAI;AAAA,IACd;AAAA,IAEA,MAAM,OAAO,SAAiC;AAC5C,WAAK,MAAM,KAAK,EAAE,QAAQ,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC;AAAA,IACvD;AAAA,IAEA,MAAM,cAA6C;AACjD,WAAK,MAAM,KAAK,EAAE,QAAQ,eAAe,MAAM,CAAC,EAAE,CAAC;AACnD,aAAO,CAAC,CAAC,CAAC;AAAA,IACZ;AAAA,EACF;AACF;AAQO,IAAM,OAAY;AAAA,EACvB,IAAI,WAAW;AACb,WAAO,mBAAmB;AAAA,EAC5B;AAAA,EACA,IAAI,eAAe;AACjB,WAAO,cAAkB;AAAA,EAC3B;AAAA,EACA,IAAI,aAAa;AACf,WAAO,cAAkB;AAAA,EAC3B;AAAA,EACA,IAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACF;AAOO,IAAM,aAAa,CAAC,4BAA4B;;;AEnFvD;AAAA;AAAA;AAAA;AAAA;AACA,SAAS,gBAAgB;;;ACqBzB,SAAS,WAAW,OAA+B;AACjD,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACvD,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO;AACrE,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACA,SAAO,KAAK,UAAU,KAAK;AAC7B;AASO,SAAS,WAAW,OAAoC;AAC7D,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,MAAM,WAAW,MAAM,IAAI;AAAA,IAC3B,SAAS,WAAW,MAAM,OAAO;AAAA,IACjC,SAAS,WAAW,MAAM,OAAO;AAAA,IACjC,QAAQ,WAAW,MAAM,MAAM;AAAA,IAC/B,MAAM,WAAW,MAAM,IAAI;AAAA,IAC3B,QAAQ,WAAW,MAAM,MAAM;AAAA,IAC/B,SAAS,WAAW,MAAM,OAAO;AAAA,IACjC,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,WAAW,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,IACjD,QAAQ,MAAM;AAAA,IACd,QAAQ,WAAW,MAAM,MAAM;AAAA,EACjC;AACF;;;AD/CA,SAAS,YAAY,OAAuB;AAC1C,SAAO,WAAW,KAAK;AACzB;AAMA,IAAM,gBAAgB,SAAS,aAAa;AAAA,EAC1C,WAAW;AAAA,EACX,MAAM,EAAE,OAAO,iBAAiB,KAAK,2BAA2B;AAAA,EAChE,QAAQ,EAAE,MAAM,WAAW,UAAU,SAAS;AAChD,CAAC;AAEM,IAAM,WAA6B;AAAA,EACxC,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC;AACpD;AAMA,IAAM,gBAAgB,SAAS,kBAAkB;AAAA,EAC/C,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;AAAA,EAClC;AAAA,EACA,QAAQ,EAAE,MAAM,WAAW,UAAU,SAAS;AAChD,CAAC;AAEM,IAAM,WAA6B;AAAA,EACxC,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC;AACpD;;;AEtDA,IAAAA,oBAAA;AAAA,SAAAA,mBAAA;AAAA,aAAAC;AAAA,EAAA,YAAAC;AAAA;;;ACAA,IAAAC,eAAA;AAAA,SAAAA,cAAA;AAAA,cAAAC;AAAA,EAAA,kBAAAC;AAAA;AAeA,IAAM,YAAN,MAA0C;AAAA,EACxC,YAAmB,MAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EACnB,eAAe,UAA2C;AACxD,WAAO,QAAQ,QAAQ,iBAAiB;AAAA,EAC1C;AAAA,EACA,iBAAiB,cAA4B;AAAA,EAAC;AAChD;AAEA,IAAM,aAAN,MAA4C;AAAA,EAC1C,YAAmB,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EACnB,MAAM,MAA8B;AAClC,WAAO,IAAI,UAAU,IAAI;AAAA,EAC3B;AAAA,EACA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAEO,IAAMD,QAAY;AAAA,EACvB,QAAQ;AACV;AAGO,IAAMC,cAAa,CAAC,kCAAkC;;;ACtC7D,IAAAC,gBAAA;AAAA,SAAAA,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAAC;AAAA;AACA,SAAS,YAAAC,iBAAgB;AAkBzB,IAAM,aAAaA,UAAS,kBAAkB;AAAA,EAC5C,WAAW;AAAA,EACX,MAAM,EAAE,IAAI,WAAW,OAAO,QAAQ,UAAU,MAAM;AAAA,EACtD,MAAM,EAAE,IAAI,UAAU;AAAA,EACtB,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,YAAYA,UAAS,aAAa;AAAA,EACtC,WAAW;AAAA,EACX,MAAM,EAAE,OAAO,iBAAiB,KAAK,2BAA2B;AAAA,EAChE,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF,CAAC;AAED,SAAS,gBAAgB,OAA+B;AAKtD,QAAM,aAAa,MAAM,OAAO,YAAY;AAC5C,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,SAAS,EAAE,CAAC,UAAU,GAAG,QAAY,EAAE;AAAA,EACpE;AACA,SAAO,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAC5C;AAOO,IAAM,cAAgC;AAAA,EAC3C,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAC9C,CAAC,kBAAkB,UAAU,EAAE,MAAM,gBAAgB,UAAU,EAAE,CAAC;AAAA,EACpE;AACF;AAMO,IAAM,cAAgC;AAAA,EAC3C,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,IACP,UAAU;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAC9C,CAAC,kBAAkB,UAAU,EAAE,MAAM,gBAAgB,UAAU,EAAE,CAAC;AAAA,EACpE;AACF;AAQO,IAAM,oBAAsC;AAAA,EACjD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,IACP,UAAU;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,KAAK,CAAC;AAAA,IAC7C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,gBAAgB,UAAU;AAAA,QAChC,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAOO,IAAM,mBAAqC;AAAA,EAChD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,IACP,UAAU;AAAA,MACR,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAC9C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,gBAAgB,UAAU;AAAA,QAChC,YAAY,EAAE,QAAQ,SAAS,QAAQ,WAAW;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,aAA+B;AAAA,EAC1C,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,KAAK;AAAA,QACH,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAC9C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA,QAGE,MAAM,OAAO;AAAA,UACX,KAAK,UAAU;AAAA,YACb,UAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAMD,YAA6B;AAAA,EACxC,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,EACJ,KAAK;AAAA,IACH,CAAC,SAAS,UAAU,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAC9C,CAAC,kBAAkB,UAAU,EAAE,MAAM,gBAAgB,SAAS,EAAE,CAAC;AAAA,EACnE;AACF;;;AC1MA,SAAS,mBAAmB;;;ACA5B,SAAS,SAAS;AAEX,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,QAAQ,EACL,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,WAAW,EACR,OAAO,EACP,IAAI,CAAC,EACL,SAAS,+CAA+C;AAAA,EAC3D,WAAW,EACR,OAAO,EACP,IAAI,CAAC,EACL,QAAQ,UAAU,EAClB;AAAA,IACC;AAAA,EACF;AAAA,EACF,SAAS,EACN,OAAO,EACP,IAAI,CAAC,EACL,QAAQ,QAAQ,EAChB,SAAS,mDAAmD;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,QAAQ,IAAI,EACZ,SAAS,wDAAwD;AAAA,EACpE,UAAU,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;ACnCD,SAAS,KAAAE,UAAS;AAMX,IAAM,gBAAgBA,GAAE,OAAO,CAAC,CAAC;;;AFEjC,IAAM,WAAW,YAAY,cAAc;AAC3C,IAAM,UAAU,YAAY,aAAa;;;AGThD,SAAS,eAAAC,oBAAmB;;;ACA5B,SAAS,KAAAC,UAAS;AAEX,IAAMC,kBAAiBD,GAAE,OAAO;AAAA,EACrC,QAAQA,GACL,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,WAAWA,GACR,OAAO,EACP,IAAI,CAAC,EACL,SAAS,+CAA+C;AAAA,EAC3D,OAAOA,GACJ,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,aAAaA,GACV,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAaA,GACV,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAaA,GACV,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,YAAYA,GACT,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;AC3CD,SAAS,KAAAE,UAAS;AAOX,IAAMC,iBAAgBD,GAAE,OAAO;AAAA,EACpC,OAAOA,GACJ,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAaA,GACV,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,YAAYA,GACT,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;AC1BD,SAAS,KAAAE,UAAS;AAQX,IAAM,cAAcA,GAAE,OAAO;AAAA,EAClC,sBAAsBA,GACnB,OAAO;AAAA,IACN,2BAA2BA,GACxB,MAAMA,GAAE,OAAO,CAAC,EAChB;AAAA,MACC;AAAA,IACF;AAAA,EACJ,CAAC,EACA,SAAS,qCAAqC,EAC9C,SAAS;AAAA,EACZ,0BAA0BA,GACvB,OAAO;AAAA,IACN,SAASA,GACN,OAAO,EACP,SAAS,wDAAwD;AAAA,EACtE,CAAC,EACA,SAAS,sCAAsC,EAC/C,SAAS;AAAA,EACZ,YAAYA,GACT,OAAO,EACP,SAAS,iEAAiE,EAC1E,SAAS;AAAA,EACZ,QAAQA,GACL,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAC7B,SAAS,4CAA4C,EACrD,SAAS;AACd,CAAC;;;AHzBM,IAAMC,YAAWC,aAAYC,eAAc;AAC3C,IAAMC,WAAUF,aAAYG,cAAa;AACzC,IAAM,QAAQH,aAAY,WAAW;;;AIZ5C;AAAA;AAAA;AAAA,uBAAAI;AAAA,EAAA,sBAAAC;AAAA,EAAA;AAAA;AAAA;;;ACEO,IAAM,QAAoB;AAAA,EAC/B,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,EACR;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,4BAA4B;AAAA,IAC1B,MAAM;AAAA,EACR;AACF;;;ACpBO,IAAM,iBAAiB;AAAA,EAC5B,qBAAqB;AAAA,EACrB,mBAAmBC;AACrB;AAGO,IAAM,gBAAgB;AAAA,EAC3B,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,UAA0BC;AAAA,IAC1B,SAAyBC;AAAA,IACzB;AAAA,EACF;AACF;","names":["examples_exports","env_exports","step_exports","env_exports","push","simulation","step_exports","pageView","getEvent","z","zodToSchema","z","SettingsSchema","z","MappingSchema","z","settings","zodToSchema","SettingsSchema","mapping","MappingSchema","mapping","settings","examples_exports","settings","mapping"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-destination-gcp",
4
- "version": "4.7.2-next-1791147139360",
4
+ "version": "4.7.2",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "server"
@@ -227,7 +227,7 @@
227
227
  "consent": {
228
228
  "functional": true
229
229
  },
230
- "id": "ff865801bd6f9278",
230
+ "id": "4b5dcb3afb99877a",
231
231
  "trigger": "load",
232
232
  "entity": "page",
233
233
  "action": "view",
@@ -253,7 +253,7 @@
253
253
  "user": "{\"id\":\"us3r\",\"device\":\"c00k13\",\"session\":\"s3ss10n\"}",
254
254
  "nested": "[{\"entity\":\"child\",\"data\":{\"is\":\"subordinated\"}}]",
255
255
  "consent": "{\"functional\":true}",
256
- "id": "ff865801bd6f9278",
256
+ "id": "4b5dcb3afb99877a",
257
257
  "trigger": "load",
258
258
  "entity": "page",
259
259
  "action": "view",
@@ -348,7 +348,7 @@
348
348
  "consent": {
349
349
  "functional": true
350
350
  },
351
- "id": "2d69b38231c919ee",
351
+ "id": "1b88c3b6b207824d",
352
352
  "trigger": "load",
353
353
  "entity": "order",
354
354
  "action": "complete",
@@ -374,7 +374,7 @@
374
374
  "user": "{\"id\":\"us3r\",\"device\":\"c00k13\",\"session\":\"s3ss10n\"}",
375
375
  "nested": "[{\"entity\":\"product\",\"data\":{\"id\":\"ers\",\"name\":\"Everyday Ruck Snack\",\"color\":\"black\",\"size\":\"l\",\"price\":420},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]},{\"entity\":\"product\",\"data\":{\"id\":\"cc\",\"name\":\"Cool Cap\",\"size\":\"one size\",\"price\":42},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]},{\"entity\":\"gift\",\"data\":{\"name\":\"Surprise\"},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]}]",
376
376
  "consent": "{\"functional\":true}",
377
- "id": "2d69b38231c919ee",
377
+ "id": "1b88c3b6b207824d",
378
378
  "trigger": "load",
379
379
  "entity": "order",
380
380
  "action": "complete",
@@ -449,7 +449,7 @@
449
449
  "consent": {
450
450
  "functional": true
451
451
  },
452
- "id": "ff865801bd6f9278",
452
+ "id": "4b5dcb3afb99877a",
453
453
  "trigger": "load",
454
454
  "entity": "page",
455
455
  "action": "view",
@@ -475,7 +475,7 @@
475
475
  "user": "{\"id\":\"us3r\",\"device\":\"c00k13\",\"session\":\"s3ss10n\"}",
476
476
  "nested": "[{\"entity\":\"child\",\"data\":{\"is\":\"subordinated\"}}]",
477
477
  "consent": "{\"functional\":true}",
478
- "id": "ff865801bd6f9278",
478
+ "id": "4b5dcb3afb99877a",
479
479
  "trigger": "load",
480
480
  "entity": "page",
481
481
  "action": "view",
@@ -570,7 +570,7 @@
570
570
  "consent": {
571
571
  "functional": true
572
572
  },
573
- "id": "2d69b38231c919ee",
573
+ "id": "1b88c3b6b207824d",
574
574
  "trigger": "load",
575
575
  "entity": "order",
576
576
  "action": "complete",
@@ -596,7 +596,7 @@
596
596
  "user": "{\"id\":\"us3r\",\"device\":\"c00k13\",\"session\":\"s3ss10n\"}",
597
597
  "nested": "[{\"entity\":\"product\",\"data\":{\"id\":\"ers\",\"name\":\"Everyday Ruck Snack\",\"color\":\"black\",\"size\":\"l\",\"price\":420},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]},{\"entity\":\"product\",\"data\":{\"id\":\"cc\",\"name\":\"Cool Cap\",\"size\":\"one size\",\"price\":42},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]},{\"entity\":\"gift\",\"data\":{\"name\":\"Surprise\"},\"context\":{\"shopping\":[\"complete\",0]},\"nested\":[]}]",
598
598
  "consent": "{\"functional\":true}",
599
- "id": "2d69b38231c919ee",
599
+ "id": "1b88c3b6b207824d",
600
600
  "trigger": "load",
601
601
  "entity": "order",
602
602
  "action": "complete",
@@ -698,7 +698,7 @@
698
698
  "consent": {
699
699
  "functional": true
700
700
  },
701
- "id": "83e96f5543f4f06e",
701
+ "id": "7d3a4095e418188c",
702
702
  "trigger": "load",
703
703
  "entity": "order",
704
704
  "action": "complete",
@@ -1369,22 +1369,22 @@
1369
1369
  "642": 34,
1370
1370
  "643": 58,
1371
1371
  "644": 34,
1372
- "645": 56,
1373
- "646": 51,
1374
- "647": 101,
1375
- "648": 57,
1376
- "649": 54,
1377
- "650": 102,
1378
- "651": 53,
1372
+ "645": 55,
1373
+ "646": 100,
1374
+ "647": 51,
1375
+ "648": 97,
1376
+ "649": 52,
1377
+ "650": 48,
1378
+ "651": 57,
1379
1379
  "652": 53,
1380
- "653": 52,
1381
- "654": 51,
1382
- "655": 102,
1383
- "656": 52,
1384
- "657": 102,
1385
- "658": 48,
1386
- "659": 54,
1387
- "660": 101,
1380
+ "653": 101,
1381
+ "654": 52,
1382
+ "655": 49,
1383
+ "656": 56,
1384
+ "657": 49,
1385
+ "658": 56,
1386
+ "659": 56,
1387
+ "660": 99,
1388
1388
  "661": 34,
1389
1389
  "662": 44,
1390
1390
  "663": 34,
@@ -1604,29 +1604,10 @@
1604
1604
  "877": 55,
1605
1605
  "878": 46,
1606
1606
  "879": 50,
1607
- "880": 45,
1608
- "881": 110,
1609
- "882": 101,
1610
- "883": 120,
1611
- "884": 116,
1612
- "885": 45,
1613
- "886": 49,
1614
- "887": 55,
1615
- "888": 57,
1616
- "889": 49,
1617
- "890": 49,
1618
- "891": 52,
1619
- "892": 55,
1620
- "893": 49,
1621
- "894": 51,
1622
- "895": 57,
1623
- "896": 51,
1624
- "897": 54,
1625
- "898": 48,
1626
- "899": 34,
1627
- "900": 125,
1628
- "901": 125,
1629
- "902": 125
1607
+ "880": 34,
1608
+ "881": 125,
1609
+ "882": 125,
1610
+ "883": 125
1630
1611
  }
1631
1612
  }
1632
1613
  ]
@@ -1708,7 +1689,7 @@
1708
1689
  "consent": {
1709
1690
  "functional": true
1710
1691
  },
1711
- "id": "83e96f5543f4f06e",
1692
+ "id": "7d3a4095e418188c",
1712
1693
  "trigger": "load",
1713
1694
  "entity": "order",
1714
1695
  "action": "complete",
@@ -2387,22 +2368,22 @@
2387
2368
  "642": 34,
2388
2369
  "643": 58,
2389
2370
  "644": 34,
2390
- "645": 56,
2391
- "646": 51,
2392
- "647": 101,
2393
- "648": 57,
2394
- "649": 54,
2395
- "650": 102,
2396
- "651": 53,
2371
+ "645": 55,
2372
+ "646": 100,
2373
+ "647": 51,
2374
+ "648": 97,
2375
+ "649": 52,
2376
+ "650": 48,
2377
+ "651": 57,
2397
2378
  "652": 53,
2398
- "653": 52,
2399
- "654": 51,
2400
- "655": 102,
2401
- "656": 52,
2402
- "657": 102,
2403
- "658": 48,
2404
- "659": 54,
2405
- "660": 101,
2379
+ "653": 101,
2380
+ "654": 52,
2381
+ "655": 49,
2382
+ "656": 56,
2383
+ "657": 49,
2384
+ "658": 56,
2385
+ "659": 56,
2386
+ "660": 99,
2406
2387
  "661": 34,
2407
2388
  "662": 44,
2408
2389
  "663": 34,
@@ -2622,29 +2603,10 @@
2622
2603
  "877": 55,
2623
2604
  "878": 46,
2624
2605
  "879": 50,
2625
- "880": 45,
2626
- "881": 110,
2627
- "882": 101,
2628
- "883": 120,
2629
- "884": 116,
2630
- "885": 45,
2631
- "886": 49,
2632
- "887": 55,
2633
- "888": 57,
2634
- "889": 49,
2635
- "890": 49,
2636
- "891": 52,
2637
- "892": 55,
2638
- "893": 49,
2639
- "894": 51,
2640
- "895": 57,
2641
- "896": 51,
2642
- "897": 54,
2643
- "898": 48,
2644
- "899": 34,
2645
- "900": 125,
2646
- "901": 125,
2647
- "902": 125
2606
+ "880": 34,
2607
+ "881": 125,
2608
+ "882": 125,
2609
+ "883": 125
2648
2610
  },
2649
2611
  "attributes": {
2650
2612
  "entity": "order",
@@ -2730,7 +2692,7 @@
2730
2692
  "consent": {
2731
2693
  "functional": true
2732
2694
  },
2733
- "id": "83e96f5543f4f06e",
2695
+ "id": "7d3a4095e418188c",
2734
2696
  "trigger": "load",
2735
2697
  "entity": "order",
2736
2698
  "action": "complete",
@@ -2902,7 +2864,7 @@
2902
2864
  "consent": {
2903
2865
  "functional": true
2904
2866
  },
2905
- "id": "83e96f5543f4f06e",
2867
+ "id": "7d3a4095e418188c",
2906
2868
  "trigger": "load",
2907
2869
  "entity": "order",
2908
2870
  "action": "complete",
@@ -3578,22 +3540,22 @@
3578
3540
  "642": 34,
3579
3541
  "643": 58,
3580
3542
  "644": 34,
3581
- "645": 56,
3582
- "646": 51,
3583
- "647": 101,
3584
- "648": 57,
3585
- "649": 54,
3586
- "650": 102,
3587
- "651": 53,
3543
+ "645": 55,
3544
+ "646": 100,
3545
+ "647": 51,
3546
+ "648": 97,
3547
+ "649": 52,
3548
+ "650": 48,
3549
+ "651": 57,
3588
3550
  "652": 53,
3589
- "653": 52,
3590
- "654": 51,
3591
- "655": 102,
3592
- "656": 52,
3593
- "657": 102,
3594
- "658": 48,
3595
- "659": 54,
3596
- "660": 101,
3551
+ "653": 101,
3552
+ "654": 52,
3553
+ "655": 49,
3554
+ "656": 56,
3555
+ "657": 49,
3556
+ "658": 56,
3557
+ "659": 56,
3558
+ "660": 99,
3597
3559
  "661": 34,
3598
3560
  "662": 44,
3599
3561
  "663": 34,
@@ -3813,29 +3775,10 @@
3813
3775
  "877": 55,
3814
3776
  "878": 46,
3815
3777
  "879": 50,
3816
- "880": 45,
3817
- "881": 110,
3818
- "882": 101,
3819
- "883": 120,
3820
- "884": 116,
3821
- "885": 45,
3822
- "886": 49,
3823
- "887": 55,
3824
- "888": 57,
3825
- "889": 49,
3826
- "890": 49,
3827
- "891": 52,
3828
- "892": 55,
3829
- "893": 49,
3830
- "894": 51,
3831
- "895": 57,
3832
- "896": 51,
3833
- "897": 54,
3834
- "898": 48,
3835
- "899": 34,
3836
- "900": 125,
3837
- "901": 125,
3838
- "902": 125
3778
+ "880": 34,
3779
+ "881": 125,
3780
+ "882": 125,
3781
+ "883": 125
3839
3782
  },
3840
3783
  "orderingKey": "usr-789"
3841
3784
  }
@@ -3918,7 +3861,7 @@
3918
3861
  "consent": {
3919
3862
  "functional": true
3920
3863
  },
3921
- "id": "83e96f5543f4f06e",
3864
+ "id": "7d3a4095e418188c",
3922
3865
  "trigger": "load",
3923
3866
  "entity": "order",
3924
3867
  "action": "complete",
@@ -4594,22 +4537,22 @@
4594
4537
  "642": 34,
4595
4538
  "643": 58,
4596
4539
  "644": 34,
4597
- "645": 56,
4598
- "646": 51,
4599
- "647": 101,
4600
- "648": 57,
4601
- "649": 54,
4602
- "650": 102,
4603
- "651": 53,
4540
+ "645": 55,
4541
+ "646": 100,
4542
+ "647": 51,
4543
+ "648": 97,
4544
+ "649": 52,
4545
+ "650": 48,
4546
+ "651": 57,
4604
4547
  "652": 53,
4605
- "653": 52,
4606
- "654": 51,
4607
- "655": 102,
4608
- "656": 52,
4609
- "657": 102,
4610
- "658": 48,
4611
- "659": 54,
4612
- "660": 101,
4548
+ "653": 101,
4549
+ "654": 52,
4550
+ "655": 49,
4551
+ "656": 56,
4552
+ "657": 49,
4553
+ "658": 56,
4554
+ "659": 56,
4555
+ "660": 99,
4613
4556
  "661": 34,
4614
4557
  "662": 44,
4615
4558
  "663": 34,
@@ -4829,29 +4772,10 @@
4829
4772
  "877": 55,
4830
4773
  "878": 46,
4831
4774
  "879": 50,
4832
- "880": 45,
4833
- "881": 110,
4834
- "882": 101,
4835
- "883": 120,
4836
- "884": 116,
4837
- "885": 45,
4838
- "886": 49,
4839
- "887": 55,
4840
- "888": 57,
4841
- "889": 49,
4842
- "890": 49,
4843
- "891": 52,
4844
- "892": 55,
4845
- "893": 49,
4846
- "894": 51,
4847
- "895": 57,
4848
- "896": 51,
4849
- "897": 54,
4850
- "898": 48,
4851
- "899": 34,
4852
- "900": 125,
4853
- "901": 125,
4854
- "902": 125
4775
+ "880": 34,
4776
+ "881": 125,
4777
+ "882": 125,
4778
+ "883": 125
4855
4779
  }
4856
4780
  }
4857
4781
  ]
@@ -4894,7 +4818,7 @@
4894
4818
  "consent": {
4895
4819
  "functional": true
4896
4820
  },
4897
- "id": "fca4a8334a4962f8",
4821
+ "id": "2d4370d2a79bb601",
4898
4822
  "trigger": "load",
4899
4823
  "entity": "page",
4900
4824
  "action": "view",
@@ -5253,22 +5177,22 @@
5253
5177
  "330": 34,
5254
5178
  "331": 58,
5255
5179
  "332": 34,
5256
- "333": 102,
5257
- "334": 99,
5258
- "335": 97,
5259
- "336": 52,
5260
- "337": 97,
5261
- "338": 56,
5262
- "339": 51,
5263
- "340": 51,
5264
- "341": 52,
5265
- "342": 97,
5266
- "343": 52,
5267
- "344": 57,
5268
- "345": 54,
5269
- "346": 50,
5270
- "347": 102,
5271
- "348": 56,
5180
+ "333": 50,
5181
+ "334": 100,
5182
+ "335": 52,
5183
+ "336": 51,
5184
+ "337": 55,
5185
+ "338": 48,
5186
+ "339": 100,
5187
+ "340": 50,
5188
+ "341": 97,
5189
+ "342": 55,
5190
+ "343": 57,
5191
+ "344": 98,
5192
+ "345": 98,
5193
+ "346": 54,
5194
+ "347": 48,
5195
+ "348": 49,
5272
5196
  "349": 34,
5273
5197
  "350": 44,
5274
5198
  "351": 34,
@@ -5483,29 +5407,10 @@
5483
5407
  "560": 55,
5484
5408
  "561": 46,
5485
5409
  "562": 50,
5486
- "563": 45,
5487
- "564": 110,
5488
- "565": 101,
5489
- "566": 120,
5490
- "567": 116,
5491
- "568": 45,
5492
- "569": 49,
5493
- "570": 55,
5494
- "571": 57,
5495
- "572": 49,
5496
- "573": 49,
5497
- "574": 52,
5498
- "575": 55,
5499
- "576": 49,
5500
- "577": 51,
5501
- "578": 57,
5502
- "579": 51,
5503
- "580": 54,
5504
- "581": 48,
5505
- "582": 34,
5506
- "583": 125,
5507
- "584": 125,
5508
- "585": 125
5410
+ "563": 34,
5411
+ "564": 125,
5412
+ "565": 125,
5413
+ "566": 125
5509
5414
  }
5510
5415
  }
5511
5416
  ]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-destination-gcp",
3
3
  "description": "Google Cloud Platform server destinations for walkerOS (BigQuery, Pub/Sub)",
4
- "version": "4.7.2-next-1791147139360",
4
+ "version": "4.7.2",
5
5
  "license": "MIT",
6
6
  "exports": {
7
7
  ".": {
@@ -33,11 +33,11 @@
33
33
  "@google-cloud/bigquery": "^8.1.1",
34
34
  "@google-cloud/bigquery-storage": "^5.1.0",
35
35
  "@google-cloud/pubsub": "^5.3.0",
36
- "@walkeros/core": "4.7.2-next-1791147139360",
37
- "@walkeros/server-core": "4.7.2-next-1791147139360"
36
+ "@walkeros/core": "4.7.2",
37
+ "@walkeros/server-core": "4.7.2"
38
38
  },
39
39
  "devDependencies": {
40
- "@walkeros/collector": "4.7.2-next-1791147139360"
40
+ "@walkeros/collector": "4.7.2"
41
41
  },
42
42
  "repository": {
43
43
  "url": "git+https://github.com/elbwalker/walkerOS.git",